rotten > Library > Conspiracy > Cabal or no cabal? > Report from Davros
Report from Davros
This letter was "leaked" in February 2003. It's not clear if the leak was intentional or not. After the leak, it was posted on Slashdot, as an example of a massive privacy violation. Of course, if the intent was to leak it, this isn't true at all. It could even be a total fabrication, laying it on a bit thick with the namedropping.
With apologies for the group email... I thought this was interesting enough
to pass along. These are the notes from a friend of a friend who writes for
Newsday.
Adam XXXXXXXXX
Director, XXXXXXXXXXXX Environment Division
XXXX Xth Street, Suite XXX
San Rafael, CA 94901
Main Office:415-454-XXXX
Direct:415-257-XXXX
Cell: 415-305-XXXX
Hi Guys.
OK, hard to believe, but true. Yours truely has been hobnobbing with the
ruling class.
I spent a week in Davos, Switzerland at the World Economic Forum. I was
awarded a special pass which allowed me full access to not only the
entire official meeting, but also private dinners with the likes the
head of the Saudi Secret Police, presidents of various and sundry
countries, your Fortune 500 CEOS and the leaders of the most important
NGOs in the world. This was not typical press access. It was full-on,
unfettered, class A hobnobbing.
Davos, I discovered, is a breathtakingly beautiful spot, unlike anything
I'd ever experienced. Nestled high in the Swiss Alps, it's a three hours
train ride from Zurich that finds you climbing steadily through
snow-laden mountains that bring to mind Heidi and Audrey Hepburn (as in
the opening scenes of "Charade"). The EXTREMELY powerful arrive by
helicopter. The moderately powerful take the first class train. The NGOs
and we mere mortals reach heaven via coach train or a conference bus.
Once in Europe's bit of heaven conferees are scattered in hotels that
range from B&B to ultra luxury 5-stars, all of which are located along
one of only three streets that bisect the idyllic village of some 13,000
permanent residents.
Local Davos folks are fanatic about skiing, and the slopes are literally
a 5-15 minute bus ride away, depending on which astounding downhill you
care to try. I don't know how, so rather than come home in a full body
cast I merely watched.
This sweet little chalet village was during the WEF packed with about
3000 delegates and press, some 1000 Swiss police, another 400 Swiss
soldiers, numerous tanks and armored personnel carriers, gigantic rolls
of coiled barbed wire that gracefully cascaded down snow-covered
hillsides, missile launchers and assorted other tools of the national
security trade. The security precautions did not, of course, stop there.
Every single person who planned to enter the conference site had special
electronic badges which, upon being swiped across a reading pad,
produced a computer screen filled color portrait of the attendee, along
with his/her vital statistics. These were swiped and scrutinized by
soldiers and police every few minutes -- any time one passed through a
door, basically. The whole system was connected to handheld wireless
communication devices made by HP, which were issued to all VIPs. I got
one. Very cool, except when they crashed. Which, of course, they did
frequently. These devices supplied every imagineable piece of
information one could want about the conference, your fellow delegates,
Davos, the world news, etc. And they were emailing devices --- all
emails being monitored, of course, by Swiss cops.
Antiglobalization folks didn't stand a chance. Nor did Al Qaeda. After
all, if someone managed to take out Davos during WEF week the world
would basically lose a fair chunk of its ruling and governing class
POOF, just like that. So security was the name of the game. Metal
detectors, X-ray machines, shivering soldiers standing in blizzards,
etc.
Overall, here is what I learned about the state of our world:
- I was in a dinner with heads of Saudi and German FBI, plus the
foreign minister of Afghanistan. They all said that at its peak al Qaeda
had 70,000 members. Only 10% of them were trained in terrorism -- the
rest were military recruits. Of that 7000, they say all but about 200
are dead or in jail.
- But Al Qaeda, they say, is like a brand which has been heavily
franchised. And nobody knows how many unofficial franchises have been
spawned since 9/11.
- The global economy is in very very very very bad shape. Last year
when WEF met here in New York all I heard was, "Yeah, it's bad, but
recovery is right around the corner". This year "recovery" was a word
never uttered. Fear was palpable -- fear of enormous fiscal hysteria.
The watchwords were "deflation", "long term stagnation" and "collapse of
the dollar". All of this is without war.
- If the U.S. unilaterally goes to war, and it is anything short of a
quick surgical strike (lasting less than 30 days), the economists were
all predicting extreme economic gloom: falling dollar value, rising spot
market oil prices, the Fed pushing interest rates down towards zero with
resulting increase in national debt, severe trouble in all countries
whose currency is guaranteed agains the dollar (which is just about
everybody except the EU), a near cessation of all development and
humanitarian programs for poor countries. Very few economists or
ministers of finance predicted the world getting out of that economic
funk for minimally five-10 years, once the downward spiral ensues.
- Not surprisingly, the business community was in no mood to hear about
a war in Iraq. Except for diehard American Republicans, a few Brit
Tories and some Middle East folks the WEF was in a foul, angry
anti-American mood. Last year the WEF was a lovefest for America.  The rich -- whether they are
French or Chinese or just about anybody -- are livid about the Iraq
crisis primarily because they believe it will sink their financial
fortunes.
- Plenty are also infuriated because they disagree on policy grounds. I
learned a great deal. It goes FAR beyond the sorts of questions one
hears raised by demonstrators and in UN debates. For example:
- If Al Qaeda is down to merely 200 terrorists cadres and a
handful of wannabe franchises, what's all the fuss?
- The Middle East situation has never been worse. All hope for a
settlement between Israel and Palestine seems to have evaporated. The
energy should be focused on placing painful financial pressure on all
sides in that fight, forcing them to the negotiating table. Otherwise,
the ME may well explode. The war in Iraq is at best a distraction from
that core issue, at worst may aggravate it. Jordan's Queen Rania spoke
of the "desperate search for hope".
- Serious Islamic leaders (e.g. the King of Jordan, the Prime
Minster of Malaysia, the Grand Mufti of Bosnia) believe that the Islamic
world must recapture the glory days of 12-13th C Islam. That means
finding tolerance and building great education institutions and places
of learning. The King was passionate on the subject. It also means
freedom of movement and speech within and among the Islamic nations.
And, most importantly to the WEF, it means flourishing free trade and
support for entrepeneurs with minimal state regulation. (However, there
were also several Middle East respresentatives who argued precisely the
opposite. They believe bringing down Saddam Hussein and then pushing the
Israel/Palestine issue could actually result in a Golden Age for Arab
Islam.)
- US unilateralism is seen as arrogant, bullyish. If the U.S.
cannot behave in partnership with its allies -- especially the Europeans
-- it risks not only political alliance but BUSINESS, as well. Company
leaders argued that they would rather not have to deal with US
government attitudes about all sorts of multilateral treaties (climate
change, intellectual property, rights of children, etc.) -- it's easier
to just do business in countries whose governments agree with yours. And
it's cheaper, in the long run, because the regulatory envornments match.
War against Iraq is seen as just another example of the unilateralism.
- For a minority of the participants there was another layer of
AntiAmericanism that focused on moralisms and religion. I often heard
delegates complain that the US "opposes the rights of children", because
we block all treaties and UN efforts that would support sex education
and condom access for children and teens. They spoke of sex education as
a "right". Similarly, there was a decidedly mixed feeling about
Ashcroft, who addressed the conference. I attended a small lunch with
Ashcroft, and observed Ralph Reed and other prominent Christian
fundamentalists working the room and bowing their heads before eating.
The rest of the world's elite finds this American Christian behavior at
least as uncomfortable as it does Moslem or Hindu fundamentalist
behavior. They find it awkward every time a US representative refers to
"faith-based" programs. It's different from how it makes non-Christian
Americans feel -- these folks experience it as downright embarrassing.
- When Colin Powell gave the speech of his life, trying to win
over the nonAmerican delegates, the sharpest attack on his comments came
not from Amnesty International or some Islamic representative -- it came
from the head of the largest bank in the Netherlands!
I learned that the only economy about which there is much enthusiasm is
China, which was responsible for 77% of the global GDP growth in 2002.
But the honcho of the Bank of China, Zhu Min, said that fantastic growth
could slow to a crawl if China cannot solve its rural/urban problem.
Currently 400 million Chinese are urbanites, and their average income is
16 times that of the 900 million rural residents. Zhu argued China must
urbanize nearly a billion people in ten years!
I learned that the US economy is the primary drag on the global economy,
and only a handful of nations have sufficient internal growth to thrive
when the US is stagnating.
The WEF was overwhelmed by talk of security, with fears of terrorism,
computer and copyright theft, assassination and global instability
dominating almost every discussion.
I learned from American security and military speakers that, "We need
to attack Iraq not to punish it for what it might have, but
preemptively, as part of a global war. Iraq is just one piece of a
campaign that will last years, taking out states, cleansing the planet."
The mood was very grim.  If it hadn't been
for the South Africans -- party animals every one of them -- I'd never
have danced. Thankfully, the South Africans staged a helluva party, with
Jimmy Dludlu's band rocking until 3am and Stellenbosch wines pouring
freely, glass after glass after glass....
These WEF folks are freaked out. They see very bad economics ahead, war,
and more terrorism. About 10% of the sessions were about terrorism, and
it's heavy stuff. One session costed out what another 9/11-type attack
would do to global markets, predicting a far, far worse impact due to
the "second hit" effect -- a second hit that would prove all the world's
post-9/11 security efforts had failed. Another costed out in detail what
this, or that, war scenario
Would do to spot oil prices. Russian speakers argued that "failed
nations" were spawning terrorists --- code for saying, "we hate
Chechnya". Entire sessions were devoted to arguing which poses the
greater asymmetric threat: nuclear, chemical or biological weapons.
Finally, who are these guys? I actually enjoyed a lot of my
conversations, and found many of the leaders and rich quite charming and
remarkably candid. Some dressed elegantly, no matter how bitter cold and
snowy it was, but most seemed quite happy in ski clothes or casual
attire. Women wearing pants was perfectly acceptable, and the elite is
sufficiently
Multicultural that even the suit and tie lacks a sense of dominance.
Watching Bill Clinton address the conference while sitting in the hotel
room of the President of Mozambique -- we were viewing it on closed
circuit TV -- I got juicy blow-by-blow analysis of US foreign policy
from a remarkably candid head of state. A day spent with Bill Gates
turned out to be fascinating and fun. I found the CEO of Heinekin
hilarious, and George Soros proved quite earnest about confronting AIDS.
 David Stern (Chair of the NBA) ran up and gave me a
