Custom JSON-Schema keywords for Ajv validator
* - keywords that modify data
npm install ajv-keywords
To add all available keywords:
var Ajv = require('ajv');
var ajv = new Ajv;
require('ajv-keywords')(ajv);
ajv.validate({ instanceof: 'RegExp' }, /.*/); // true
ajv.validate({ instanceof: 'RegExp' }, '.*'); // false
To add a single keyword:
require('ajv-keywords')(ajv, 'instanceof');
To add multiple keywords:
require('ajv-keywords')(ajv, ['typeof', 'instanceof']);
To add a single keyword in browser (to avoid adding unused code):
require('ajv-keywords/keywords/instanceof')(ajv);
Based on JavaScript typeof
operation.
The value of the keyword should be a string ("undefined"
, "string"
, "number"
, "object"
, "function"
, "boolean"
or "symbol"
) or array of strings.
To pass validation the result of typeof
operation on the value should be equal to the string (or one of the strings in the array).
ajv.validate({ typeof: 'undefined' }, undefined); // true
ajv.validate({ typeof: 'undefined' }, null); // false
ajv.validate({ typeof: ['undefined', 'object'] }, null); // true
Based on JavaScript instanceof
operation.
The value of the keyword should be a string ("Object"
, "Array"
, "Function"
, "Number"
, "String"
, "Date"
, "RegExp"
, "Promise"
or "Buffer"
) or array of strings.
To pass validation the result of data instanceof ...
operation on the value should be true:
ajv.validate({ instanceof: 'Array' }, []); // true
ajv.validate({ instanceof: 'Array' }, {}); // false
ajv.validate({ instanceof: ['Array', 'Function'] }, function(){}); // true
You can add your own constructor function to be recognised by this keyword:
function MyClass() {}
var instanceofDefinition = require('ajv-keywords').get('instanceof').definition;
// or require('ajv-keywords/keywords/instanceof').definition;
instanceofDefinition.CONSTRUCTORS.MyClass = MyClass;
ajv.validate({ instanceof: 'MyClass' }, new MyClass); // true
Syntax sugar for the combination of minimum and maximum keywords, also fails schema compilation if there are no numbers in the range.
The value of this keyword must be the array consisting of two numbers, the second must be greater or equal than the first one.
If the validated value is not a number the validation passes, otherwise to pass validation the value should be greater (or equal) than the first number and smaller (or equal) than the second number in the array. If exclusiveRange
keyword is present in the same schema and its value is true, the validated value must not be equal to the range boundaries.
var schema = { range: [1, 3] };
ajv.validate(schema, 1); // true
ajv.validate(schema, 2); // true
ajv.validate(schema, 3); // true
ajv.validate(schema, 0.99); // false
ajv.validate(schema, 3.01); // false
var schema = { range: [1, 3], exclusiveRange: true };
ajv.validate(schema, 1.01); // true
ajv.validate(schema, 2); // true
ajv.validate(schema, 2.99); // true
ajv.validate(schema, 1); // false
ajv.validate(schema, 3); // false
This keyword allows to use regular expressions with flags in schemas (the standard pattern
keyword does not support flags).
This keyword applies only to strings. If the data is not a string, the validation succeeds.
The value of this keyword can be either a string (the result of regexp.toString()
) or an object with the properties pattern
and flags
(the same strings that should be passed to RegExp constructor).
var schema = {
type: 'object',
properties: {
foo: { regexp: '/foo/i' },
bar: { regexp: { pattern: 'bar', flags: 'i' } }
}
};
var validData = {
foo: 'Food',
bar: 'Barmen'
};
var invalidData = {
foo: 'fog',
bar: 'bad'
};
These keywords allow to define minimum/maximum constraints when the format keyword defines ordering.
These keywords apply only to strings. If the data is not a string, the validation succeeds.
The value of keyword formatMaximum
(formatMinimum
) should be a string. This value is the maximum (minimum) allowed value for the data to be valid as determined by format
keyword. If format
is not present schema compilation will throw exception.
When this keyword is added, it defines comparison rules for formats "date"
, "time"
and "date-time"
. Custom formats also can have comparison rules. See addFormat method.
The value of keyword formatExclusiveMaximum
(formatExclusiveMinimum
) should be a boolean value. These keyword cannot be used without formatMaximum
(formatMinimum
). If this keyword value is equal to true
, the data to be valid should not be equal to the value in formatMaximum
(formatMinimum
) keyword.
require('ajv-keywords')(ajv, ['formatMinimum', 'formatMaximum']);
var schema = {
format: 'date',
formatMinimum: '2016-02-06',
formatMaximum: '2016-12-27',
formatExclusiveMaximum: true
}
var validDataList = ['2016-02-06', '2016-12-26', 1];
var invalidDataList = ['2016-02-05', '2016-12-27', 'abc'];
This keyword allows a string to be modified before validation.
These keywords apply only to strings. If the data is not a string, the transform is skipped.
There are limitation due to how ajv is written:
data = 'a'; ajv.validate(schema, data);
ajv-pack
Supported options:
trim
: remove whitespace from start and endtrimLeft
: remove whitespace from starttrimRight
: remove whitespace from endtoLowerCase
: case string to all lower casetoUpperCase
: case string to all upper casetoEnumCase
: case string to match case in schemaOptions are applied in the order they are listed.
Note: toEnumCase
requires that all allowed values are unique when case insensitive.
Example: multiple options
require('ajv-keywords')(ajv, ['transform']);
var schema = {
type: 'array',
items: {
type:'string',
transform:['trim','toLowerCase']
}
};
var data = [' MixCase '];
ajv.validate(schema, data);
console.log(data); // ['mixcase']
Example: enumcase
require('ajv-keywords')(ajv, ['transform']);
var schema = {
type: 'array',
items: {
type:'string',
transform:['trim','toEnumCase'],
enum:['pH']
}
};
var data = ['ph',' Ph','PH','pH '];
ajv.validate(schema, data);
console.log(data); // ['pH','pH','pH','pH']
The keyword allows to check that some properties in array items are unique.
This keyword applies only to arrays. If the data is not an array, the validation succeeds.
The value of this keyword must be an array of strings - property names that should have unique values across all items.
var schema = { uniqueItemProperties: [ "id", "name" ] };
var validData = [
{ id: 1 },
{ id: 2 },
{ id: 3 }
];
var invalidData1 = [
{ id: 1 },
{ id: 1 }, // duplicate "id"
{ id: 3 }
];
var invalidData2 = [
{ id: 1, name: "taco" },
{ id: 2, name: "taco" }, // duplicate "name"
{ id: 3, name: "salsa" }
];
This keyword is contributed by @blainesch.
This keyword allows to require the presence of all properties used in properties
keyword in the same schema object.
This keyword applies only to objects. If the data is not an object, the validation succeeds.
The value of this keyword must be boolean.
If the value of the keyword is false
, the validation succeeds.
If the value of the keyword is true
, the validation succeeds if the data contains all properties defined in properties
keyword (in the same schema object).
If the properties
keyword is not present in the same schema object, schema compilation will throw exception.
var schema = {
properties: {
foo: {type: 'number'},
bar: {type: 'number'}
}
allRequired: true
};
var validData = { foo: 1, bar: 2 };
var alsoValidData = { foo: 1, bar: 2, baz: 3 };
var invalidDataList = [ {}, { foo: 1 }, { bar: 2 } ];
This keyword allows to require the presence of any (at least one) property from the list.
This keyword applies only to objects. If the data is not an object, the validation succeeds.
The value of this keyword must be an array of strings, each string being a property name. For data object to be valid at least one of the properties in this array should be present in the object.
var schema = {
anyRequired: ['foo', 'bar']
};
var validData = { foo: 1 };
var alsoValidData = { foo: 1, bar: 2 };
var invalidDataList = [ {}, { baz: 3 } ];
This keyword allows to require the presence of only one property from the list.
This keyword applies only to objects. If the data is not an object, the validation succeeds.
The value of this keyword must be an array of strings, each string being a property name. For data object to be valid exactly one of the properties in this array should be present in the object.
var schema = {
oneRequired: ['foo', 'bar']
};
var validData = { foo: 1 };
var alsoValidData = { bar: 2, baz: 3 };
var invalidDataList = [ {}, { baz: 3 }, { foo: 1, bar: 2 } ];
This keyword allows to require the presence of properties that match some pattern(s).
This keyword applies only to objects. If the data is not an object, the validation succeeds.
The value of this keyword should be an array of strings, each string being a regular expression. For data object to be valid each regular expression in this array should match at least one property name in the data object.
If the array contains multiple regular expressions, more than one expression can match the same property name.
var schema = { patternRequired: [ 'f.*o', 'b.*r' ] };
var validData = { foo: 1, bar: 2 };
var alsoValidData = { foobar: 3 };
var invalidDataList = [ {}, { foo: 1 }, { bar: 2 } ];
This keyword allows to prohibit that any of the properties in the list is present in the object.
This keyword applies only to objects. If the data is not an object, the validation succeeds.
The value of this keyword should be an array of strings, each string being a property name. For data object to be valid none of the properties in this array should be present in the object.
var schema = { prohibited: ['foo', 'bar']};
var validData = { baz: 1 };
var alsoValidData = {};
var invalidDataList = [
{ foo: 1 },
{ bar: 2 },
{ foo: 1, bar: 2}
];
Please note: {prohibited: ['foo', 'bar']}
is equivalent to {not: {anyRequired: ['foo', 'bar']}}
(i.e. it has the same validation result for any data).
This keyword allows to validate deep properties (identified by JSON pointers).
This keyword applies only to objects. If the data is not an object, the validation succeeds.
The value should be an object, where keys are JSON pointers to the data, starting from the current position in data, and the values are JSON schemas. For data object to be valid the value of each JSON pointer should be valid according to the corresponding schema.
var schema = {
type: 'object',
deepProperties: {
"/users/1/role": { "enum": ["admin"] }
}
};
var validData = {
users: [
{},
{
id: 123,
role: 'admin'
}
]
};
var alsoValidData = {
users: {
"1": {
id: 123,
role: 'admin'
}
}
};
var invalidData = {
users: [
{},
{
id: 123,
role: 'user'
}
]
};
var alsoInvalidData = {
users: {
"1": {
id: 123,
role: 'user'
}
}
};
This keyword allows to check that some deep properties (identified by JSON pointers) are available.
This keyword applies only to objects. If the data is not an object, the validation succeeds.
The value should be an array of JSON pointers to the data, starting from the current position in data. For data object to be valid each JSON pointer should be some existing part of the data.
var schema = {
type: 'object',
deepRequired: ["/users/1/role"]
};
var validData = {
users: [
{},
{
id: 123,
role: 'admin'
}
]
};
var invalidData = {
users: [
{},
{
id: 123
}
]
};
See json-schema-org/json-schema-spec#203 for an example of the equivalent schema without deepRequired
keyword.
Please note: this keyword is provided to preserve backward compatibility with previous versions of Ajv. It is strongly recommended to use if
/then
/else
keywords instead, as they have been added to the draft-07 of JSON Schema specification.
This keyword allows to perform advanced conditional validation.
The value of the keyword is the array of if/then clauses. Each clause is the object with the following properties:
if
(optional) - the value is JSON-schemathen
(required) - the value is JSON-schema or booleancontinue
(optional) - the value is booleanThe validation process is dynamic; all clauses are executed sequentially in the following way:
if
:
if
property is JSON-schema according to which the data is:
switch
SUCCEEDS.if
property is absent => go to step 2.then
:
then
property is true
or it is JSON-schema according to which the data is valid => go to step 3.then
property is false
or it is JSON-schema according to which the data is invalid => the validation of switch
FAILS.continue
:
continue
property is true
=> go to the NEXT clause, if this was the last clause the validation of switch
SUCCEEDS.continue
property is false
or absent => validation of switch
SUCCEEDS.require('ajv-keywords')(ajv, 'switch');
var schema = {
type: 'array',
items: {
type: 'integer',
'switch': [
{ if: { not: { minimum: 1 } }, then: false },
{ if: { maximum: 10 }, then: true },
{ if: { maximum: 100 }, then: { multipleOf: 10 } },
{ if: { maximum: 1000 }, then: { multipleOf: 100 } },
{ then: false }
]
}
};
var validItems = [1, 5, 10, 20, 50, 100, 200, 500, 1000];
var invalidItems = [1, 0, 2000, 11, 57, 123, 'foo'];
The above schema is equivalent to (for example):
{
type: 'array',
items: {
type: 'integer',
if: { minimum: 1, maximum: 10 },
then: true,
else: {
if: { maximum: 100 },
then: { multipleOf: 10 },
else: {
if: { maximum: 1000 },
then: { multipleOf: 100 },
else: false
}
}
}
}
These keywords allow to choose the schema to validate the data based on the value of some property in the validated data.
These keywords must be present in the same schema object (selectDefault
is optional).
The value of select
keyword should be a $data reference that points to any primitive JSON type (string, number, boolean or null) in the data that is validated. You can also use a constant of primitive type as the value of this keyword (e.g., for debugging purposes).
The value of selectCases
keyword must be an object where each property name is a possible string representation of the value of select
keyword and each property value is a corresponding schema (from draft-06 it can be boolean) that must be used to validate the data.
The value of selectDefault
keyword is a schema (from draft-06 it can be boolean) that must be used to validate the data in case selectCases
has no key equal to the stringified value of select
keyword.
The validation succeeds in one of the following cases:
If select
value (in data) is not a primitive type the validation fails.
Please note: these keywords require Ajv $data
option to support $data reference.
require('ajv-keywords')(ajv, 'select');
var schema = {
type: object,
required: ['kind'],
properties: {
kind: { type: 'string' }
},
select: { $data: '0/kind' },
selectCases: {
foo: {
required: ['foo'],
properties: {
kind: {},
foo: { type: 'string' }
},
additionalProperties: false
},
bar: {
required: ['bar'],
properties: {
kind: {},
bar: { type: 'number' }
},
additionalProperties: false
}
},
selectDefault: {
propertyNames: {
not: { enum: ['foo', 'bar'] }
}
}
};
var validDataList = [
{ kind: 'foo', foo: 'any' },
{ kind: 'bar', bar: 1 },
{ kind: 'anything_else', not_bar_or_foo: 'any value' }
];
var invalidDataList = [
{ kind: 'foo' }, // no propery foo
{ kind: 'bar' }, // no propery bar
{ kind: 'foo', foo: 'any', another: 'any value' }, // additional property
{ kind: 'bar', bar: 1, another: 'any value' }, // additional property
{ kind: 'anything_else', foo: 'any' } // property foo not allowed
{ kind: 'anything_else', bar: 1 } // property bar not allowed
];
Please note: the current implementation is BETA. It does not allow using relative URIs in $ref keywords in schemas in selectCases
and selectDefault
that point outside of these schemas. The workaround is to use absolute URIs (that can point to any (sub-)schema added to Ajv, including those inside the current root schema where select
is used). See tests.
This keyword allows to assign dynamic defaults to properties, such as timestamps, unique IDs etc.
This keyword only works if useDefaults
options is used and not inside anyOf
keywords etc., in the same way as default keyword treated by Ajv.
The keyword should be added on the object level. Its value should be an object with each property corresponding to a property name, in the same way as in standard properties
keyword. The value of each property can be:
func
(an identifier) and args
(an object with parameters that will be passed to this function during schema compilation - see examples).The properties used in dynamicDefaults
should not be added to required
keyword (or validation will fail), because unlike default
this keyword is processed after validation.
There are several predefined dynamic default functions:
"timestamp"
- current timestamp in milliseconds"datetime"
- current date and time as string (ISO, valid according to date-time
format)"date"
- current date as string (ISO, valid according to date
format)"time"
- current time as string (ISO, valid according to time
format)"random"
- pseudo-random number in [0, 1) interval"randomint"
- pseudo-random integer number. If string is used as a property value, the function will randomly return 0 or 1. If object { func: 'randomint', args: { max: N } }
is used then the default will be an integer number in [0, N) interval."seq"
- sequential integer number starting from 0. If string is used as a property value, the default sequence will be used. If object { func: 'seq', args: { name: 'foo'} }
is used then the sequence with name "foo"
will be used. Sequences are global, even if different ajv instances are used.var schema = {
type: 'object',
dynamicDefaults: {
ts: 'datetime',
r: { func: 'randomint', args: { max: 100 } },
id: { func: 'seq', args: { name: 'id' } }
},
properties: {
ts: {
type: 'string',
format: 'date-time'
},
r: {
type: 'integer',
minimum: 0,
exclusiveMaximum: 100
},
id: {
type: 'integer',
minimum: 0
}
}
};
var data = {};
ajv.validate(data); // true
data; // { ts: '2016-12-01T22:07:28.829Z', r: 25, id: 0 }
var data1 = {};
ajv.validate(data1); // true
data1; // { ts: '2016-12-01T22:07:29.832Z', r: 68, id: 1 }
ajv.validate(data1); // true
data1; // didn't change, as all properties were defined
When using the useDefaults
option value "empty"
, properties and items equal to null
or ""
(empty string) will be considered missing and assigned defaults. Use the allOf
compound keyword to execute dynamicDefaults
before validation.
var schema = {
allOf: [
{
dynamicDefaults: {
ts: 'datetime',
r: { func: 'randomint', args: { min: 5, max: 100 } },
id: { func: 'seq', args: { name: 'id' } }
}
},
{
type: 'object',
properties: {
ts: {
type: 'string'
},
r: {
type: 'number',
minimum: 5,
exclusiveMaximum: 100
},
id: {
type: 'integer',
minimum: 0
}
}
}
]
};
var data = { ts: '', r: null };
ajv.validate(data); // true
data; // { ts: '2016-12-01T22:07:28.829Z', r: 25, id: 0 }
You can add your own dynamic default function to be recognised by this keyword:
var uuid = require('uuid');
function uuidV4() { return uuid.v4(); }
var definition = require('ajv-keywords').get('dynamicDefaults').definition;
// or require('ajv-keywords/keywords/dynamicDefaults').definition;
definition.DEFAULTS.uuid = uuidV4;
var schema = {
dynamicDefaults: { id: 'uuid' },
properties: { id: { type: 'string', format: 'uuid' } }
};
var data = {};
ajv.validate(schema, data); // true
data; // { id: 'a1183fbe-697b-4030-9bcc-cfeb282a9150' };
var data1 = {};
ajv.validate(schema, data1); // true
data1; // { id: '5b008de7-1669-467a-a5c6-70fa244d7209' }
You also can define dynamic default that accepts parameters, e.g. version of uuid:
var uuid = require('uuid');
function getUuid(args) {
var version = 'v' + (arvs && args.v || 4);
return function() {
return uuid[version]();
};
}
var definition = require('ajv-keywords').get('dynamicDefaults').definition;
definition.DEFAULTS.uuid = getUuid;
var schema = {
dynamicDefaults: {
id1: 'uuid', // v4
id2: { func: 'uuid', v: 4 }, // v4
id3: { func: 'uuid', v: 1 } // v1
}
};
To report a security vulnerability, please use the Tidelift security contact. Tidelift will coordinate the fix and disclosure.
Please do NOT report security vulnerabilities via GitHub issues.
Ajv-keywords is a part of Tidelift subscription - it provides a centralised support to open-source software users, in addition to the support provided by software maintainers.


Property
ID
TagName
X1
Y1
X2
Y2
MATRIX 0
MATRIX 1
MATRIX 2
MATRIX 3
MATRIX 4
MATRIX 5
UPDATE
DELETE
Elements
{{item.tagName}}
Enter Text
×


Free Thought Volume II, Issue 1, 2000.
Gary Aposhian, editor (and lots
of supporting editorial staff). Free Thought Publications, P.O. Box 238671,
Encinitas, CA 92023. Subscription: $10.00 for four issues. Email:
<EMAIL_ADDRESS>Before It's Light by Lyn Lifshin.
1999. 239 pages. Black Sparrow Press, 24
Tenth Street, Santa Rosa, CA 95401. The usual Black Sparrow price (not bad
and worth it always).
Rain River by Yusuke Keida
Editions Pphoo, Pradip Choudhuri, 73 Regent
Estate, Calcutta, 700 092 India. 2000. 68pp.
$10.00 US funds.
Baker Street Irregular No. 4 / Minotaur No. 35
Baker Street Irregular,
4026 Midvale Avenue, Oakland, California, 94602. $5.00 an issue.
http://www.lucidmoonpoetry.com
Heeltap No. 7. Issn 1091-9449. 2000.
$5.00 c/o Richard D. Houff, 604
Hawthorne Avenue East, St. Paul, MN 55116-2012. Direct all correspondence,
donations and submissions to him.
The Band Only a Mother Could Love by The Bubbadinos.
Zerx 021 - CD. Mark
Weber, 725 Van Buren Place SE, Albuquerque, New Mexico, 87108.
-or-<EMAIL_ADDRESS>Free Thought Volume II, Issue 1, 2000.
Gary Aposhian, editor (and lots
of supporting editorial staff). Free Thought Publications, P.O. Box 238671,
Encinitas, CA 92023. Subscription: $10.00 for four issues. Email:
<EMAIL_ADDRESS>This particular issue is titled: Resurrection issue including a
retrospective of Charles Bukowski, interviews, short stories, photography
and artwork all a tribute to Hank's eightieth birthday. And a great tribute
it is. Happy Birthday Charles B. This issue for sure is a must for all of us
who honor the name Bukowski. I can only imagine that someplace an amusing,
confident, contented smile would be cracked by King Charles the Buk. I hope
he tips a beer. Most interesting to me, I learned from the material within.
And spread out about the issue are poems by Bukowski that saw first
appearance in Marvin Malone's monument of a literary magazine, the fantastic
Wormwood Review. Malone was a life-long publisher of Bukowski's work, among many, many others. Within this Free Thought issue are interviews with John Martin, Gerald Locklin, Michael Montfort and articles and short stories by
friends, like John Thomas, and a very interesting piece by William Parkard,
editor of The New York Quarterly. The issue also features a very long
interview with Linda Bukowski and a piece called The First Time I Read
Bukowski by Free Thought editor Gary Aposhian. And there are Bukowski
drawings and a re-publication of 20 tanks from Kasseldown and lots of
photographs not before published. A dream, a dream for sure for Charles
Bukowski fans, readers, scholars, and fans and friends. For Sure.
Before It's Light by Lyn Lifshin.
1999. 239 pages. Black Sparrow Press, 24
Tenth Street, Santa Rosa, CA 95401. The usual Black Sparrow price (not bad
and worth it always).
Of course, like many, or all, I am acquainted with Lyn Lifshin's poems and
read them, over the years, at various times, in small magazines and as small
groupings in chapbooks. I knew her as a madonna and a madwoman and a
seductress, and also as a poet who would drift, nostalgically, into her
past. The poems appeared real, that is the images in the poems represented,
so I thought, a real time, a real place, and a real past that could be
called Lyn Lifshin's. On one level, of course, this is true. However,
reading 200 plus pages of Lady Lyn's poems, and that means about 200 new
poems, does transport one. Where one locates after engaging these poems is
in a familiar landscape, which is, nevertheless, unreal. Everyone's past is
always fabricated. Lifshin's past is infused and laced with emotions that
make magic the objects, including the feelings, of Lyn Lifshin created
places and people, places and people of her imagination. In her opening
poem, But Instead Has Gone Underground, she writes, "who I am is already/
camouflaged behind/ velvet and leather." So it is them throughout, each
step, in each poem, all these places of poetry are swaddled by her,
Lifshin's imagination that has made mythic the common (community) place of
everybody's everyday. Reading these poems one dances with their seduction
and falls into their witchery comfort.
Rain River by Yusuke Keida
Editions Pphoo, Pradip Choudhuri, 73 Regent
Estate, Calcutta, 700 092 India. 2000. 68pp.
$10.00 US funds.
"I'm a cross-legged goof/ because I write poetry," pens Japanese poet
Yusuke Keida in his first widely available, in English, book of poems. It is
a selection of work harvested from 20 years of writing. It is a book, in one
sense, of love poems, homage and tributes to other poets that allowed Keide
to breathe/bathe full, wet, naked life, in the midst of the hard cold rain
of existence beyond poetry. His masters are Kerouac and Ginsberg and he has
supported them, and a generation or two of Beats that follow them, via his
Blue Beat Jacket press and magazine. Keida also translated Kerouac's poetry
into Japanese. Yes, Rain River, it is a lovely book published by Pradip
Choudhuri, India's Beat Generation proponent and promoter, and has that
delightful, oriental peace, a peace so needed, so sought after by Kerouac,
Ginsberg, poets in general, and maybe you to, good reader. Check it out.
Keida's address, if you interested in Japanese Beats and Kerouac, is: Blue
Jacket Press, 1-5-54 Sugue-cho, Sanjo-shi, Niiagata, Japan.
Baker Street Irregular No. 4 / Minotaur No. 35
Baker Street Irregular,
4026 Midvale Avenue, Oakland, California, 94602. $5.00 an issue.
There are five poets from San Francisco in this issue. There are four
poets from Oakland in this issue. In this issue there is one poet from Long
Beech, California named Tricia Cherin. Her poem is on page 13. And at this
point the reality leaves and the magic of poetry, that is finding it,
locating its meaning beyond the self of stuff, finding the genius in each
event/object takes off and this is and this point is Cherin's gift - the
flight of word in art and on the page next to her art is an equally good
poem by Alan Catlin, who summons via title Harry Crosby from across oceans
and time form even the Paris of the 1920s which he fled via a bullet. Ah-
the gift of poetry. And Chased Out Beyond the Trees a selection of older
poems by Mark Weber has to be a stop in the read through this issue. Mark is
one of our best and these poems are from the period when his tank was full
of the booze life: wearing a dead man's shirt/staring up an old river/
sometimes, the trees/ grow over the view.
http://www.lucidmoonpoetry.com
This URL is Ralph Hasselmann's new publishing realm. After 40 print issues
of Lucid Moon, a billion sheets of paper, exhausting several photocopy
machines, etc. and braking the backs of many a mail carrier (luggin around
the great Moon issues), it the LIT IT OF LUCID MOON: - the Zine -
metamorphosed into this site - which is growing, expanding, hanging and
mostly - well - yeah - it is growing - that is what Ralph does the best - that
is combine it all and get it all out there - and not worry about this and
that and well what about this poem - I mean - his gut is a trusted thing -
like ice cream moon and howling dog tongues want it. So, MainMan! Ralph,
has it together - plenty poems, him got reviews, interviews, broadside
series, link to the Alpha BEATS! Tapes and joy, yes, such are the joys
cause we are all girls and boys. No invisible worms allowed, no police on
yaks, no pool closing the second week in September, no none of that, Stuff,
what makes you mad. Here !!! Everything is Holy. Baseball is Holy. The
Organ of Man is Holy. Click on it - willya! Jeez Loueez. Click. Fool Click.
Cluck-cluck-cluck. Click click click.
Heeltap No. 7. Issn 1091-9449. 2000.
$5.00 c/o Richard D. Houff, 604
Hawthorne Avenue East, St. Paul, MN 55116-2012. Direct all correspondence,
donations and submissions to him.
Heeltap is a Pariah Press Publication. This particular issue begins with a
big chunk of poem work by Lyn Lifshin - 7 poems in fact (this is issue 7). I
guess I was wrong - 5 poems. I am a ritter not an a math-geek. And then
followed by four poems by Todd Fox. Later on there are poems by Gerald
Locklin, Robert Peters, Holy Day (Isn't she from Florida?), Peter Magliocco
(Isn't he from Nashville?), Albert Huffsticker (Isn't he from Texas)? Well,
you see - this is really a congress of poets - this is a UN meeting or an,
you know an Olympic Village of sorts, or a jug volcanoing with the exotic.
Ok - so we have here a magazine that consistently presents American work.
Poems for dishwashers, cab drivers, - all the workin people - not the rich
kids back from France whose Ma and Pa paid for the first 10 issues of the
glossy pornographic Nork York City rag that features only other rich kids
back from France - no and not and nope.  Wake up would you! Treat this editor: Richard
Houff. With a letter with some stamps or send him a huge chunk of kilbasa.
Here is a short poem by Paula Villegas:
I love men with blue caps
They keep their heads on so well
The Band Only a Mother Could Love by The Bubbadinos.
Zerx 021 - CD. Mark
Weber, 725 Van Buren Place SE, Albuquerque, New Mexico, 87108.
-or-<EMAIL_ADDRESS>For the past several years Mark Weber, poet of western Oki California
arrests and wine and people guitar hub-cap backporch cigarette trembling
songster house painter (who are also publisher of countless tremendous books
from Zrex Press - and best poet of New Mexico) has been spending tidal waves
of energy on music and as a result - this is one holy result: The Band Only
a Mother Could Love, which is a 25 track CD of wonderfully spun both
traditional and other musics and songs by Weber and they does Clementine,
Yankee Doodle, Amazing Grace, You Are My Sunshine, and etc. like if sand and
glass and blood were the mucus sent in rivers by the Gods. It is easy to
say you have to hear it but you have to hear it. And once you hear it you
say, I gotta hear it again. And again. It grows and grows the great
mountains and deserts and desserts of Alballquerkey, New MeixiGO!!
Michael Basinski
©2000 the-hold.com
grafitti messageboard BACK
email |
the hold
disclaimer
© 1998-2002 the-hold.com /archives -all rights reserved
[ TOP ]


Components are the reuseable building blocks of our design system. Each component meets a specific interaction or UI need, and has been specifically created to work together to create patterns and intuitive user experiences.


You are currently viewing the home page from the backend GO application
Second Backend Page
VueJS Home Page
Backend API


--- layout: projects title: Projects ---
The following is a list of open source projects I've authored or co-authored.
Om-Bootstrap is a ClojureScript library of Bootstrap 3 components built on top of Om. This is my first big client side library! Definitely a change of scenery.
Summingbird is a library that lets you write MapReduce programs that look like native Scala or Java collection transformations. So, while a word-counting aggregation in pure Scala might look like this:
def wordCount(source: Iterable[String], store: MutableMap[String, Long]) = source.flatMap { sentence => toWords(sentence).map(_ -> 1L) }.foreach { case (k, v) => store.update(k, store.get(k) + v) }
Counting words in Summingbird looks like this:
def wordCount[P <: Platform[P]] (source: Producer[P, String], store: P#Store[String, Long]) = source.flatMap { sentence => toWords(sentence).map(_ -> 1L) }.sumByKey(store)
The logic is exactly the same, and the code is almost the same. The main difference is that you can execute the Summingbird program in "batch mode" (using Scalding), in "realtime mode" (using Storm), or on both Scalding and Storm in a hybrid batch/realtime mode that offers your application very attractive fault-tolerance properties.
Summingbird provides you with the primitives you need to build rock solid production systems.
Storehaus is a Scala library that makes it easy to work with asynchronous key-value stores.
A Bijection is a function that can be inverted. Practically, in Scala, Bijections are used to tell the type system about equivalent concepts that may have been defined in different libraries (scala.Int
vs java.lang.Integer
, for example.) The ability to declare these equivalences is hugely valuable.
Injection
, a related trait included in the library, is a function that can sometimes be inverted. (Your item might be able to convert to a byte array, but not all byte arrays can come back, for example.) Injection
and Bijection
turn out to be wonderful at describing serializations. We use the concept heavily in Summingbird and other distributed systems at Twitter.
Algebird is an abstract algebra library for Scala. Algebird is designed with streaming aggregations in mind, and implements a number of types and combinators that are useful in a streaming mapreduce environment. The Monoid
, for example, is a core concept of Summingbird, Twitter's streaming MapReduce library.
Here are some of the more exotic data structures in Algebird:
Chill provides a number of enhancements to the Kryo JVM serialization library; notably, serializers for all scala primitives and collection types, and plugins that make it easy to use Kryo in Hadoop and Storm jobs. Scalding, Cascalog, Spark and many other projects use chill to manage serialization across their various distributed system implementations.
Tormenta provides a type-safe Scala DSL over Storm, along with scala-friendly implementations of Kafka, Kestrel and Twitter Streaming API spouts for Storm.
The Forest Monitoring for Action (FORMA) project provides free and open forest clearing alert data derived from MODIS satellite imagery every 16 days beginning in December 2005. I was the lead developer of FORMA's Clojure codebase from January 2011 to mid-2012.
Here are other people's projects I've contributed to in large ways.
Cascalog is a Datalog implementation in Clojure that compiles queries down to Hadoop jobs. I've maintained Cascalog since late 2011 and authored many core features and modules, including midje-cascalog and cascalog-contrib. I'm currently working on Cascalog 2, which will allow Cascalog's query language to compile down to targets other than Hadoop (like Spark or Storm).
Scalding is a Hadoop DSL written in Scala. I've contributed a number of designs and constructs to the codebase; many of these can be found in the scalding-commons project. Some examples are
PailSource
ElephantDB is a distributed read-only key-value store designed to be populated by Hadoop. I maintained ElephantDB during the first half of 2012 and performed a major rewrite that went into production at Twitter for a time.
Pallet is a cloud provisioning system written in Clojure. I contributed a Hadoop cluster deploy tool called pallet-hadoop.
I developed the following games for iOS:


workbox. core
All of the Workbox service worker libraries use workbox-core for shared code as well as setting default values that need to be shared (like cache names).
Properties
cacheNames
Get the current cache names used by Workbox.
cacheNames.precache
is used for precached assets,
cacheNames.googleAnalytics
is used by workbox-google-analytics
to store analytics.js
, and cacheNames.runtime
is used for everything else.
- Returns
-
Object
An object withprecache
andruntime
cache names.
LOG_LEVELS
The available log levels in Workbox: debug, log, warn, error and silent.
Properties
Parameter |
|
|---|---|
|
debug |
int Prints all logs from Workbox. Useful for debugging. |
|
log |
int Prints console log, warn, error and groups. Default for debug builds. |
|
warn |
int Prints console warn, error and groups. Default for non-debug builds. |
|
error |
int Print console error and groups. |
|
silent |
int Force no logging from Workbox. |
logLevel
Get the current log level.
- Returns
-
number
.
Methods
setCacheNameDetails
setCacheNameDetails(details)
You can alter the default cache names used by the Workbox modules by changing the cache name details.
Cache names are generated as <prefix>-<Cache Name>-<suffix>
.
Parameter |
|||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
details |
Object Values in
|
setLogLevel
setLogLevel(newLevel)
Set the current log level passing in one of the values from LOG_LEVELS.
Parameter |
|
|---|---|
|
newLevel |
number The new log level to use. |


Monster Features
| Use? | Name | Example Monster | Feature Description |
|---|
Note: Not all monster features are covered here. The DMG has specific instructions on how to manage other features.
| Use? | Name | Example Monster | Feature Description |
|---|
Note: Not all monster features are covered here. The DMG has specific instructions on how to manage other features.


New Forest [am66], forest, in Imperia, peasants: 112
Last updated Turn #111
New Forest [am66], forest, in Imperia, peasants: 112
------------------------------------------------------------------------
8: Stack of giants [by4k] loots the countryside.
16: Stack of giants [by4k] loots the countryside.
30: The population grows by one peasant.
Routes leaving New Forest:
North, forest, to New Forest [al66], 8 days
East, plain, to Endless Plains [am67], 7 days
South, mountain, to Imperial Mountains [an66], 10 days
West, forest, to New Forest [am65], 8 days
It is raining.
The province is blanketed in fog.
No one can be seen through the fog.


| java.lang.Object | |
| ↳ | com.applovin.mediation.MaxErrorCodes |
| Constants | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| int | FORMAT_TYPE_NOT_SUPPORTED | Current ad type is not supported by the mediation framework. | |||||||||
| int | FULLSCREEN_AD_ALREADY_SHOWING | Indicates that an attempt to show a fullscreen ad (interstitial or rewarded) was made while another fullscreen ad is still showing. | |||||||||
| int | INVALID_INTERNAL_STATE | Internal state of the SDK is invalid. | |||||||||
| int | INVALID_RESPONSE | Indicates that a AppLovin servers have returned an invalid response | |||||||||
| int | MEDIATION_ADAPTER_AD_NOT_READY | Indicates that the mediation adapter was requested to render an ad that was not marked as ready. | |||||||||
| int | MEDIATION_ADAPTER_DISABLED | Indicates that the mediation adapter was disabled. | |||||||||
| int | MEDIATION_ADAPTER_IMMEDIATE_TIMEOUT | Indicates that the mediated ad has failed immediately (due to a 0 timeout). | |||||||||
| int | MEDIATION_ADAPTER_LOAD_FAILED | Indicates that the mediation adapter has failed to load. | |||||||||
| int | MEDIATION_ADAPTER_TIMEOUT | Indicates that the mediated ad has failed due to a timeout. | |||||||||
| int | MEDIATION_ADAPTER_WRONG_TYPE | Indicates that the mediation adapter is not of an expected type. | |||||||||
| int | NO_ACTIVITY | Main activity reference garbage collected. | |||||||||
| int | NO_FILL | Indicates that no ads are currently eligible for your device. | |||||||||
| int | UNSPECIFIED_ERROR | Indicates that the system is in unexpected state. |
| Public Constructors | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| MaxErrorCodes() |
|
[Expand]
Inherited Methods | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
From class
java.lang.Object
|
Current ad type is not supported by the mediation framework.
Indicates that an attempt to show a fullscreen ad (interstitial or rewarded) was made while another fullscreen ad is still showing.
Internal state of the SDK is invalid.
Indicates that a AppLovin servers have returned an invalid response
Indicates that the mediation adapter was requested to render an ad that was not marked as ready.
Indicates that the mediation adapter was disabled.
Indicates that the mediated ad has failed immediately (due to a 0 timeout).
Indicates that the mediation adapter has failed to load.
Indicates that the mediated ad has failed due to a timeout.
Indicates that the mediation adapter is not of an expected type.
Main activity reference garbage collected.
Indicates that no ads are currently eligible for your device.
Indicates that the system is in unexpected state.


Properties
ChaseClosestFightTactics
ChaseClosestFightTactics: IFightChase
Private FOOD_VALUE
FOOD_VALUE: number = 1
FindClosestClusterFoodTactics
FindClosestClusterFoodTactics: IFoodCluster
Private WEAPON_VALUE
WEAPON_VALUE: number = 5
WeaponTactics
WeaponTactics: IWeapon
_collectedWeapons
_collectedWeapons: number = 0
Protected _forceChasingPrediction
_forceChasingPrediction: boolean = false
Protected _guiElements
_guiElements: Array<HTMLElement> = []
Protected _guiIsInitialised
_guiIsInitialised: boolean = false
aggressivity
aggressivity: number = 65
Private lastWeaponStatus
lastWeaponStatus: CarWeapon = CarWeapon.None
useChasingPrediction
useChasingPrediction: boolean = true
Default working strategy.


#include <drmgr.h>
Data Fields | |
| size_t | struct_size |
| const char * | name |
| const char * | before |
| const char * | after |
| int | priority |
Specifies the ordering of callbacks for drmgr's
events
| const char* _drmgr_priority_t::after |
The name of another callback that the callback being registered should follow. This field is optional and can be NULL.
| const char* _drmgr_priority_t::before |
The name of another callback that the callback being registered should precede. This field is optional and can be NULL.
| const char* _drmgr_priority_t::name |
A name for the callback being registered, to be used by other components when specifying their relative order. This field is mandatory.
A numeric priority to resolve identical ordering after the before
and after
requests are resolved. Lower numbers are placed earlier in the callback invocation order.
The size of the drmgr_priority_t struct


Apple launches new privacy website, but policies unchanged
by The Associated Press, StaffCUPERTINO, Calif. -- Apple is expanding its website on privacy with more explanations about its commitments, though its policies and practices aren't changing.
The new site Wednesday is part of Apple's ongoing push to distinguish itself from data-hungry, advertising-fueled rivals such as Google and Facebook.
Apple's privacy website is mostly a users' guide with papers on how to prevent apps and other third-party services from unnecessarily tracking users' location and behaviours.
The company's actual privacy policy hasn't changed.
Many of the new privacy enhancements were announced earlier as part of Apple's iOS 13 software update for iPhones. Changes include the ability to sign in to third-party services with an Apple ID account rather than Facebook's or Google's, plus more notices and warnings about apps tapping location data.


{% include "scaffold/incbootstrap.html" %}
Shared comment: {{existing_comment}}
Shared comments may be shared with the submitter.
Private comment:
Private comments are not shared with the submitter - please prefer shared comments
{% include "submission_lib/subm_disp_fragment.html" %} {% for speaker in speakers: %} {% include "speaker_lib/speaker_fragment.html" %} {% endfor %}


Blender
New scheme
New Collection
Save source
Select Resource
New resource...
Delete resource
Filter Collection
Export...
Taxonomy
Collections
Save
Cancel


Every child, no matter who they are or where they come from, deserves access to education. Save the Children, through several state-level programmes and national policy-influencing decisions, has helped educate many children! We address the learning crisis by preparing children and adolescents for life, work, and active citizenship. Come, join our mission to Educate Every Last Child! Over the years, we have faced a multitude of issues but undeterred, we have devised several solutions that help us continue sharing the gift of education with underprivileged children. Here, take a look.


You've got a raw.github.com
URL that points to some work-in-progress HTML, JavaScript, or CSS. You'd like to share it with someone for a quick demo, or maybe you'd like to use it in a jsPerf test.
Too bad! Most things served from raw.github.com
have a text/plain
content type and are served with an X-Content-Type-Options: nosniff
header, which means HTML won't render, and some browsers won't execute JavaScript or apply CSS.
Delete the dot! Just replace raw.github.com
with rawgithub.com
and skadoosh, you're loading raw files from your GitHub repo and they're served with appropriate content types. Render HTML, apply CSS, execute JavaScript.
Before
https://raw.github.com/user/repo/master/filename.js
After
https://rawgithub.com/user/repo/master/filename.js
It works with gists too! Just replace gist.github.com
with rawgithub.com
in the raw gist URL.
Use this for testing and for sharing demo code with friends, but don't use it for anything production-related. It's slow, it might break from time to time, and it's intended as a convenience for development, not free static hosting.
 You've been warned!
The source code for rawgithub.com is hosted on GitHub! Fork it and go nuts.
No. Don't do this. Not even a little bit. It will make me very sad.
rawgithub.com is a free service to make developers' lives easier when developing and testing and debugging things. It's not free hosting. Use GitHub Pages for that.
If you hotlink to a rawgithub.com URL on a site that gets lots of traffic, requests will be throttled. If this heavy traffic continues, requests originating from your site will eventually be dropped.
If the traffic continues even after automatic throttling is triggered, rawgithub.com will start serving evil.js and evil.css instead of requested JS and CSS files. Visitors to your site may see an alert warning against using rawgithub.com in production, and your JS may start doing very strange things.
You can't claim rawgithub.com URLs on Google Webmaster Central, because rawgithub.com isn't a hosting service. It would be pointless anyway, since all rawgithub.com responses include an X-Robots-Tag: none
header, which tells search crawlers not to index anything.
Hey! rawgithub.com is just for fun and is not associated with GitHub in any way. Please use it responsibly. Have feedback? I'm @yaypie.
Sushi icon designed by Linda Yuki Nakanishi from The Noun Project.


<tour step="currentStep">
 Highlighted
 Elements
<input tourtip="You can use it as an attribute on your element" />
Full options
</tour>
You can also add callbacks to the
<tour>
:
<tour step="currentStep" post-tour="tourComplete()" post-step="stepComplete()">
It is very easy to add a cookie module that remembers what step a user was on. With the angular-cookie module, this is all you need to integrate cookies:
$scope.currentStep = ipCookie('myTour') || 0;
$scope.postStepCallback = function() {
ipCookie('myTour', $scope.currentStep, { expires: 3000 });
};
Inside your
<tour>
you have access to two scope methods for ending and starting the tour.
Open Tour
Close Tour
Open Tour
Close Tour