hug.
The world isn't run by a clever cabal. It's run by about 5,000
bickering, sometimes charming, usually arrogant, mostly male people who
are accustomed to living in either phenomenal wealth, or great personal
power. A few have both. Many of them turn out to be remarkably naive --
especially about science and technology. All of them are financially
wise, though their ranks have thinned due to unwise tech-stock
investing. They pay close heed to politics, though most would be happy
if the global political system behaved far more rationally -- better for
the bottom line. They work very hard, attending sessions from dawn to
nearly midnight, but expect the standards of intelligence and analysis
to be the best available in the entire world. They are impatient. They
have a hard time reconciling long term issues (global wearming, AIDS
pandemic, resource scarcity) with their daily bottomline foci. They are
comfortable working across languages, cultures and gender, though white
caucasian males still outnumber all other categories. They adore hi-tech
gadgets and are glued to their cell phones.
Welcome to Earth: meet the leaders.
Ciao,
Laurie
Daily Rotten will keep you posted as events warrant.
Fetish Maximus |
Rotten |
Faces of Death |
Famous Nudes
|


JAVASCRIPT QUIZ BOX
INSTRUCTIONS
Go through the questions and fill all before submiting.
If found copying your results will be cancelled.
1. Which link do we start with when linking bootstrap to the HTML page?(4mks):
bootstrap link
css link
I don't know
2. Which of the following is not a loop?(4 mks):
HTML
forEach
.map
3. What is Javascript ?(4mks):
Language used for styling.
Hyper text markup langauge
programming language.
Next
4. Why do we prefer to use dry code in our work when coming up with application ?(4mks):
To avoid repetion of codes and elements.
To stylish our work.
None above
5. What is a method as used in Javascript ?(4mks):
Is a classification of element.
Is an action.
I don't know
submit
PREV


cloud
hearing
directions
directions_car
Navigation for the Blind
Navigate public spaces!
Verbal Snapshots
Hear verbal photo descriptions!
"Take me home"
Request rides easily with Lyft integration!
Keep Moving Forward
Enhancing accessibility for visually impaired


US
starting at $10.99
On Sale
Product Descriptions
A small description of the product goes here.
Special Offer: 10% off


|
XenForo
1.5.12
|
Public Member Functions | |
| getLanguageById ($id, $fetchMaster=false) | |
| getAllLanguages () | |
| getLanguagesForAdminQuickSearch ($searchText) | |
| getLanguageTreeAssociations (array $languageList) | |
| getDirectChildLanguageIds ($languageId) | |
| getAllChildLanguageIds ($languageId) | |
| getAllLanguagesAsFlattenedTree ($baseDepth=0) | |
| getLanguagesForOptionsTag ($selectedId=null, $languageTree=null) | |
| getLanguageBaseParentList ($languageId) | |
| rebuildLanguageParentListRecursive ($languageId) | |
| rebuildLanguageGlobalPhraseCache (array $globalPhraseTitles=null) | |
| showMasterLanguage () | |
| getDefaultLanguage () | |
| getAllLanguagesForCache () | |
| rebuildLanguageCache () | |
| rebuildLanguageCaches () | |
| getLanguageFormatExamples () | |
| countMasterPhrases () | |
| countTranslatedPhrasesPerLanguage (array $languages=array()) | |
| getLanguageXml (array $language, $limitAddOnId=null, $getUntranslated=false) | |
| importLanguageXml (SimpleXMLElement $document, $parentLanguageId=0, $overwriteLanguageId=0) | |
| triggerLanguageRebuildDeferred () | |
| getLanguageIdFromCookie () | |
| Public Member Functions inherited from XenForo_Model | |
| __construct () | |
| setLocalCacheData ($name, $value) | |
| resetLocalCacheData ($name=null) | |
| getModelFromCache ($class) | |
| setAllowCachedRead ($allowCachedRead) | |
| fetchAllKeyed ($sql, $key, $bind=array(), $nullPrefix='') | |
| limitQueryResults ($query, $limit, $offset=0) | |
| addFetchOptionJoin (array &$fetchOptions, $join) | |
| getConditionsForClause (array $sqlConditions) | |
| getOrderByClause (array $choices, array $fetchOptions, $defaultOrderSql='') | |
| addPositionLimit ($table, $limit, $offset=0, $column='position') | |
| prepareLimitFetchOptions (array $fetchOptions) | |
| prepareStateLimitFromConditions (array $fetchOptions, $table='', $stateField='message_state', $userField='user_id') | |
| standardizePermissionsAndUserId (&$permissions, &$userId=0) | |
| standardizeNodePermissionsAndUserId ($nodeId, &$permissions, &$userId=0) | |
| standardizePermissionCombinationIdAndUserId (&$permissionCombinationId, &$userId=0) | |
| standardizeViewingUserReference (array &$viewingUser=null) | |
| standardizeViewingUserReferenceForNode ($nodeId, array &$viewingUser=null, array &$nodePermissions=null) | |
| unserializePermissionsInList (array $items, $serializedKey, $targetKey='permissions') | |
| getContentTypesWithField ($fieldName) | |
| getContentTypeField ($contentType, $fieldName) | |
| getCutOffCondition ($column, $condition) | |
| assertValidCutOffOperator ($operator, $allowBetween=false) | |
Protected Member Functions | |
| _getAllChildLanguageIds ($parentId, array $languageTree) | |
| _buildFlattenedLanguageTree (array $languageList, array $tree, $root=0, $depth=0) | |
| _rebuildLanguageParentListRecursive ($languageId, array $baseParentList, array $languages, array $languageTree) | |
| _getPhraseModel () | |
| Protected Member Functions inherited from XenForo_Model | |
| _getLocalCacheData ($name) | |
| _getDataRegistryModel () | |
| _getCache ($forceCachedRead=false) | |
| _getDb () | |
Additional Inherited Members | |
| Static Public Member Functions inherited from XenForo_Model | |
| static | create ($class) |
| Protected Attributes inherited from XenForo_Model | |
| $_cache = null | |
| $_db = null | |
| $_allowCachedRead = true | |
| $_localCacheData = array() | |
| $_modelCache = array() | |
|
protected |
Builds the flattened tree recursively, incrementing the depth each time.
| array | $languageList | List of languages and their information |
| array | $tree | Tree structure of languages ([parent id][] => language id) |
| integer | $root | Where to start in the tree |
| integer | $depth | Current/starting depth |
|
protected |
Internal handler to get call child language IDs.
| integer | $parentId | Parent language ID |
| array | $languageTree | Tree of languages ([parent id][] => language id) |
|
protected |
|
protected |
Internal function to rebuild the language parent list recursively.
| integer | $languageId | Base lanaguage Id |
| array | $baseParentList | Base parent list for the language. Should not include this language ID in it. |
| array | $languages | List of languages |
| array | $languageTree | Language tree |
| countMasterPhrases | ( | ) |
Returns the total number of phrases in the master language
| countTranslatedPhrasesPerLanguage | ( | array | $languages = array() | ) |
Counts the number of translated phrases in each non-master language
| array | $languages | Array of languages |
| getAllChildLanguageIds | ( | $languageId | ) |
Gets all children of a language ID, no matter how many levels below.
| integer | $languageId |
| getAllLanguagesAsFlattenedTree | ( | $baseDepth = 0 | ) |
Gets a list of languages in the form of a flattened tree. The return is an array containing all languages and their related info. Each language additionally includes a "depth" element that repesents the depth from the (implicit) master. Children of the master have a depth 0, unless $baseDepth is overridden.
| integer | $baseDepth | Starting depth value. |
| getAllLanguagesForCache | ( | ) |
Gets all languages in the format expected by the language cache.
| getDefaultLanguage | ( | ) |
Helper to get the default language
| getDirectChildLanguageIds | ( | $languageId | ) |
Gets a list of child language IDs that are direct children of the specified language.
| integer | $languageId |
| getLanguageBaseParentList | ( | $languageId | ) |
Gets the base parent list for a language. This list starts with the parent of the given language ID, then works up the tree, eventually ending with 0.
| integer | $languageId |
| getLanguageFormatExamples | ( | ) |
Generates the date and time format examples based on the current time.
| getLanguageIdFromCookie | ( | ) |
Fetches $languageId from cookie if it's available, or returns the default language ID.
| getLanguagesForAdminQuickSearch | ( | $searchText | ) |
Return results for admin quick search
| string | Keywords for which to search |
| getLanguagesForOptionsTag | ( | $selectedId = null , |
|
$languageTree = null |
|||
| ) |
Returns an array of all languages, suitable for use in ACP template syntax as options source.
| array | $languageTree |
| getLanguageTreeAssociations | ( | array | $languageList | ) |
Gets the parent => language associations from a flat list of language info.
| array | $languageList |
| getLanguageXml | ( | array | $language, |
$limitAddOnId = null , |
|||
$getUntranslated = false |
|||
| ) |
Gets the DOM document that represents a language file. This must be turned into XML (or HTML) by the caller.
| array | $language | |
| string | null | $limitAddOnId | If specified, only exports phrases from the specified add-on |
| boolean | $getUntranslated | If true, gets untranslated phrases in this language |
| importLanguageXml | ( | SimpleXMLElement | $document, |
$parentLanguageId = 0 , |
|||
$overwriteLanguageId = 0 |
|||
| ) |
Imports a language XML file.
| SimpleXMLElement | $document | |
| integer | $parentLanguageId | If not overwriting, the ID of the parent lang |
| integer | $overwriteLanguageId | If non-0, parent lang is ignored |
| rebuildLanguageCache | ( | ) |
Rebuilds the full language cache.
| rebuildLanguageCaches | ( | ) |
Rebuilds all language caches (including global phrase cache).
| rebuildLanguageGlobalPhraseCache | ( | array | $globalPhraseTitles = null | ) |
Rebuilds the global phrase cache for all languages.
| array | null | $globalPhraseTitles | List of phrases that should be included. If null, uses flag from phrase table. |
| rebuildLanguageParentListRecursive | ( | $languageId | ) |
Recursively rebuilds the parent list in part of the language tree.
| integer | $languageId | First language to start with. All child will be rebuild. |
| showMasterLanguage | ( | ) |
Helper to determine whether the master language should be shown in lists.


--- layout: archive title: Zulip Chat Archive permalink: /stream/113489-new-members/topic/is.20.22subtype.22.20injective.3F.html ---
if {x // p x} = {x // q x}, then is it true that p = q?
Pretty sure it's independent unless they're different sizes.
great, I just found another independent proposition
ZFC 1 : 0 Lean
Lean has loads of independent propositions like this
ZFC aleph[0] : 0 Lean
Equality of types is essentially "freely generated"; unless it's obviously true it's probably independent
of course there is a whole cottage industry built around alternative models that fit in this gap (see: HoTT)
the distance from axioms to independent statements is very short in lean:
inductive A. inductive B. example : A = B := independent
wait what
well I suppose it makes sense
so we can essentially have two copies of empty
and nobody will notice
also is there any way to create an inductive type?
inside a proof?
i.e. how much does Lean itself know about inductive types?
oh wait, I forgot to define equality
prelude inductive A. inductive B. inductive eqA : Type → Type | refl : eqA A example : eqA B := independent
lol
inductive types in lean are essentially an axiom schema
you have to write down the type specification, and then poof appears a new type constant
so they only work at the top level
I see
although you can always define a very general type and then narrow it down from inside a definition, i.e. defining a particular subtype of sigma of W type of whatever rather than writing a new inductive type
{% endraw %}Last updated: Apr 24 2020 at 19:02 UTC


Color
Size
Area
Name
Plan these Spaces
Click on the above data to edit the values. Add spaces using the form below.
Name:
Mean Span:
Total Area:
Color:
Create Space


You have typed in: {{ userInput }}
The weight in pounds is: {{ someNum * 2.20 }}
The button above has been clicked {{ counter }} times.
User name: "{{ userName }}"
Message prefixed with a title: "{{ prefixedMessage }}"


Name: {{character.characterName}}
Gender: {{character.gendar}}
Age: {{character.age}}
Body Form: {{character.bodyForm}}
Chest: {{character.chest}}
waist: {{character.waist}}
Url: {{character['url']}}


types.go | |
|---|---|
Copyright 2020 Red Hat, Inc Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. |
|
Package types contains declaration of various data types (usually structures) used elsewhere in the aggregator code. |
|
OrgID represents organization ID |
|
ClusterName represents name of cluster in format c8590f31-e97e-4b85-b506-c45ce1911a12 |
|
UserID represents type for user id |
|
ClusterReport represents cluster report |
|
Timestamp represents any timestamp in a form gathered from database TODO: need to be improved |
|
UserVote is a type for user's vote |
|
UserVoteDislike shows user's dislike |
|
UserVoteNone shows no vote from user |
|
UserVoteLike shows user's like |
|
RequestID is used to store the request ID supplied in input Kafka records as a unique identifier of payloads. Empty string represents a missing request ID. |
|
RuleOnReport represents a single (hit) rule of the string encoded report |
|
ReportRules is a helper struct for easy JSON unmarshalling of string encoded report |
|
ReportResponse represents the response of /report endpoint |
|
ReportResponseMeta contains metadata about the report |
|
DisabledRuleResponse represents a single disabled rule displaying only identifying information |
|
RuleID represents type for rule id |
|
ErrorKey represents type for error key |
|
Rule represents the content of rule table |
|
RuleErrorKey represents the content of ruleerrorkey table |
|
RuleWithContent represents a rule with content, basically the mix of rule and ruleerrorkey tables' content |
|
KafkaOffset type for kafka offset |
|
DBDriver type for db driver enum |
|
Internal contains information about organization ID |
|
Identity contains internal user info |
|
Token is x-rh-identity struct |
|
DBDriverSQLite3 shows that db driver is sqlite |
|
DBDriverPostgres shows that db driver is postgres |
|
DBDriverGeneral general sql(used for mock now) |
|
ContextKeyUser is a constant for user authentication token in request |
|
FeedbackRequest contains message of user feedback |
|
ReportItem represents a single (hit) rule of the string encoded report |
|
ClusterReports is a data structure containing list of clusters, list of errors and dictionary with results per cluster. |
|


Extensions
The following extensions are available globally.
-
Declaration
Swift
public extension CGSize
-
Declaration
Swift
public extension CGPoint
-
Declaration
Swift
public extension CLLocationCoordinate2D
-
Declaration
Swift
public extension CLLocation
-
Declaration
Swift
public extension CLLocationDegrees
-
Declaration
Swift
public extension NSAttributedString
-
Declaration
Swift
@frozen public extension Dictionary
-
Make UI Elements Localizable.
See more


§412:10-405 Applications. Except as provided in section 412:10-410, every application for a loan shall be made in writing upon a form prescribed by the credit union. Each loan shall be evidenced by a written document. [L 1993, c 350, pt of §1]


Issues List Example
Application Name
Subject
Description
Refference Path
Type
Assignee
Status
Actions


Project Office
Battery Amount
Column Amount
Elevator Amount
Floor Amount
Submit
Material Provider
Submit
Solution Manufacturing
Submit
Quality, Security and Homologation
Submit


Peer pairing is an industry practice in which two developers work at one computer simultaneously on the same code. One developer will assume the role of the navigator, directing and managing the overall input, while the other serves as the driver, manually writing the code. The latter is often making the more detailed choices around syntax, while the former is dictating what the code needs to do. It's a synergistic approach for collaboration, putting two eyes on the code for review in order to achieve the best code possible.
At Dev Bootcamp, we are expected to pair weekly in order to get more experience. Because students are spread across the U.S., we often collaborate through video conferencing and stypi, rather than working at the same station. Nevertheless, the roles of navigator and driver are the same.
For me personally, pairing has been a great way to learn and reinforce concepts. When I'm in the role of the navigator, it's usually a great opportunity to practice explaining to someone what I want the code to do or which methods I would like to use. I'm essentially getting more practice explaining my thought process and communicating clearly. As a driver, I often find that I'm getting more experience with syntax in Ruby, while also learning from the navigator new approaches or methods to tackle a problem. In general, I feel like I learn more from my pairing sessions than I do while working alone.
Some of our peer-pairing sessions are facilitated by a guide, who will answer questions if we get stuck and provide feedback on how we pair. I think it's great to get an outside perspective on how I work while pairing, especially feedback on how I can improve. In general, providing feedback is a big part of the Dev Bootcamp culture. For every pairing session, we are expected to provide feedback on our partner. As a rule of thumb, feedback is expected to be actionable, specific, and kind. This means that feedback provided has to be something our partner can act on in a constructive way. It also means there needs to be specificity to the feedback so they have a clear idea where they excelled and where they need improvement. The feedback also needs to be written in a way that is respectful.
When reviewing feedback I've received so far, the most common critique I receive is to timebox and work on syntax. My pairing sessions tend to run a little long, because I forget to establish a timebox for each piece of code so that we don't waste time on one part. As a Navigator, I'm relatively up-to-speed on what the code should do and the overall approach we should take, but as a driver, I find myself occasionally having to fix syntax errors or familiarize myself with syntax. As a result, I'm now working more on timeboxing, as well as syntax. In general, the feedback helps me stay mindful of how to communicate and work in a pairing session.
As meta-feedback, we also receive anonymous ratings on the feedback we provide to others. For the first feedback I wrote, I was unsure of how to address our session simultaneously with brevity and specifity, and I couldn't think of anything actionable my partner could do to improve. The meta-feedback I received on that particular one inspired me to make a more concerted effort to be specific about what was done during the session and what can be improved. In general, I strive to write kind feedback and avoid writing anything that is negative. I try to frame everything as a way to improve, while emphasizing aspects at which my partner excelled. I think the meta-feedback is great way of assessing how my tone is perceived in writing.


THREE COLOURS: BLUE [Spoilers] A film review by Gareth Rees Copyright 1993 Gareth Rees
France, 1993. Director: Krzysztof Kieslowski Starring: Juliette Binoche, Benoit Regent, Florence Pernel Music: Zbigniew Preisner Duration: 100 minutes
[spoilers]
Julie (Juliette Binoche) is happily married to rich and famous composer Patrice, and has a lovely young daughter. Within a couple of minutes of the opening of the film Julie's husband and child are killed in a car crash. Her life, that was once full of good things, is now empty, and Julie has to somehow learn to cope.
Her first reaction is to hide; she leaves her manor house and orders that all its furniture be sold; she rents an apartment in a slightly disreputable part of the city; she spends her time drinking coffee and trying to forget.
But she is unable to escape her husband's music. Just before his death, he was working on a commission for a grand symphonic chorus that would be played at a festival of European Unity. Whenever she is reminded of her husband, poignant extracts of this unfinished chorus appear to haunt her. She visits the archives and destroys the manuscript, but still the ethereal music follows her.
There are minor twists and turns (she meets her husband's mistress and befriends a stripper) but finally she is forced to come to terms with her bereavement by completing the chorus.
Stated barely like that, THREE COLOURS: BLUE sounds corny and unconvincing. But in fact it's a joy to watch; Binoche is very pretty and conveys very well the anger and frustration and resentment of her grief. The music is wonderful (composed by Zbigniew Preisner who composed the equally excellent music for LA DOUBLE VIE DE VERONIQUE), more so by the spareness of its use--the only times the film uses music are when brief extracts of the chorus visit Julie; at these times the characters seem to stop moving and the screen slowly fades to blue. The plot may not be exciting but that doesn't seem to matter; THREE COLOURS: BLUE is a simple film that left me wanting more.
THREE COLOURS: BLUE is the first of a trilogy of films by Kieslowski that will be dedicated to the three colours of the French flag and explore the themes of liberty, equality and fraternity.
.
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Groups are the standard way to organize objects hierarchically.
Snapshot objects are easily created using Corona's display.newGroup() factory method.
local group = display.newGroup( 200, 200 )
math.randomseed( 0 )
-- Add fish to the screen
for i=1,4 do
local fish = display.newImage( "fish.small.red.png" )
-- move to random position in a 200x200 region relative to group's origin
fish:translate( math.random( -100, 100 ), math.random( -100, 100 ) )
-- insert fish into group
group:insert( fish )
end
local halfW, halfH = display.contentCenterX, display.contentCenterY
group:translate( halfW, halfH ) -- Center group
transition.to( group, { alpha = 0, time = 2000} ) -- Fade out
When you modify a group’s properties, the children are affected. For example, if you set the alpha on a group, then each child’s alpha is effectively multiplied by that alpha of the parent group.
Groups automatically detect when a child's properties have changed such as position. Thus, on the next render pass, the child will re-render.
Transforms are applied hierarchically to the group's children. The child's transform is applied first, followed by the transform of its parent, followed by each ancestor, all the way to the stage.
Consequently, children in a group are positioned relative to their parent group's position. Consequently, when you modify the transform a group, it affects the transform of the children.
For example, if the group's x-position is increased by 100, then the child will appear to move by 100.
By defaults, groups do not honor anchor points. This is because children are normally positioned relative to the group's origin, so the location of the origin and the bounds of the children are not guaranteed to overlap, i.e. the anchor value would fall outside the range from 0 to 1.
Sometimes it's convenient to treat the children of a group as a single object and then anchor them like you would a single rectangle. This allows you to position the children relative to the group's origin.
You can do this by setting the following group property:
group.anchorChildren = true
By default, this property is false
. However, for containers, this property defaults to true
.
In this case, the children are all offset by the same amount. That offset is calculated by looking at the bounding box for all the children. In essence, the children are treated as if they were a single rectangle and the group's origin was the anchor point for that rectangle.
For example, if the group's anchor were (0.5,0.5), the children would collectively move so that their relative positions are preserved, but as a whole, they are centered about the group's origin.
You can use a special type of group called a [container][api.type.ContainerObject] if you need to work apply anchor points to a group-like object.
Place your group as a child of another group (we'll call this the 'parent group'). Changing the position, rotation, or scale of the parent group will produce similar behavior.
Corona will cull child objects that are outside the boundary of the screen.
Groups have an infinite boundary, so if the screen were infinitely large, the child objects would always be drawn.
A special type of group called [containers][api.type.ContainerObject] limit the boundary to a pre-defined region, so children are clipped by a dynamic rectangular mask.


CONTACT
FAQ
Buy
Unfog
yourself!
Foggy glasses? Never again.
READ MORE
CONTACT
FAQ
Buy
FOGOFF on the Go!
These comfortable straps enables you to carry the FOGOFF all day long - don't fogging leave home without it!
The Magic Beanie
Look fogging fly while removing the dew with exact precision!

Hate to sound sleazy
but this will make your life fogging easy!
BUY NOW!


Gift Guide 2019: The Best Host or Hostess Gifts
by Jordi Lippe-McGrawThe holidays are a festive time, and that means a lot of parties. Even if you’re not throwing one, you’ll likely attend a few and know the hard work that goes into planning a soirée. So why not say thank you to your favorite hostesses by bringing a little token of appreciation to the affair? To show your appreciation of the host or hostess, you want something practical yet elegant that also won’t break the bank. These products below check all of those boxes. Now thats something to toast to.
Moët & Chandon Nectar Impérial Rosé
The Maison of Moët & Chandon has launched Nectar of the Culture, in partnership with iconic cultural photographer, Jonathan Mannion. Mannion, a respected documenter of the “Golden Era” of Hip-Hop, is releasing a limited-edition custom-designed bottle of Moët & Chandon Nectar Impérial Rosé to honor the impact and accomplishments of the culture by way of the new pioneers and Mannion’s work. The bottle design is just as fun and playful as the champagne itself, and will surely brighten any holiday party.
DOIY Cheeseporn Cheese Board & Knives
Any good evening starts (or ends) with a cheese plate. So any partygiver would love a cheese board to make the presentation of the nibbles perfect. This one is made from acacia wood and includes pop-in stainless steel knives that make storage easy too.
WÜSTHOF Three-Piece Plum Handle Charcuterie Set
And what goes better with cheese than charcuterie? For the friend who loves to entertain, this set includes a 5-inch soft-cheese knife, 5-inch sausage knife and 4-inch pâté knife perfect for savoring all the pleasures of antipasti, cheese or pâté platter. Each knife features an elegant plum wood handle showcasing unique grain patterns.
Georg Jenson Sky Reusable Ice Cubes
This set of four reusable ice cubes made from stainless steel is great for a hostess gift because instead of worrying about ice getting low, you can just pop these out of your freezer. Not to mention, the unique design of them is guaranteed to be a conversation starter.
Thirstystone Black Marble Tray With Gold Handles
The best host needs to have the best tray. Between the gold stem handles and black marble, this will give an elegant, unique touch to the room or table.
Creative Home Natural White Marble Wine Cooler
Made with marble and a padded bottom to prevent scratching, this wine insulator will keep wine cool for hours. Not only is it practical, but the simple, chic design is guaranteed to look good in any home.
Jodie 384 Oz. Beverage Dispenser
A beverage dispenser is a creative and beautiful way to display and serve drinks to guests. The copper finish adds a touch of glam and is an easy way to elevate the look of a space. Plus, it helps hosts actually enjoy the party since they won’t be running around filling up drinks.
Tasty One Top By Cuisinart
When preparing a large meal, this Tasty One Top comes in handy as an extra burner. It’s a smart induction cooktop that connects to an app providing dual precision temperature and plenty of recipes.
Molton Brown Orange & Bergamot Hand Ritual Gift Set
Practical gifts can also be luxurious. Molton Brown’s three-piece gift set strikes that perfect balance by offering a hand wash, hand lotion and intensive hand cream. The signature fruity scent creates an elevated washroom experience, and guests will leave with their skin feeling nourished.
Create & Cultivate 2020 Planner
Create & Cultivate, the masterminds behind the hit conferences and summits for working women, teamed up with At-A-Glance to create a 16-piece collection of office accessories and planning tools. Whether you’re a working woman, a busy student or a hostess with a busy calendar, these supplies will keep you organized amid all the planning and goal-setting. The supplies are available exclusively at Target.
Nicolas Feuillatte Réserve Exclusive Brut NV
’Tis the season for giving, but that doesn’t mean you have to take out a second mortgage to say thank-you. The host or hostess in your life will be able to enhance any dinner party experiences by pairing the Réserve Exclusive Brut NV with smoked salmon toasts or 18-month Beaufort cheese for an exquisite taste.


[§572-23] Not liable for spousal debts. A married person is not liable for the debts of a spouse; nor is a married person's property liable to be taken on execution or other process against that person's spouse. [L 1888, c 11, §6; RL 1925, §2999; RL 1935, §4650; RL 1945, §12371; am L 1945, c 254, §2; RL 1955, §325-6; HRS §573-6; am L 1978, c 77, §1(1); ren L 1984, c 79, §1]
Case Notes
Wife who takes whole as surviving tenant by the entirety not liable for husband's debts. 47 H. 629, 645, 394 P.2d 432. See 3 H. 802.


{% extends 'components/shell.html' %} {% block content %}
This website is running Kemono 2, which is provided for free under the BSD-3 License.
Copyright 2020 kemono.party
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.


Copyright Bruce Wilcox<EMAIL_ADDRESS>www.brilligunderstanding.com
Revision 10/24/2022 cs12.31
ChatScript (CS) is a scripting language designed to accept user text input and generate a text response.
Chat proceeds in volleys, like tennis. The program inputs one or more sentences from the user and outputs one or more sentences back.
In most common usage, what you build is a chatbot, a program that takes input from a human and outputs a response. It converses with you. But I have also built a chatbot that is dedicated to reading a document. The input, in that case, is the entire document.
What, if any, output it generates is up to its program. My program was designed to find the table of contents, each chapter boundary, and where the index at the back was.
So, more broadly, ChatScript is a system for manipulating natural language, not just for building a chatbot.
This document is about how to write script. There is a more general discussion about how to think about authoring a bot in the paper Writing a Chatbot in the documentation.
ChatScript (CS) takes one or more input sentences from the user. A sentence in CS nominally means the sequence of words up until some sentence terminal token chars. By default these characters end sentences:
| dot | question mark |
exclamation point |
semi colon |
colon | hyphen |
|---|---|---|---|---|---|
. |
? |
! |
; |
: |
- |
E.g. the following user phrase is split in three sentences:
What's your name? My is Alfred; I'm from London.
One can also disable sentence ending.
ChatScript outputs one or more sentences back to user.
My name is Harry!
I'm a chatbot demo, from California (USA).
Fundamentally a script is a series of rules.
A full rule has a kind, a label, a pattern, and an output. Here is a simple full rule:
?: MEAT (you like meat) I do
The rule kind is ?:
, which means it only reacts
to questions. The label is MEAT
. The
pattern is in (
)
and looks to find
the words you like meat in consecutive order, anywhere in the input,
e.g. do you like meat. The output is I
do.
The kind restricts when the rule can be tried. You can restrict rules to statement inputs, question inputs, or only when the bot takes control of the conversation and wants to volunteer something (gambits). Kinds are a letter follow by a colon.
The label is optional and is partly a documentation and debugging aid and allows this rule to be manipulated by other rules.
A pattern is a set of more specific conditions which allow or disallow this rule, usually trying to match words of the current input sentence, but sometimes taking into account the prior history of the conversation, the time of day, or whatever.
The output is what this rule does if allowed to execute. Since the goal of the chatbot overall is to generate a response, the simplest output is merely the words to say. More complex outputs can do conditional execution, loops, function calls, etc.
The system normally executes rules in a specified order until one not only passes the kind and pattern restrictions, but also actually generates output destined to reach the user. Once one has output, the system is done (unless you explicitly want to do more).
Rules are bundled into collections called topics.
You tell the system to execute a topic, and it begins executing rules in that topic until it generates an output.
Topics can invoke other topics. Exactly how to process an input is controlled by a control script which itself is a topic. It calls engine functions and conditionally executes other topics.
ChatScript reads ordinary ascii text files and UTF-8 files. It does not read UTF-16 files correctly.
ChatScript generally ignores excessive white space. You can have a plethora of tabs, spaces, and newlines.
E.g. the rules:
?: (When will you die) I don’t know.
and:
?: ( When will you die )
I don’t know .
are interpreted in the same way.
But, you do have to use whitespace to separate tokens.
ChatScript is case insensitive for code script. Obviously case is important in literal output.
And words in patterns should be lower case unless they are proper names or the word “I”.
NOTE: Don’t make a lowercase word be upper case in a pattern merely because you think of it as starting a sentence.
The comment character is the hash mark #
.
It extends to the end of the line. Ordinary comments must have at
least one space after them, to allow the system to distinguish comments
from numeric constants like #NOUN
# this line is a comment
s: (I hate meat) So do I. # a comment at the end of an output statement
There are special documentation comments that start with
#!
described elsewhere.
#! I hated meats
s: (I hate meat) really?
A topic or function (defined later) must contain
only alpha-numeric characters, underscores (_
), hyphens
(-
), and periods (.
). They must begin with
tilde (~`) and then continue with a starting alphabetic character.
Variables must start with $
or $$
or $_
, then continue with a starting alphabetic character
and then continue with alpha-numerics, underscores, or hyphens.
Let’s turn to running the system in a simple demo.
Windows
Download and extract on a windows
system into a directory (mine is called ChatScript), keeping files in
their respective folders. Double click on the
chatscript.exe
file in BINARIES folder.
Linux
To run on a Linux system is not really
much different. Download and extract into a directory in Linux, keeping
the files in their folders. The executable that ships with the product
is LinuxChatScript64
(64-bit version) in BINARIES folder.
You need to alter permissions to make it executable. Also, the Linux
version defaults to server mode, so you should run it as:
BINARIES/LinuxChatScript64 local
This will NOT work if you have a 32-bit Linux and you will need to
recompile on your machine. See
Installing and updating ChatScript
manual.
MacOs
With MacOS the executable file
changes:
BINARIES/MacChatScript local
The system prints out a bunch of statistics as it loads data. After which is says:
Enter user name:
Select a user name. It’s arbitrary, but it’s how the system knows you are you when you start up again later. The system will respond with the message:
Welcome to ChatScript
Now enter: What is your name? - you get My name is Harry if you type this correctly. You can also ask How was your childhood? and what are you afraid of and what is your history.
Actually, you can say or ask anything and get an almost reasonable response because Harry has quibbles. If he knows nothing specific on your topic (which is almost universally true), he can stall and quibble instead. So you can have a conversation about anything.
OK. Now you’ve run what comes pre-installed.
If you want to learn about the simple Harry bot and try changing it, read the BOTHARRY document. Same if you want to build your own bot (starting by cloning Harry). Let’s quickly survey what comes built in.
RAWDATA/HARRY/childhood.top
)Chatscript is so easy, a child could master it in seconds. And if you believe that, I have several bridges available for sale to you on special. But some people will try to dive right in, without reading the material, so here is a quick guide to what you see in this simple topic file.
Rules start with t:
or ?:
or
u:
or s:
or v:
s:
means the rule reacts to statements.?:
means the rule reacts to questions.u:
means the rule reacts to the union of both.t:
means the rule offers a text gambit when
chatbot has controlv:
means the rule is void and never executed except
indirectly vis ^refine or ^reuseRules also start with a:
b:
etc, but those
are rejoinders, not top level rules. They are used to
anticipate how a user might respond to output and give direct feedback
based on that response.
Rules are thus classified as:
| rule type | syntax | description |
|---|---|---|
| responders | s: ?: u: |
which are rules that try to react to unprovoked input from the user. That is, he might out of the blue ask you something or say something, and these attempt to cope with that. |
| rejoinders | a: b: c: d: e: f: g: h: i: j: k: l: m: n: o: p: q: |
are attempts to predict a user’s immediate response to something the chatbot says. They cannot be triggered except on input immediately after the rule they follow has issued output. |
| gambits | r: t: |
are the story the chatbot wants to tell on a subject or the
conversation the chatbot is trying to steer the user into.
r: are random gambits (explained
later). |
| void | v: |
are only accessed via ^reuse and ^refine and ^setrejoinder. |
Rules usually have pattern requirements in parens (except gambit
t:
rules for which a pattern is optional and void
v:
who use an empty pattern). These typically try to find
specific words or sequences of words in the user’s input. In the
rule:
u: (run away)
the engine will see if the word run can be found anywhere in the
sentence, and if so, is it immediately followed by the word away.
Whenever you see [...]
it means pick one of. So
u: ([scare afraid])
means find anywhere in the sentence one of the words scare or afraid. And scare can be in any of its related forms: scared, scare, scaring, scares.
In the sample file you will see ordinary words and
~words
. Tilde words refer to a concept set of words, a list
of words that approximates the ~word
. E.g.,
~like
means any of a number of words that mean to like
something.
~animals
means any of a large list of names of
animals.
These are shareable shorthand for the [
]
notation. Instead of having to write
[elephant tiger leopard alligator crocodile lion …]
in lots
of rules, with the appropriate concept defined one can merely say
~animals
.
Rules are always bundled into topics, like the topic:
~childhood
. Topics have a list of relevant keywords
following the topic name. After that, rules come in any order. The
gambits, t:
lines, offer a story or expected conversation
flow.
If you ask for information in a conversation, you are expected to balance the scales by giving information. For example if you ask what someone does for a hobby, you are expected after their response to answer the question about yourself. As in:
topic: school [school university learn]
t: Where do you go to school?
t: I go to Harvard.
t: What is your major?
t: I am studying finance.
Of course one is often expected to respond to the user’s response. So if he answers where do you go to school by saying the university of Rochester, it helps if you can make some cogent rejoinder on that BEFORE you gambit say I go to Harvard.
topic: ~school [school university learn]
t: Where do you go to school?
a: (Rochester) That's a great school.
t: I go to Harvard.
t: What is your major?
t: I am studying finance.
And your topic has to be ready to handle arbitrary school-related questions from the user.
If he says I go to Yale. What was your school mascot?, you’d like to have added responders that could field the mascot question before you move on to volunteering you went to Harvard.
This is what the simple topic on childhood attempts to do. Ask gambit questions, respond with appropriate remarks to their response, offer the chatbot’s answer to the gambit, move on, and handle some simple questions asked out of the blue on the topic.
Comments start with #
. In a file a #
issued
only once on a line is an ordinary comment.
Special comments #!
give sample input from a user that
the immediately following rule is expected to match and handle. This
both documents what input is expected to match the rule below AND allows
the engine to automatically test it.
The special comment gives only one example of matching input, not all possible inputs that can match. It helps you understand what a responder or rejoinder is supposed to react to. It has no impact whatsoever on a user in chat.
| Directory | files |
|---|---|
| BINARIES | Executable Files. All executables are in the BINARIES folder. The system assumes they are launched from there (is the current working directory) and changes directory up a level to access all the other folders. |
| USERS | History Files. Each user’s conversation is tracked by the system and kept in files in the USERS directory. A user can return to chat with a personality days later, and the system knows what has happened in previous conversations and that this is the start of a new conversation. The system keeps a log file per user recording their conversations for the author (CS does not use this file, it merely records it), and a topic file for each user-chatbot pairing, where it stores the current state of conversation for the engine. If the script records facts about the user during conversation, these are also stored in the topic file. |
| DICT | Dictionary Files. The DICT folder is the underlying dictionary of the system. You probably won’t modify it. It has a subfolder ENGLISH which is a full dictionary it uses normally. If you are trying to run on a mobile device, you probably want to copy over the contents of BASIC into ENGLISH, to use a smaller dictionary |
| LIVEDATA | Dictionary Extension Files. The LIVEDATA folder contains extensions to the dictionary and run-time system that you might change as an advanced author. |
| RAWDATA | Knowledge Files. The RAWDATA folder is where raw data to support chat is kept (though you can keep it anywhere since it’s not compiled into the engine). There are folders for HARRY, ONTOLOGY, WORLDDATA, STOCKPILE, NLTK, POSTGRES and QUIBBLES. Normally when you define a chatbot, you add a folder with the name of your chatbot. That way you can just swallow updates to the main system whenever a new release is created. |
| TOPIC | That data is run through the script “compiler” and the output is stored in the TOPIC directory, which holds your compiled script data. |
| VERIFY | If your script has verification data embedded in it (#! sample inputs), which allows the system to prove your patterns actually do what you intend, that data is stored in the VERIFY directory after compilation. |
| SRC | Source Files. src is source for rebuilding the engine. It has a file dictionarySystem.h which is read during loading to define engine constants that can be used in scripting. |
| WIKI | Documentation Files. This document and others can be found in WIKI. |
| LOGS | If ChatScript detects bugs during execution, it stores them in bugs.txt in this folder. A server will also store its log here. |
| Compilation Files | The folders LINUX, MAC, and VS2010 are for rebuilding the executable engine. LOEBNERVS2010 builds a Loebner contest version. |
| Top Level Files | Aside from the chatscript.exe, the following top level files
exist:authorizedIP.txt - as a server, this allows some
users to enter commandschanges.txt - list of changes
between releasesversion.txt - the current versiontalk.vbs - script to enable voice output in windows |
| REGRESS | Files that can do regress tests of various kinds are here. |
| Server Batch Files | files for windows that can run the engine as a local server or a local client. |
| Third Party Tools | reference to some ChatScript third party tools. |
| TMP | transient files used to support debugging are kept here. |
The system does not execute all rules. Nor do you directly choose a rule to execute. Instead, you (the author) organize collections of rules into topics and the system chooses what topic to execute at any moment. It, in turn, executes its rules.

The topic declares its name, its keywords, and then its rules. It
ends with the end of the file or a new top level declaration (which
includes topic:
, concept:
,
table:
, tablemacro:
,
outputmacro:
, patternmacro:
,
dualmacro:
, bot:
, data:
,
canon:
, query:
, plan:
,
describe:
, word:
, and
replace:
).
A topic name must start with a ~
, an alphabetic
character, and then be a standard legal name (contains only
alpha-numeric characters, underscores, hyphens, and periods).
Keywords allow the system to consider this topic based on matches with the user input.
If the user input has no keywords in common with the topic, then normally the topic and all its rules will not be considered.
User sentence keywords trigger the closest matching topic (based on number and length of keywords) for evaluation.
If the engine can find a matching responder, then it shifts to that
topic and replies. Otherwise the engine tries other matching topics.
Eventually, if it can’t find an appropriate responder, it can go back to
the most relevant topic and just dish out a gambit (the t:
rule).
It doesn’t matter if the new topic has responders that overlap some
other topic’s responders (both could match the input). You can have a
topic on ~burial_customs
and another on
~death
. An input sentence I don’t believe in death
might route you to either topic, but that’s reasonable.
If you are in the middle of some topic and the user says something unrelated, then the system will hunt for a topic that matches keywords of the input and see if some matching topic has a responder to react to the input. If so, the system will switch to that topic.
The new topic becomes the active topic and the old topic becomes pending, put on a list of topics to return to when the new topic becomes exhausted. This behavior is the default behavior and you can script other behavior by creating a control script to do so (advanced).
Topics make it easy to bundle rules logically together. Topic keywords mean the author can script an independent area of conversation without regard to pre-existing script and the system will automatically find it and invoke it as appropriate.
Topics do not have to have keywords. But if a rule in that topic is going to be considered, either the topic has keywords that can be found in the pattern of that rule, OR, the topic is already the current topic (some other rule had keywords in its pattern that also were topic keywords and got you entry into the topic) OR, the topic was directly called by the control script or some other topic.
In addition to responders for user input (s:
?:
u:
) a topic can have gambits to offer
(t:
).
Gambits create a coherent story on the topic if the bot is in control of the conversation.
Yet if the user asks questions, the system can use a responder to
either respond directly or reuse a gambit it was going to volunteer
anyway. It is entirely up to you the order of responders and gambits.
You can segregate s:
from ?:
from
u:
or co-mingle them.
You can have responders intermixed with gambits.
What does it mean for the chatbot to be “in control” of the conversation?
When the user types in a statement or question, the system will see if it has a rejoinder or a responder that directly matches the input. If it does, it will respond with that. That forced response means the human was in control of the conversation. If, however, the chatbot cannot find a response for the input, then the chatbot is free to say whatever it wants. It is in control.
Maybe it will issue a gambit from the topic it was last in. Maybe it will make a gambit from a topic closely related to the user’s input. Maybe it will try to steer the conversation to a specific new topic. All that is controlled by the logic of the control script (of which there is a default one supplied with ChatScript but which you can author yourself).
The typical gambit does not have a label or a pattern component. It could have them. It just usually is the rule type and the output data.
A topic is executed in either gambit mode (meaning
t:
lines fire) or in responder mode (meaning
s:
?:
and u:
fire). Rules are
placed in the order you want them to be tried.
For gambits, the order tells a story.
For responders, rules are usually ordered most specific to least specific, possibly bunched by a theme. So a responder trying to catch what color is your hair would be before one that simply would react to any reference to your hair.
By default, the system avoids repeating itself, marking as used-up rules that it matches that generate output. This is how a topic story gets told. It outputs the first gambit, marks it used, and then next time it will output the second gambit and mark it used, and so on.
Similarly, a responder that reacts to an input will give its message and then erase itself. If the user repeats his input, that rule cannot respond again, and some other rule will have to answer.
If you created .top files for various topics with rules and dropped
your file into the HARRY folder
and rebuilt the bot (:rebuild Harry), you’d have a chatbot.
If you expect the user might respond in a particular manner to the chatbot’s last output, you can script rules to examine his next input and see if it matches. When it works, it makes your chatbot seem like it understands the user. These are called rejoinders and all rules can have them.
s: ( I like spinach ) Are you a fan of the Popeye cartoons?
a: ( yes ) I used to watch him as a child. Did you want to date Olive Oyl?
b: ( no ) Me neither.
b: ( yes ) She was tall for a woman.
a: ( no ) What cartoons do you watch?
b: ( none ) You lead a deprived life.
b: ( Mickey Mouse ) The Disney icon.
Rejoinders use a:
through q:
to indicate
nesting depth.
All rejoinders at a level have the same letter and are alternatives that will be tested in order. So, after the chatbot asks are you a fan… it will test the next input for yes and then no. As soon as it finds a matching rejoinder, it will execute it and be done. If it finds none, then the system just moves on to its normal behavior.
Rejoinders can have rejoinders, as shown above. Indenting like above is good style, making it visually obvious in your script.
All rules (responders, gambits, rejoinders) can have labels on them. Labels have a variety of uses. Other rules can use functions that target a particular labeled rule. You can use the debug abilities to test that rule and you can see that rule more easily in a trace. And you get a kind of documentation telling you what your rule is about.
A label is a single word placed between the rule type and the pattern. If the rule is a gambit and you want to add a label, you must add a pattern, even if it is only empty parens.
t: MY_EYES () My eyes are blue
?: EYECOLOR (color * eyes) I have blue eyes
u: GLASSES ([glasses contacts]) I don't wear glasses, but I do have contacts.
?: BLIND (you * blind) I am not blind.
?: COLORBLIND (you * [color-blind "color blind"]) I am not color blind.
Note, ChatScript is a token-oriented language (tokens generally being
a collection of characters without spaces). You need to put one or more
spaces after the :
and before the label.
?:EYECOLOR
is a single token and not a declaration of a
rule and a label.
Also, while you can use any case you want in the rule label, internally ChatScript will convert it to full uppercase. Routines that deal with rule labels know this so you don’t have to care. All uppercase rule labels stand out more easily in traces and in script source and are considered good form.
The childhood.top
file has an example topic called
~childhood
of normal complexity (which can be understood
after reading through advanced output).
As stated previously, a rule cannot fire unless its pattern matches, and a pattern in a rule is encased in parens (which means find the items within it in sequence).
Writing patterns is a delicate balancing act. If you are too specific, the pattern will miss all sorts of opportunities to respond to similar meanings. If your pattern is
?: (when will you go home) I go home tomorrow
and the input is When will you be going home, the bot fails to react. But if your pattern is too broad, the bot responds to completely wrong meanings. If your pattern is
s: (home) I go home tomorrow.
then it reacts to He slid home inappropriately.
(
)
I said that parens mean in sequence, anywhere in the input. Thus
s: (I love you) Do you really?
matches How I love you! and I love you and your kind and Everyone knows I love you. You can even nest parens within parens, not that it has any functional utility.
s: (I (love you)) Do you really?
This pattern is equivalent to the earlier one without nested parens. Whereas the outer parens can start their first element matching anywhere in the sentence, once a positional context has been established, that gets inherited. Thus after I is matched, the starting context of the inner opening paren is that the next element must match in position 2 in the sentence, immediately after I.
Another way to request a sequence is to put double quotes around it.
s: ( "I love you" ) Do you really?
There are two reasons to use double quoting. First, if you are trying to shoe-horn a phrase into a place that expects a word. For example, as a topic keyword you could do this:
topic: ~death ["to die" "cross over"]
Second, when trying to write words where you are not sure how the system will tokenize it and whether it is one word or a sequence of words.
Tokenization involving punctuation can be tricky. For example, the word Bob’s is actually tokenized as two words: Bob ’s . And in Wordnet, New_Year’s_Eve is a single word.
You might not know that, but anytime you think of something as multiple words, you are safe quoting it (writing “New Year’s Eve”) and letting ChatScript manage how it is stored internally. This is particularly true of names of people, titles of books and other multiple-word proper names.
Put things with punctuation in them in double quotes to be safe. Pattern matching a sequence is limited to 5 words in row and will do both original and canonical forms.
<
and >
Sometimes, to get a proper meaning in the pattern, you need to actually know where an input begins or ends. For example:
u: ( what is an elephant ) An elephant is a pachyderm.
matches Tell me what is an elephant and what is an elephant and what is an elephant doing in the room. That last one is inappropriately matched.
The >
matches the end of the sentence. This makes it
possible to correctly manage the above sentences as follows:
u: ( what is an elephant > ) An elephant is a pachyderm.
The <
doesn’t really match the start of the sentence
so much as it sets the current position of matching to the start of the
sentence. Thus
u: ( roses < I like ) I like roses too.
matches I like roses because it finds roses anywhere in the
sentence, then the <
resets the match position to the
sentence start, and then it finds I like at the beginning. Of course
this will not match You know I like roses because I is not at
the start of the sentence.
*
The wildcard *
means 0 or more words in sequence. It can
be used to widen a pattern:
?: (when * you * home) I go home tomorrow
This pattern responds to When will you go home? and When Roger is with you, will there be anyone at home?
*n
As you may notice, indefinite wildcards can allow all sorts of
mischief to creep into a match. An overprotective way to manage this is
using wildcards that tell you exactly how many words can be swallowed
up. The *
followed by a number names how many words it
absorbs.
?: (when *1 you *1 home) I went home yesterday
This matches When did you go home? but won’t accept wide
variances like When Roger is with you, will there be anyone at
home? nor will it accept when you went home which hasn’t
room for the first *1
.
*~n
The usual way to manage the excesses of the previous wildcards is to
use a range restricted wildcard. This is an *
followed by a
~
and a number, like *~3
. It means from 0 up
through that number, or approximately that number.
A common choice is *~2
. This leaves room for some filler
words (like a determiner and an adjective or perhaps some kind of
adverb), without requiring them or letting the sentence stray.
?: (you *~2 go *~2 home) I often go to that home.
This responds equally to You can go home and you should not go to your home.
<<
>>
Often times you are interested in matching several keywords, but you explicitly want any order of them. For example the sentence I love birds is a lot like Birds are what I love but subject and object move around. One somewhat tedious way to match in any order is:
s: ( I < * love < * birds ) I love birds too.
This works by going back to the beginning of the sentence and allowing any number of words to match a wildcard until the next keyword is found. It’s ugly. The cleaner way is to use the unordered markers.
s: ( << I birds love >> ) I love birds too.
Since the words can be matched in any order, this resets the scanning mechanism back the original starting condition, which is always < * meaning you can match the next the next item anywhere in the sentence.
Position is freely reset to the start following the
<<
>>
sequence so if you had the
pattern:
u: ( I * like << really >> photos)
and input photos I really like then it would match because
it found I * like
then found anywhere really and
then reset the position freely back to start and found photos
somewhere in the sentence.
[
]
You can match alternate words in the same position by placing those choices in brackets.
?: (you [swim ride fish ]) I do.
This matches Do you swim and Do you fish and do you ride. Choices may be significant alternatives or they can be synonyms.
?: (you [eat ingest "binge and purge" ( feed my face ) ] *~2 meat) I love meat
Notice that elements of a choice can be sequences of words either as double-quoted phrases or as paren sequences.
~
ConceptsChoices are handy for synonyms, but you have to repeat them over and over in different rules. At such point being able to declare a list of choices in one place and use them everywhere else becomes convenient. This is the concept set. It is hugely important in writing patterns that match meaning.
concept: ~eat [eat ingest "binge and purge"]
A concept is a top-level declaration consisting of a name starting
with ~
and consisting of only alpha-numeric characters and
underscores. A concept has a list of words it defines. You can use the
set name in any pattern or topic keyword list in place of a word.
s: (I ~eat meat) Do you really? I am a vegan.
Think of the ~
as meaning approximately. Topic names are
also concept names, with the keywords of the topic being the
choices.
ChatScript can represent word synonyms as above or affiliated words as below.
concept: ~baseball [strike umpire ball bat base ]
# some topic declaration
s: (~baseball) I’m not that into sports like baseball.
A concept can also represent a natural ordering of words that an advanced script can use. The ordered concept below shows the start of hand ordering in poker.
concept: ~pokerhand [ "royal flush" "straight flush" "4 of a kind" "full house" ]
The pattern:
?: ( which * better * ~pokerhand * or * ~pokerhand ) …
detects questions like which is better, a full house or a royal flush and the system has functions that can exploit the ordered concept to provide a correct answer.
You can nest concepts within concepts, so this is fine:
concept: ~food [ ~meat ~dessert lasagna ~vegetables ~fruit ]
Hierarchical inheritance is important in pattern generalization. Concepts can be used to create full ontologies of verbs, nouns, adjectives, and adverbs, allowing one to match general or idiomatic meanings.
The system comes with such already defined, you just have to activate
it. If you give the command :build 0
to the chatbot, you
will build the underlying ontology and world knowledge of the system.
Then you can explore the existing sets.
In addition to fixed sets (over 1600 of them), the system
automatically defines a bunch of dictionary-based sets. These include
parts-of-speech like ~noun
as well as general open concepts
like ~number
.
For a full list, see the ChatScript System Variables and Engine-defined Concepts manual.
However you type your input, with or without capital letters, the system tries to figure out the word you actually mean.
 You mean can I go back, and so that is what the system sees.
This means when you write patterns, you do not write capital letters on first words of sentences. You only write them for proper nouns. So this pattern:
u: ( Can I go back )
is wrong and will not match anything and should be
u: ( can I go back )
ChatScript automatically expands contractions. DO NOT put contractions in your patterns. You will break the expansion of that contraction.
You should always put multiple-word proper names in double quotes, particularly ones with embedded punctuation. You want CS to know that the entire phrase is considered a single entity. So
u: ( "Dr. Watson" )
u: ( "The Beatles" )
Some words and phrases have interpretations based on whether they are at sentence start or not. E.g., good day, mate and It is a good day are different for good day. Likewise sure and I am sure are different.
Words that have a different meaning at the start of a sentence are commonly called interjections.
In ChatScript these are defined by the interjections.txt
file (for English language, see interjections.txt).
Also there are some in the texting.txt
file.
In addition, the file augments this concept with discourse
acts, phrases that are like an interjection. All interjections and
discourse acts map to concept sets, which either come through as the
user input instead of what they wrote or will merely be marked as
interjections, leaving the words unchanged (see interjections in
Practicum - Spelling and Interjections
).
For example yes and sure and of course are
all treated as meaning the discourse act of agreement in the
interjections file.  The
interjections file will remap that to the sentence ~yes
,
breaking off that into its own sentence, followed by I will go
as a new sentence.
These generic interjections (which are open to author control via
interjections.txt
) are listed in the ChatScript
System Variables and Engine-defined Concepts manual.
If interjections at the start of a sentence are broken off into their own sentence (as they used to be by default but are no longer), this kind of pattern does not work:
u: ( ~yes _* )
You cannot capture the rest of the sentence here, because it will be part of the next sentence instead. This means interjections act somewhat differently from other concepts. If you use a word in a pattern which may get remapped on input, the script compiler will issue a warning. Likely you should use the remapped name instead.
But you can turn off this behavior and then the above pattern works perfectly well.
The system actually assists you in generalizing your patterns. It simultaneously matches both the original word and a canonical form of it if your pattern word is in the canonical form. And it checks both lowercase and uppercase forms of your words. For nouns, the canonical form is the singular. So if your pattern is:
?: (dog) I have a cat
this will respond equally to I like dogs and I have a dog. Whereas the pattern
?: (dogs) I have a cat
will only respond to I like dogs but not to I have a dog.
For verbs, the canonical form is the infinitive tense. If your pattern is:
?: (be *1 correct) Yes.
This will respond equally to Was it correct? and Are you correct? and Is she correct?.
'
and 's
transform to
the word 's
.The file canonical.txt
in LIVEDATA controls lots of
these.
If the system sees & in the input, it changes it to and. It also changes _ to '_.
ChatScript’s simple concept below accepts all tenses and conjugations of the listed verbs:
concept: ~be [ be seem sound look ]
If you put an apostrophe in front of a word or use words not in canonical form, the system will restrict itself to what you used in the pattern:
u: ( I 'like you ) This matches I like you but not I liked you.
s: ( I was ) This matches I was and Me was but not I am
The same is true for concepts:
u: ( '~extent_adverbs )
!
And NotNot
!!
And NotBefore !-
The absence of words is represented using !
and means it
must not be found anywhere after the current match location. When placed
at the start of the pattern, it means not anywhere in the sentence at
all:
u: ( ![ not never rarely ] I * ~ingest * ~meat ) You eat meat.
u: ( !~negativeWords I * ~like * ~meat ) You like meat.
While !
Checks for the entire rest of the sentence,
!!
checks just the next word from where you are. So
u: ( test !!this) I win
Will match input test that this works and not match test this works.
!-
checks for the entire prior part of the sentence,
so
u: ( test !-this) I win
Will match input test that this works and not match This test works.
{
}
Sometimes you can expect a word might or might not be supplied. Your
pattern can reflect this and swallow it when present. {``}
is just like choice [``]
, except the match is optional. It
is allowed to fail.
?: ( how hot is ~number {degree deg} Farenheit ) Sounds hot.
s: ( define {(the word) (the meaning of) } *1 > ) Sorry. I don’t know it.
Note how we didn’t have to say degrees in the optional list, because that automatically is handled by using the canonical degree.
If you want to test for a sequence of optional words, you can do two things:
u: ( {are} {you}{going} home )
or
u: ( {"be you go"} home )
In a quoted phrase, you can use either all canonical or all exact forms. And you can do a quoted phrase of 4 words long (but not longer).
You can issue commands to the system (prefix is colon) to inquire
about things, control things, debug things, etc. In this simple section,
we look at commands to examine words and their relationship to
themselves and concepts. All commands are invisible to normal chat in
that they do not affect the user’s state of processing chat. A list of
all commands can be gotten by typing :commands
.
Documention on most of them is in the ChatScript Debugging Manual.
:word word
dumps the dictionary and fact and concept information about the word.
It displays everything the system knows about the given word- its parts
of speech, attributes like it is a singular noun, what dictionary
meanings it has, and what sets and facts it participates in directly.
Just type in something like :word tennis
:up word
While :word
is interesting, for the purpose of matching,
the :up
command is more useful, because it tells you how
this word participates in sets all the way up the inheritance hierarchy
both of concepts and of Wordnet, so any set listed by this would be
recognized if the word given as argument is used.
Suppose you are creating the concept of ~buildings
. Just
think of a word you want to include, like temple,
>>:up temple
For temple:
Set hierarchy:
~religious_buildings
~building
~tool
~locatedentity
~there
~immovable
~functions
~enterable
~artifacts
~objects
~nounlist
~human_data
Wordnet hierarchy:
temple~1:N the place of worship for a Jewish congregation
is house_of_worship~1 any building where congregations gather for prayer
is building~3 a structure that has a roof and walls and stands more or less permanently in one place
is structure~1 a thing constructed
is artifact~1 a man-made object taken as a whole
is whole~1 an assemblage of parts that is regarded as a single entity
~entirety_words
~goodness
is object~1 a tangible and visible entity
~verbal_disagree
is physical_entity~1 an entity that has physical existence
is entity~1 that which is perceived or known or inferred to have its own distinct existence
~nounroot
temple~2:N place of worship consisting of an edifice for the worship of a deity
is house_of_worship~1 any building where congregations gather for prayer
temple~3:N an edifice devoted to special or exalted purposes
is building~3 a structure that has a roof and walls and stands more or less permanently in one place
temple~4:N the flat area on either side of the forehead
is feature~2 the characteristic parts of a person's face: eyes and nose and mouth and chin
~focus
is body_part~1 any part of an organism such as an organ or extremity
is piece~11 a portion of a natural object
~unitmeasure
is thing~1 a separate and self-contained entity
is physical_entity~1 an entity that has physical existence
If we are trying to build a concept of buildings, then
temple~1
, temple~2
, and temple~3
are definitions that make sense (:N just names the part of speech). But
notice on the up path that those definitions all come from
building~3
, and that using that would make sense and
encompass everything that Wordnet considered a building in that
sense.
:down word limit
takes a word and chases down its hierarchy showing what inherits from
it. Limit is how many levels down to go (default is 2) since going down
can expand into a lot of choices for some words. If the word is a
concept or topic name, it displays its top level members.
:down entity 1
or :down ~animals 2
.
The goal of the engine is to generate output to display to a user. When a rule does that, it has accomplished the goal of the topic.
To generate simple output, just put the text you want to display after the pattern component of a rule. Gambits do not have to have a pattern component, in which case their output starts immediately.
t: This is output for the user.
?: ( hello ) How are you? Do you have a life?
You pass words and punctuation for display. The system automatically formats it, so it doesn’t matter if your commas and periods have spaces before them, or how many blanks or tabs there are between words. The system reformats it automatically.
\
To output characters that have reserved meaning to the engine, like
[
and ]
, you need to put a backslash
immediately in front of them. In particular, to force a newline you use
\n
and tab with \t
.
[
]
You can select among a range of choices by using output choices. Each
choice is encased in [
]
, and a contiguous set
of them form a zone that the system will pick randomly among. Whenever
bracketed items are discontiguous, you get a new random zone.
?: (hi) [hello.][hi][hey] Are you going to [dance][swim][eat] anytime soon?
The above has two random zones, separated by fixed text. So it might output
hello.
A chatbot with no ability to remember, even in the brief moment of attending to user input, would be an impoverished being indeed. ChatScript supports several levels of memorization. The ultimate variable is the fact, but that has its own ChatScript Fact Manual manual.
_
Match VariablesWhen you use wildcards and sets in a pattern, you can ask the system to memorize briefly the word it matches.
The purpose of memorizing is to be able to use the value on output.
The results of memorization are stored on match variables named
_0
, _1
, etc, depending upon how many
underscores you use in the pattern.
?: ( do you eat _~meat ) No, I hate _0.
 Of course, the value of _0
is only
guaranteed for the execution of this rule. Match variables may be
clobbered when you execute another rule. Or they may last for a
while.
At most it will last for the duration of the current volley (several sentences maybe) after which it should be presumed trashed. Whenever you start a volley, you should presume match variables all hold unknown junk.
You are allowed _0
through _30
.
I often use the above _10
range as “safe” variables for
the duration of a volley, because I will never match that many variables
in a single sentence. I am unlikely to even match more than 5. So I can
dedicate them any way I want to.
When the system memorizes your underscore match, it stores both the original word, its canonical form, and the position of the text. On output, by default you get the canonical form. If you want the original form, you must precede your reference with an apostrophe.
?: ( do you eat _ [ ham eggs bacon] ) I eat '_0.
 Had I not used the apostrophe, the output would have been I eat egg.
Rarely would you ever want the canonical form of memorizing an indefinite gap.
?: ( do you like _* or _* ) I don’t like '_0 so I guess that means I prefer '_1.
If the input is do you like eating green eggs or swimming on the
beach, the output would be I don’t like eating green eggs so I
guess that means I prefer swimming on the beach. If you memorize an
optional area, {test me}, then you get either the word that
matched or the match variable is set to null if it fails to match. A
null
variable prints nothing on output.
If you use match variables, they are allocated in the order of the pattern. E.g.,
s: ( _~fruit [_~animal _bear] _~like )
In the above, _0
is a fruit and _2
is a
like, and _1
is _~animal
or
_bear
.
If you had NOT put _
in front of bear, you are at risk
that the ~like
match may be _1
or
_2
, depending on what happened inside []
.
That’s your headache if you use nested memorization.
Be aware that this expression:
u: (_1)
does not memorize the input word “1”. It instead names match variable 1 and asks if it has a value. If you were desperate to memorize the word 1 (how weird), you’d have to do this:
u: ( _~number _0=1 )
$
User_VariablesIf you need memory that lasts beyond the current input, one source of this is user variables. A variable is named with a starting dollar sign or two and then an alphabetic letter and then the rest must be alpha, digit, underscore, or hyphen. You initialize it using a C-style assignment in the output.
The =
assignment operator MUST be separated from the
variable and the value by at least one space, otherwise the system has
no way to tell you don’t want it to simply output some bizarre word.
Unlike match variables, user variables hold a single value only.
s: ( I eat _*1 > ) $food = '_0 I eat oysters.
You are advised to put these computational scripts on separate lines to make it easier to read your script, but ChatScript doesn’t really care.
s: ( I eat _*1 > )
$food = '_0
I eat oysters.
The variables will last forever or until you change them. If you want
the variable to disappear at the end of the volley instead, name it with
$$
at the start, e.g. $$food
. In addition to
simple assignment, you can do +=
, -=
,
*=
, /=
, %=
, |=
,
&=
, ^=
, and |^=
, eg
$$myvar += 100.
|^=
turns off bits and $x |^= 2
is
equivalent to $x &= (-1 ^ 2)
You can even assign sets of facts in various ways (see ChatScript Fact Manual for understanding facts) like:
@2 = @3 # put all facts in 3 into 2
@2 += @3 # augment 2 with facts of 3 (allows duplicates)
@2 -= @3 # remove facts of 3 from 2
@2 = $$factid # take a fact id and put it as the only content of 2
@2 += $$factid # add fact id to 2
@2 -= $$factid # remove factid from 2
WARNING:
Be careful with extended arithmetic. Each operation applies to the
result of the last.
$myvalue += 2 * 4 means ($myvalue + 2) * 4.
$tmp = %hour + $tmp means (2 * %hour)
Of course it would have been clearer to write this as:
$myvalue = $foo + 20 * 5 / 59
This is normal output after the assignment.
You should not use the name of the variable you are assigning to in the right hand side, as arithmetic is performed progressively across the terms, so the variable is overwritten on the first term. Similarly, you may be surprised by something like this:
$myvar -= $articlesize * 10
because it first deducts $articlesize
from
$myvar
and then multiplies that result by 10.
While there is no natural precedence (like in other computer languages) of multiplication over addition, you can use parens to force precedence.
$myvalue = ($x * $y)
The above will NOT do $myvalue = $x and then $myvalue = $y. It will do the $x $y and assign the result to $myvalue.
$myvalue = ($foo + 3) * 2
The above only computes myvalueas(foo + 3). The * 2 is not part of the assignment and will just be printed out as output.
$_x = ( (1 + 2) * (3 + 4) ) -- becomes 3 * 7 = 21
$_x = (s(3 + 4) * 2 ) -- becomes 7 * 2 = 14
You can test variables in patterns in a variety of ways. Some such tests do not affect the current position pointer of the match. Merely putting in the variable name will ask “does it have a value”?
?: ( what is my name $firstname ) Your name is $firstname.
Like match variables, you can use user variables in the output. Here,
if the input is what is my name and if $firstname
has been
previously assigned to, then the pattern matches. Otherwise it fails.
You are free to refer to variables that don’t exist. The pattern will
simply fail.
You can also directly test a variable to see if it has a particular
value using a relational test in the pattern. Relational tests use no
whitespace, they are all one big token. One such relation is
=
, also writeable as ==
.
?: ( $gender=male I like boys ) That's less controversial these days.
Here, the rule will only start checking for input matches if
$gender
has the value male (case insensitive). If it is not
defined or has any other value, this rule fails immediately. A
relational test requires the two sides of the relation and the relation
symbol all be jammed together with no spaces. So the following rule is
tantamount to seeing if $gender
has ever been assigned to,
followed by seeing if the user typed =male anywhere.
?: ( $gender =male )
Other relations are <
and >
, which
will require the system convert the variable’s text value into
numeric.
?:
You can invert a relation test using the !
operator.
?: ( I am ~number years old !_0<10 ) You are not a child.
For equality testing you can use the != operator.
?: ( $var!=5 ) OK.
You can assign match variables manually, though unless you are assigning from a match variable, you get no canonical data or position of the match.
s: ( my life ) _8 = hello
s: ( my _*1 ) _8 = _0
In the first example, _8
gets the word hello for both
canonical and original forms. It doesn’t process it. In the second
example, since _0
has dual form with position, the
assignment is dual form and passes the position along.
You can erase a user variable or match variable by setting it to
null
:
$myvar = null
_3 = null
The system normally stores variables on a per-user basis. You can set
bot-specific facts in the login function of a bot. If you have facts you
want to be global across all bots and as part of the base system, you
can put those assignments into a table and read it in under a
:build
command.
Go read the ChatScript Fact Manual for more about facts.
%
System VariablesThe system has some predefined variables which you can generally test
and use but not normally assign to. These all begin with %
.
These include %hour
, %bot
, and others.
See ChatScript System Variables and Engine-defined Concepts.
Not as simple as you might have wanted. Doubtless I told you much more than you really wanted to know at this stage, but it sets the scene so you know there is a lot of capability there (though truly we have barely scratched the surface here). Just remember, to start, all you need is to write a topic, with keywords, trivial gambits, responders and rejoinders with simple patterns, and output that is simply exactly what you want the bot to say.


causal_da.contrib¶
causal_da.contrib.evaluators¶
-
class
AugmentingMultiAssessmentEvaluator
(x_tr, y_tr, x_te, y_te, metrics, augment_size, namespace='', run_logger=None)¶ Bases:
causal_da.api_support.evaluator.AugmenterEvaluatorBase
Evaluate an augmenter by running it once on a data and probing multiple assessment metrics.
- Parameters
x_tr (
ndarray
) – target domain training data predictor variables (shape(n_train, n_dim)
).y_tr (
ndarray
) – target domain training data predicted variables (shape(n_train, 1)
).x_te (
ndarray
) – target domain test data predictor variables (shape(n_test, n_dim)
).y_te (
ndarray
) – target domain test data predicted variables (shape(n_test, 1)
).metrics (
Iterable
[AugAssessmentBase
]) – the metrics to assess the augmenter.augment_size (
Union
[float
,int
,None
]) – the desired size of the augmentation used for the assessment.namespace (
str
) – the namespace of the metric to be prepended.run_logger – the logger to save the results of the assessments.
-
evaluate
(augmenter, epoch)¶ Perform the evaluation.
- Parameters
augmenter – the augmenter.
epoch (
Optional
[int
]) – the epoch when this evaluation is run in the training loop (None
if outside a training loop).
-
class
ModelSavingEvaluator
(run_logger, path, db_key)¶ Bases:
causal_da.api_support.evaluator.AugmenterEvaluatorBase
The utility class to save the augmenter into a file.
- Parameters
run_logger – the logger to save the results of the assessments.
path (
str
) – the path where the saved model should appear.db_key (
str
) – the database key for which the saved model path should be recorded.
-
evaluate
(augmenter, epoch)¶ Perform the evaluation.
- Parameters
augmenter – the augmenter.
epoch – the epoch when this evaluation is run in the training loop (
None
if outside a training loop).
-
class
TargetDomainsAverageEvaluator
(tar_tr, tar_te, assessments, namespace='', run_logger=None)¶ Bases:
causal_da.api_support.evaluator.AugmenterEvaluatorBase
Evaluate the augmenter by performing the assessment on multiple domains and taking the average.
- Parameters
tar_tr (
Tuple
[ndarray
,ndarray
,ndarray
]) – tuple of target domain training data containing(x_tr, y_tr, c_tr)
.tar_te (
Tuple
[ndarray
,ndarray
,ndarray
]) – tuple of target domain testing data containing(x_te, y_te, c_te)
.assessments (
Iterable
[StandardAssessmentBase
]) – the assessment objects to assess the augmenter.metrics – the metrics to assess the augmenter.
namespace (
str
) – the namespace of the metric to be prepended.run_logger – the logger to save the results of the assessments.
Note
c_tr
andc_te
are the indicators of the domain indices (this class averages the performance on multiple domains).-
evaluate
(augmenter, epoch)¶ Perform the evaluation.
- Parameters
augmenter – the augmenter.
epoch – the epoch when this evaluation is run in the training loop (
None
if outside a training loop).
Module contents


 This is a small, low, concrete pillbox at the edge of the marshes, from within which one has a sweeping view, but cannot oneself be seen. I was very impatient to spot some birds, so no sooner had we made ourselves comfortable than I snatched Dennis' binoculars and peered through them.
“Gosh!” I cried, “A marsh warbler!”
“Really?” said Dennis, “Let me take a look.”
And he snatched back the binoculars and peered through them. Then he emitted a great sigh, expressing all at once pity and exasperation, bafflement and resignation.
“Cleothgard,” he said, turning to look at me, “Just because it is at a marsh and is making a warbling sound does not make it a marsh warbler. Look again -” and he handed back the binoculars, “- and tell me, is it bewinged? Does it have a beak and feathers?”
I peered again, rapt, but had to confess that I was unable to see any of these telltale bird features.
“What you can see,” said Dennis, “is not a marsh warbler. Granted, it is a living thing at a marsh making little warbling sounds. But what in fact it is, is a little orphan child, out roaming the marshes at daybreak, and warbling, or singing tremulously, perhaps because it is a naturally cheerful orphan, or more likely from a nerve-racked desire to drown out the eerie morning marshland sounds of gust and creak and slosh. Hark now to the words of the little orphan's warbled song, and you will gather why he is afeared.”
I pricked up my ears and listened carefully.
Tra la la, tra la lee, sometimes I warble and sometimes I sulk
I hope I'm not accosted by an escaped convict from the hulk
And sure enough, as I watched I saw the orphan of a sudden accosted by a fierce bedraggled chain-clanking convict, newly escaped from a hulk moored out beyond the marshes. He bore a distinct resemblance to the Scottish actor Finlay Currie.
“Gosh!” I said, “A cassowary!”
Dennis thumped me on the head with a brick.
A cassowary and a marsh warbler


Home
Who We Are
Calendar
Student Tools
Gallery
USS
Contact Us
NYU SOE STUDENT COUNCIL OFFICIAL WEBSITE
News and Important Information
Today's Events


Micr
fit
Enter your information to retrieve a workout!

Follow us at