There is a program that need to be installed first which is the NodeJs. It is provided in the folder, named "node-v{version}.msi"
There is also optional text editor, notepad++ available to install. It will make text editing much more easier.
There is a file named ".env" in the folder, it will be setting for the application
Sample :
APIKEY=DXDSdLeJ07zEL4LML39qf9IzMVTt1Q0q PROJECT_ID=Testing REPEAT_EVERY_MINUTES=1 BESC_ESS_API_PATH= DISABLE_DATA_SEND=
Explaination :
| Key | Description |
|---|---|
| APIKEY | A secret string provided by BESC to send the energy data to the ESS-API. |
| PROJECT_ID | A string provided by BESC to represent the project, it must be used with the correct APIKEY. |
| REPEAT_EVERY_MINUTES | Repeat the reading and data pushing to ESS-API every n minutes. |
| BESC_ESS_API_PATH | It is the URL to the ESS-API, it will pass to the SDK. If it is empty, SDK will use default URL. |
| DISABLE_DATA_SEND | Leave it empty for the application to send data to ESS-API, if not empty, it will stop the send of data to ESS-API. It is used for data reading testing without sending the data out |
There will be a config.json in the folder, this is when all the device will be configurated along with project details.
This is the overall layout of the config.json :
{ "ProjectName": "Testing", "Location": "101.1212, 112.1133", "AverageRT": 0, "Polls": [ ... ] }
| Name | Description |
|---|---|
| ProjectName | The project name given to this group of energy data. |
| Location | A string reprensetative of the project location, it should be the longitude and latitude of the GPS location |
| AverageRT | Set the average RT |
| Polls | It is the data pulling with different set of setting |
{ "type": "Serial", "protocol": "RTU", "port": "COM5", "baudRate": 9600, "dataBits": 8, "stopBits": 1, "parity": "none", "Devices": [ ... ] }Poll sample for TCP connection:
{ "type": "TCP", "host": "<IP_ADDRESS>", "port": 502, "Devices": [ ... ] }
| Name | Description | Possible Value |
|---|---|---|
| type | The type of modbus connection | TCP (for TCP setting), Serial (for serial setting) |
| protocol | The protocol used for the modbus serial connection | RTU/ ASCII |
| port | The port which will used by the modbus serial connection. | Windows - COM{number} (eg. COM1, COM2) Linux - /dev/ttyS{number} (eg. /dev/ttyS0, /dev/ttyS1 ) |
| baudRate | Baud rate setting of the modbus serial connection. | Eg. 9600 |
| dataBits | Data bits setting of the modbus serial connection | Eg. 8 |
| stopBits | Stop bits setting of the modbus serial connection | Eg. 1 |
| parity | The parity setting of the modbus serial connection | none, odd, even |
| Devices | The devices included in the modbus poll, it can be multiple devices with different address setting. | List of devices |
| Name | Description | Possible Value |
|---|---|---|
| type | The type of modbus connection | TCP (for TCP setting), Serial (for serial setting) |
| host | The host where the modbus needed to connect to. | Any IP address (<IP_ADDRESS>) |
| port | The port number which will used by the modbus TCP connection. | Any, usually use port 502 |
| Devices | The devices included in the modbus poll, it can be multiple devices with different address setting. | List of devices |
Sample of device
{ "name": "Device 1", "deviceNum": 1, "address": 1, "dataType": "int", "mod": "", "registerLength": 2, "registerType": 3, "registerBit": 16, "endian": "BE" }
Devices is a collection of the device in the modbus poll.
| Name | Description | Possible Value |
|---|---|---|
| name | The name given to the device, it must be unique in the whole config file. | Any |
| deviceNum | The device id used by modbus. | Any integer (eg. 1, 2, 3) |
| address | The registers address of the data needed to read. | Any integer, the address same as ModScan (without -1 manually) |
| dataType | The data type represent by the registers addresses. | "int", "float", "floating_point" |
| mod | The modification do to the reading after getting the value from device. The reading is represent by the "reading" keyword. It can be used to do mathematical expression. Can be left empty. | Eg. "reading / 10", "reading * 10" |
| registerLength | The number of registers to represent a single reading | 1, 2, 4 |
| registerType | The registers type that need to be read from. | 3 - Holding Register 4 - Input Register |
| registerBit | The total bit represent by a single registers address. | 8, 16, 32 |
| endian | The endianess of the registers address reading | BE - Big Endian LE - Little Endian. Most of the device will be BE. |
{ "type": "Serial", "protocol": "RTU", "port": "COM5", "baudRate": 9600, "dataBits": 8, "stopBits": 1, "parity": "none", "Devices": [ { "name": "Device 1", "deviceNum": 1, "address": 1, "dataType": "int", "mod": "", "registerLength": 2, "registerType": 3, "registerBit": 16, "endian": "BE" }, { "name": "Device 2", "deviceNum": 3, "address": 3, "dataType": "int", "mod": "", "registerLength": 2, "registerType": 3, "registerBit": 16, "endian": "BE" } ] }Complete Poll sample for TCP connection:
{ "type": "TCP", "host": "<IP_ADDRESS>", "port": 502, "Devices": [ { "name": "Device 4", "deviceNum": 1, "address": 1, "dataType": "int", "mod": "", "registerLength": 2, "registerType": 3, "registerBit": 16, "endian": "BE" }, { "name": "Device 3", "deviceNum": 2, "address": 3, "dataType": "int", "mod": "", "registerLength": 2, "registerType": 3, "registerBit": 16, "endian": "BE" } ] }
You can combine both together with comma in between, like this:
{ "type": "Serial", "protocol": "RTU", "port": "COM5", "baudRate": 9600, "dataBits": 8, "stopBits": 1, "parity": "none", "Devices": [ { "name": "Device 1", "deviceNum": 1, "address": 1, "dataType": "int", "mod": "", "registerLength": 2, "registerType": 3, "registerBit": 16, "endian": "BE" }, { "name": "Device 2", "deviceNum": 3, "address": 3, "dataType": "int", "mod": "", "registerLength": 2, "registerType": 3, "registerBit": 16, "endian": "BE" } ] }, { "type": "TCP", "host": "<IP_ADDRESS>", "port": 502, "Devices": [ { "name": "Device 4", "deviceNum": 1, "address": 1, "dataType": "int", "mod": "", "registerLength": 2, "registerType": 3, "registerBit": 16, "endian": "BE" }, { "name": "Device 3", "deviceNum": 2, "address": 3, "dataType": "int", "mod": "", "registerLength": 2, "registerType": 3, "registerBit": 16, "endian": "BE" } ] }
Sample :
{ "Devices": [{ "name": "Device 4", "energy": 1 }, { "name": "Device 3", "energy": 2 }, { "name": "Device 1", "energy": 1 }, { "name": "Device 2", "energy": 3 }] }
Please reset the energy of the device in this file if you are reseting the device's reading registers.


Even more sites all about webSite templates on Just Web Templates.
Even more sites all about webSite templates on Just Web Templates.
if you looking for beautiful and professionally made templates you can find them as Template Beauty.
You can remove any link to our webside from this template you're free to use template without linking back to us.


Heitor Chang
Resume (English)
|
CV (Português)
GitHub
heitorchang
|
pontual
|
reddress
Django Notes
Pontual Import Brindes
: Product Catalog
Source
Pangloss
: Programming Notes
Source
All Cents
: Personal Finances Organizer
Source
Sistema
: Inventory Control
Source
Meleto: Let's study Greek
Source
Polylexis: Vocabulary Quizzes
Source
Dictionaries, Time & Calendar,
JS & Scheme Evaluators
and other misc. apps
Thank you for visiting my page. Have a great day!


Represented by Chen Wang
WEB ARchive (WAR)
it's just the beginning of the story
...
many constraints about deploying REST
...
version and vendor
package and deliver application
lightweight
open
fast (comparing with VM)
build once... run everywhere (like Java)
sharable
quick scale
cheap
REST is stateless
local development and test
CI
new approach to deliver application
simplify production application deployment
host environment
complex configuration
logging
SSL support
Ubuntu 16.04 and CentOS 7
OpenJDK 1.8
Tomcat 8.0
host environment
complex configuration
logging
SSL support
rest-api-runtime.properties - 100+ options
dfc.properties - about 170 options
docker environment variables are not sufficienthost environment
complex configuration
logging
SSL support
logging is important for troubleshooting
logs should be persisted
host environment
complex configuration
logging
SSL support
keystore location
keystore password
key entry
key entry password
encryption algorithm
start REST container first
and come back to answer these questions
tar -xvf RESTAPI_Docker_Ubuntu.tar
docker load -i RESTAPI_Ubuntu.tar
mkdir -p ~/rest/config
cd ~/rest
docker run --name rest -p 8080:8080 -d \
-v `pwd`/config:/root/rest/config \
-v `pwd`/logs:/root/rest/logs restapi_ubuntu:7.3.0000.0590
curl http://dmadmin:password@localhost:8080/dctm-rest/repositories/REPO
5 minutes
in `pwd`/logs
forget to configure logs...modify configuration and restart the container
vi log4j.properties
vi rest-api-runtime.properties
#rest.security.auth.mode=basic-ct
docker restart rest
check logs
verify the client token in response
curl -v http://dmadmin:password@localhost:8080/dctm-rest/repositories/[REPO]
...
Set-Cookie: DOCUMENTUM-CLIENT-TOKEN=xxxxxxx
...
3 minutes
- build image with REST and host environment
entrypoint.sh- apply configuration and start container
5 more environment variables
-e COMM_KEYSTORE_FILE=...
-e COMM_KEYSTORE_PWD=...
-e COMM_KEY_ALIAS=...
-e COMM_KEY_PWD=...
-e COMM_KEY_STORE_TYPE=...
keytool -genkey -alias tomcat -keyalg RSA -keystore ./myks
docker run --name rest -p 8080:8080 -p 8443:8443 -d \
-v `pwd`/config:/root/rest/config \
-v `pwd`/logs:/root/rest/logs \
-e COMM_KEYSTORE_FILE=/root/rest/config/security/myks \
-e COMM_KEYSTORE_PWD=password \
-e COMM_KEY_ALIAS=tomcat \
-e COMM_KEY_PWD=password \
-e COMM_KEY_STORE_TYPE=JKS \
restapi_ubuntu:7.3.0000.0590
curl -k https://dmadmin:password@localhost:8443/dctm-rest/repositories/REPO
3 minutes
there are two Content Server images
Docker Compose
find details here
it could take more than 30 minutes to launchnot officially supported but quite useful
get suite of Content Server/xPlore/REST in 10 minutes
docker-compose file and launching scriptafter the session
3 main approaches
docker swarm init
docker swarm join
docker service create [IMAGE] [COMMAND]
docker service create --name helloworld --replicas 3 alpine ping docker.com
docker run --name rest -p 8080:8080 -d \
-v `pwd`/config:/root/rest/config \
-v `pwd`/logs:/root/rest/logs restapi_ubuntu:7.3.0000.0590
no mature built-in shared volume solution
FROM restapi_ubuntu:7.3.0000.0590
#config directory containing the necessary configuration files
COPY config/ ${CONFIG_DIR}/
docker build -t <IP_ADDRESS>:5000/rest-node .
push image to registry so that all swarm nodes can get image
docker push <IP_ADDRESS>:5000/rest-node
docker service create --replicas 3 --name rest-multinodes -p 8080:8080 <IP_ADDRESS>:5000/rest-node
check the service
docker service ls
docker service ps rest-multinodes
curl http://[NODE_IP]:8080/dctm-rest/repositories/
docker service scale rest-multinodes=3
docker service ls
prepare a dummy new version image
docker tag <IP_ADDRESS>:5000/rest-node <IP_ADDRESS>:5000/rest-node:new
docker push <IP_ADDRESS>:5000/rest-node:new
update strategy of service
docker service update rest-multinodes --update-delay 20s --update-parallelism 1
kick off upgrading
docker service update --image <IP_ADDRESS>:5000/rest-node:new rest-multinodes
check the upgrading process
docker service ps rest-multinodes
docker kill ...
sudo service docker stop
after session
useful but complicated and not easy to set up
experienced - 1 or 2 days
new to SAML - 2 days or more
docker exec -it cs bash
source .../dm_set_server_env.sh
iapi
create,c,dm_user
set,c,l,user_name
samler
set,c,l,user_login_name
samler
set,c,l,user_password
password
set,c,l,user_source
dm_saml
set,c,l,user_privileges
16
save,c,l
docker exec -it cs bash
vi .../saml.properties
docker cp idp/shibboleth-idp/credentials/idp-signing.crt centstateless:/home/saml
10 minutes/if we have time
find details here


Service record (SRV record) is a specification of data in the Domain Name System defining the location, i.e. the hostname and port number, of servers for specified services. An SRV record has the form:- _service._proto.name. TTL class SRV priority weight port target.
- service : the symbolic name of the desired service.
- proto : the transport protocol of the desired service; this is usually either TCP or UDP.
- name : the domain name for which this record is valid, ending in a dot.
- TTL : standard DNS time to live field.
- class : standard DNS class field (this is always IN).
- priority : the priority of the target host, lower value means more preferred.
- weight : A relative weight for records with the same priority, higher value means more preferred.
- port : the TCP or UDP port on which the service is to be found.
- target : the canonical hostname of the machine providing the service, ending in a dot.
Retrieving an SRV record:
$ dig _sip._tls.example.com SRV
$ host -t SRV _sip._tls.example.com
$ nslookup -querytype=srv _sip._tls.example.com
$ nslookup
> set querytype=srv
> _sip._tls.example.com
Usage: SRV records are used by the below standardized communication protocols.
Teamspeak 3 (since version 3.0.8 - Neither priority nor weight is taken into consideration. The client appears to choose an SRV record at random for a connection attempt.[1])
Minecraft (since version 1.3.1, _minecraft._tcp)
CalDAV and CardDAV
Client SMTP Authorization
DNS Service Discovery (DNS-SD)
IMPS
Kerberos
LDAP
Puppet
SIP
XMPP
Mail submission, Post Office Protocol, and Internet Message Access Protocol
Libravatar uses SRV records to locate avatar image servers
Microsoft Lync
Citrix Receiver
Checkout the brute_srv function in the dnsrecon tool script to get familar with the different SRV names and services.


The Bishop is an expert in healing magic. He fights best in groups, and becomes vital in party play or siege. Even strong fighters will appreciate the presence of a Bishop.
Bishops can revive the dead and are capable of strong white magic attacks.
To be a Bishop, your level must be over 40 and you must collect the Mark of the Pilgrim, the Mark of Trust, and the Mark of the Healer.
Ask about marks.
Return


Twitter rolls out ability to hide replies to tweets
The feature becomes available globally after testing in some parts of the world since July.
Twitter is granting all users the power to hide replies to their tweets that they find abusive or irrelevant.
The feature has been in testing in Canada since July, before expanding to the United States and Japan in September, and it is now being made available globally.
During the initial trial, the social network found that people mostly decided to hide replies because they found them “irrelevant, off-topic, or annoying” and as a new way to shut out noise.
While the feature removes replies from being immediately visible, other people can still see them by tapping on a grey icon to reveal responses.
However, some testers told the company they were afraid that hiding replies could lead to retaliation, a concern Twitter said it would continue to take feedback on.
“Currently, repliers can shift the topic or tone of a discussion and derail what you and your audience want to talk about,” Twitter said.

“We learned that the feature is a useful new way to manage your conversations.”
The firm also said it is working on other new controls and “more clarity around the rules of conversation spaces”.
Earlier this week, Twitter issued a sharp rebuke to the Tories after the party temporarily rebranded one of its official Twitter accounts as a fact-checking service called “factcheckUK” during the ITV leaders’ debate.
The social network warned that any further attempts to mislead the public on its platform during the General Election will lead to “decisive corrective action”.
Twitter has been bolstering its efforts to block misleading information during the election campaign after earlier this month launching a new tool to enable people to report deliberately misleading details about the voting process.
The platform has also announced a ban on political adverts.


??
????
6
7
8
9
10
the
New
York
copyright
reserved
Botanical
Garden
NEW
YORK
BOTANjCAL
GARDEN
447488
REVISION
OF
JUSSIAEA
J.
suffruticosa
L.
(\,
Ulta
ft
Philip
A.
Munz
,“¤39¡'
19.4&
Coll.
H.
von
Tiirckheim.
PLORA
VON
SANTO
DOMINGO.
Nr.#6$-.
Ludwigia
octovalvis
(Jacq.)
Raven
Determined
by
T.P.
Ramamoorthy
1980
Missouri
Botanical
Garden
01447488
Legend -
Level of confidence that token is an accurately-transcribed word
extremely low
very low
low
undetermined
medium
high
very high


Turbolinks replaces the body of the page but doesn’t reload the header files. This limits the number of calls and makes the site appear faster to the user by a noticeable margin.
To remove turbolinks for Rails 4
- (3 steps from Steve Klabnik)[http://blog.steveklabnik.com/posts/2013-06-25-removing-turbolinks-from-rails-4]
Breaking my JS
- Turbolink breaks my JS calls when the page loads up the Facebook SDK. So I started disabling turbolinks on certain pages in my HAML a tag with the “data-no-turbolink” option
= link_to 'add friends', next_wizard_path, "data-no-turbolink" => "true"
- There are also events that one can hook into. They are (listed here)[https://github.com/rails/turbolinks/#events].
- You can also put the click event on the doc rather than the element which will solve this issue. In this case ajax tasks would also have the click event applied to them as well.
1 2 |
|
The jquery turbolinks gem
- Using (the gem)[https://github.com/kossnocorp/jquery.turbolinks] just straight fixes it. This likely means that the turbolinks is disabled for all jquery related calls.
Reading
- a (basic summary by treehouse)[http://blog.teamtreehouse.com/rails-4-a-look-at-turbolinks]


Michael Bloomberg expected to file for Alabama 2020 primary
by CNN NewsourceFormer New York City Mayor Michael Bloomberg is expected to file for the Alabama Democratic 2020 presidential primary , a Bloomberg spokesperson told CNN on Thursday.
Bloomberg said in March that he had decided against running for president in 2020. The New York Times , which first reported the expected Alabama filing, reports Bloomberg has been privately weighing a presidential bid for weeks but has not yet made a final decision.
Bloomberg dispatched staffers to Alabama to get enough signatures to qualify for the primary there, according to the Times. Alabama does not hold an early primary, but the deadline for a candidate to formally enter the race is Friday, according to the newspaper.


As a recent graduate from the University of Washington, I am seeking to apply my new abilities to the workforce. I would like to focus my career on Embedded Systems, however my diverse range of software studies would allow me to contribute in many different areas.
|
Languages
Tools
|
Hardware
|


| Name | Type | Protocol | Address | Service Port | Management Port | Status | Updated At |
|---|---|---|---|---|---|---|---|
| {{service.name}} | {{service.type}} | {{service.protocol}} | {{service.address}} | {{service.service_port}} | {{service.management_port}} | {{ service.status==1? "up" : "down"}} | {{time|date:'MMM d, y HH:mm:ss'}} |


A lot of people have to flee their country because of war and persecution. And then begin a new life in another country. This is often hard. But in Germany, there is help available.
What is refugee aid?
Refugees who have come to Germany have many questions. About things like the asylum procedure and about rights and laws. How can I find an apartment? When can I work and how can I find a job? Can I study in Germany? Or they have questions about family topics: how can I bring my wife, my husband or my children to Germany? Where can I find support if I or my child are not doing well? Where can I find good childcare or a good school for my child?
In Germany, there are many support services. From the state, from big organisations, from associations and from private people. Many people offer help on a voluntary basis. This means that they support other people and do not earn money for doing this. They just want to help. Because they know that it is hard for refugees when they first come to Germany.
Find help now >What kind of support services are there?
Some benefits that cost money are available to refugees for free from the state. Things like help from doctors or psychologists. This is medical treatment and therapy. There are also integration courses for refugees. These help refugees to get settled in Germany. A lot of guidance centres offer counselling and advising sessions about many topics free of charge. For example, social counselling. Here, a person takes special care of the worries that a refugee or family has. Or advising sessions about asylum, parenting and career. Or advising sessions about family reunification. Many organisations also help with translation and interpreting.
There are many courses where refugees can do further training. For example, language courses or job preparation courses. Or courses to do during free-time, like sport courses, bicycle lessons or cooking classes. Many volunteers are looking for a refugee who can be their tandem partner. These volunteers helps refugees in day-to-day life. At the same time, they learn about another culture.
In Germany, voluntary work is important. Many people are happy to help refugees. And they are happy when others accept their help.


Welcome
Schedule
Colours
Hardhats
History
FAQs
Links
Sponsors
Update pending. */ ?>
Orientation Week Sponsors
Platinum Sponsors:
*/?>
Gold Sponsors:
Silver Sponsors:
*/?>
Bronze Sponsors:
Graduating Class of 2010:
Dave Halford, Grant Campbell, Catherine Hay,
Mark Cremasco, Scott Hooker, Andrea Murphy,
Paul Jakubowski, & Mary Bland
welcome
|
schedule
|
colours
|
hardhats
|
history
|
faqs
|
links
|
sponsors


Vice Hierarch Casca:
It has been such a long time since we last met. How is your mission progressing?
Hand over the documents.


Toy crossbow sparks armed police response in Dunfermline
A large armed police response descended on a Dunfermline street in the early hours of Saturday morning – only to discover it had been sparked by an innocent children’s toy.
by Craig SmithThe alarm was raised at around 12.35am when police received reports about a man being in possession of some sort of weapon – described as a crossbow – in Broomhead Drive.
Armed officers and an ambulance attended, and surrounding roads were cordoned off in a bid to minimise any potential danger.
However, it soon emerged that the ‘weapon’ in question had been a toy crossbow which had been given to an 18-year-old man as a gift earlier that evening.
A Police Scotland spokeswoman confirmed: “Around 12.35 am on Saturday November 23 2019, police received a report of a male in possession of a cross bow in Broomhead Drive, Dunfermline.
“Police attended and it was established that the item in question was actually a toy crossbow.
“Advice was given and no further police action taken.”


Description
View of xdom:element that treats xdom:elements directly within the body as a record. The tag of those elements becomes the record element name.
View bodyrec
@x:view bodyrec
| @x:view | @x:func sys:Is(v~boolean)~boolean |
| @x:self | @x:func sys:Dot[name~string] |
View Function sys:Is
| @x:func sys:Is(v~boolean)~boolean | ||
|
Semantics
The result is v?xdom:element.LHS/RHS Self Function sys:Dot[ ]
| @x:func sys:Dot[name~string] | ||
|
Semantics
The result is the body component with the specified tag. On the rhs, if the body component does not exist the result is null. On the lhs, if value being assigned is null, any element with tag name is removed from the record. On the lhs, if the named element does not exist, it is added.


--- title: Utility Classes ---
This text is left aligned. Set in the year 0 F.E. ("Foundation Era"), The Psychohistorians opens on Trantor, the capital of the 12,000-year-old Galactic Empire. Though the empire appears stable and powerful, it is slowly decaying in ways that parallel the decline of the Western Roman Empire.
This text is right aligned. Set in the year 0 F.E. ("Foundation Era"), The Psychohistorians opens on Trantor, the capital of the 12,000-year-old Galactic Empire. Though the empire appears stable and powerful, it is slowly decaying in ways that parallel the decline of the Western Roman Empire.
This text is center aligned. Set in the year 0 F.E. ("Foundation Era"), The Psychohistorians opens on Trantor, the capital of the 12,000-year-old Galactic Empire. Though the empire appears stable and powerful, it is slowly decaying in ways that parallel the decline of the Western Roman Empire.
This text is justified. Set in the year 0 F.E. ("Foundation Era"), The Psychohistorians opens on Trantor, the capital of the 12,000-year-old Galactic Empire. Though the empire appears stable and powerful, it is slowly decaying in ways that parallel the decline of the Western Roman Empire.
| `.text-left` | `.text-right` | `.text-center` | `.text-justify` |
| `.small-text-left` | `.small-text-right` | `.small-text-center` | `.small-text-justify` |
| `.small-only-text-left` | `.small-only-text-right` | `.small-only-text-center` | `.small-only-text-justify` |
| `.medium-text-left` | `.medium-text-right` | `.medium-text-center` | `.medium-text-justify` |
| `.medium-only-text-left` | `.medium-only-text-right` | `.medium-only-text-center` | `.medium-only-text-justify` |
| `.large-text-left` | `.large-text-right` | `.large-text-center` | `.large-text-justify` |
| `.large-only-text-left` | `.large-only-text-right` | `.large-only-text-center` | `.large-only-text-justify` |
| `.xlarge-text-left` | `.xlarge-text-right` | `.xlarge-text-center` | `.xlarge-text-justify` |
| `.xlarge-only-text-left` | `.xlarge-only-text-right` | `.xlarge-only-text-center` | `.xlarge-only-text-justify` |
| `.xxlarge-text-left` | `.xxlarge-text-right` | `.xxlarge-text-center` | `.xxlarge-text-justify` | Align Left | Align Right | Align Center | Justify |


{% extends 'base.html' %} {% load static %} {% block head_title %}Widgets{% endblock head_title %} {% block page_title %}Widgets{% endblock page_title %} {% block content %} Go back to competition
NOTE: These widgets use the current active phase of the competition to submit/display data.
Embed this HTML into your page to allow someone to make submissions to this competition:
Embed this HTML into your page to display the leaderboard:


This is a wrapper around the newly released official Hacker News API. It uses RxJS to populate the ids that are returned from the official API with the item details and then returns those created objects.
endpoint: /getTopStories
optional params: fromStory
, toStory
This call gets the Hacker News top stories page, optional params take integer values for stories to return
Example
http GET http://localhost:5000/getTopStories\?fromStory\=0\&toStory\=2
This returns the top 2 stories from the front page.
[
{
"by": "neonkiwi",
"id": 8439408,
"kids": [
8439535,
8439672,
8439436,
8439681,
8439737,
8439734,
8439715,
8439968,
8440352,
8440176,
8440109,
8439678,
8439868,
8439783,
8439527,
8439776,
8439775,
8439844,
8439659,
8440026,
8440147
],
"score": 181,
"text": "",
"time":<PHONE_NUMBER>,
"title": "What will it take to run a 2-hour marathon?",
"type": "story",
"url": "http://rw.runnersworld.com/sub-2/"
},
{
"by": "scobar",
"id": 8439648,
"kids": [
8439915,
8440598,
8439883,
8440308,
8439903,
8440117,
8439946,
8439899,
8440059,
8439852,
8439894,
8439920,
8439887,
8439842,
8439951,
8439939
],
"score": 79,
"text": "",
"time":<PHONE_NUMBER>,
"title": "The Toughest Adversity I've Ever Faced",
"type": "story",
"url": "http://scottbarbian.com/the-toughest-adversity-ive-ever-faced"
}
]
The kids
data structure will be populated on the network call for the specific details on that story.


y_taka_23
@igrep Okay, IMO, my talk heavily depends on the live-coding, so I hope to share something in tutorial-style instead of the slides. I try to finish it within this weekend.
background-image: radial-gradient(#545F64 30%, transparent 30%),radial-gradient(#545F64 30%, transparent 30%);
Ruby Kaigiふむ


Fursona Sticker Switcher is a labor of love created by Soatok Dreamseeker.
This software is free and open source. If you'd like to contribute to its development…
Version 0.4.0


Find more content, material, & resources Welcome back, !
Explore the Learning Registry
Interactive Search Beta
The learning registry is a new approach to capturing, connecting and sharing data about learning resources available online with the goal of making it easier for educators and students to access the rich content available in our ever-expanding digital universe.


This driver reads files in SEG-P1 and UKOOA P1/90 formats. Those files are simple ASCII files that contain seismic shotpoints. Two layers are reported : one with the points, and another ones where sequential points with same line name are merged together in a single feature with a line geometry.


UPSA to launch new campus at Amanfo, Ashanti Region
Vice-Chancellor of the University of Professional Studies, Accra (UPSA), Professor Abednego Feehi Okoe Amartey has announced that a new campus for the University will open at Amanfo near Bekwai in the Ashanti Region in 2020.
He made the announcement during his welcome address at the UPSA Annual Leadership Lecture and thanked the founder of the institution, Nana Opoku Ampomah for the 35-acre land which will host the new campus.
The annual lecture which was themed: ‘Leadership: Strengthen Democratic Institutions for National Development’ was part of the launch of UPSA’s 55th Anniversary.
Otumfuo Osei Tutu II, the Asantehene who was in attendance of the event gave the keynote speech at the event.
Others in attendance were high profile personalities such as former President John Agyekum Kufuor, Nana Otuo Siriboe, Omanhene of the Juabeng Traditional Area and Chairman of the Council of State.
The leadership lecture was instituted to strengthen the stature of the university as it strives to improve on scholarship, research and professionalism.
Prof Amartey said, “As a professional institution, one of the finest gifts we can give our nation is to provide a platform like this to reflect on leadership and how we can use leadership to push a progressive and prosperous national agenda for all.”
“For a country that is part of a continent that many say needs good leadership rather than charity, this is the least we could do; with the hope that these intellectual engagements will be seeds that will grow to bear good fruits and impact this generation and beyond,” he continued.


By accessing this web site, you are agreeing to be bound by these web site Terms and Conditions of Use, all applicable laws and regulations, and agree that you are responsible for compliance with any applicable local laws. If you do not agree with any of these terms, you are prohibited from using or accessing this site. The materials contained in this web site are protected by applicable copyright and trade mark law.
Permission is granted to temporarily download one copy of the materials (information or software) on STARTREV.com'S site for personal, non-commercial transitory viewing only. This is the grant of a license, not a transfer of title, and under this license you may not:
modify or copy the materials;
The materials on STARTREV.com, web site makes no warranties, expressed or implied, and hereby disclaims and negates all other warranties, including without limitation, implied warranties or conditions of merchantability, fitness for a particular purpose, or non-infringement of intellectual property or other violation of rights. Further, STARTREV.com does not warrant or make any representations concerning the accuracy, likely results, or reliability of the use of the materials on its Internet web site or otherwise relating to such materials or on any sites linked to this site.
In no event shall STARTREV.com or its suppliers be liable for any damages (including, without limitation, damages for loss of data or profit, or due to business interruption,) arising out of the use or inability to use the materials on STARTREV.com'S Internet site, even if webVDEO authorized representative has been notified orally or in writing of the possibility of such damage. Because some jurisdictions do not allow limitations on implied warranties, or limitations of liability for consequential or incidental damages, these limitations may not apply to you.
The materials appearing on STARTREV.com web site could include technical, typographical, or photographic errors. STARTREV.com does not warrant that any of the materials on its web site are accurate, complete, or current. STARTREV.com may make changes to the materials contained on its web site at any time without notice. STARTREV.com does not, however, make any commitment to update the materials.
STARTREV.com, has not reviewed all of the sites linked to its Internet web site and is not responsible for the contents of any such linked site. The inclusion of any link does not imply endorsement by STARTREV.com of the site. Use of any such linked web site is at the user's own risk.
STARTREV.com may revise these terms of use for its web site at any time without notice. By using this web site you are agreeing to be bound by the then current version of these Terms and Conditions of Use.
Any claim relating to STARTREV.com, web site shall be governed by the laws of the State of California, in the city of Los Angeles, without regard to its conflict of law provisions.
General Terms and Conditions applicable to Use of a Web Site.


Markov Chains and Gene Prediction #1: A Basic Introduction
If you can access Medium, read the article from here.
I recently started teaching a probability course in the lab for the interns, and it reminded me of so much stuff that I have been curious about not so long ago, one of those things were Markov Chains and how interesting they actually are, and obviously since I, along with a coworker named Rakabawi, share an interest in theoretical biology, we have decided that in our free time, the time not spent in doing research on blockchains, we would do some biology-related research.
Anyway, let me first introduce to Markov Chains, a Markov chain is discrete-time stochastic process; a process which can take different states with certain probabilities of being in each -or none- of going in the next step, or several steps, to a different state, or getting stuck in the same state. More terminology to be introduced as we go on.
Formally, A Markov chain has a set of states, S = { s1, s2, …}. The process starts in one of these steps and moves successively from one state to another. If the process is currently in state i, the probability of it going to state j, is denoted by Pi,j, or the element i,j in the current transition matrix. So what is a transition matrix?Let’s first explore an example by Kemeny, Snell, and Thompson, which describes the Land of Oz, in which weather can only take three states: rainy, nice or snowy, with a condition that the city can’t have two nice in a row. The initial transition matrix, or P1 can be given by:
which is quite simple and straight-forward, a mapping of conditional probabilities that maps state j given i, but just in case, the first element in the array denotes the conditional probability that “tomorrow” is going to be rainy given that “today” was rainy, and so on.
But obviously that’s not all that you need to know about Markov chains, but some concepts will suffice for now, but first, notice the following transitions
You can obviously see that after each transition the probability is approaching the probabilities of the 6th transition.
But wait, how do we even generate a transition other than the initial? To better understand this, let’s first say that the probability that 2 days from now it is going to be raining, given that today’s weather is nice, is the disjoint union of three probabilities, which are: the probability that the weather two days from now is going to be rainy given that tomorrow’s weather is nice, the the probability that the weather two days from now is going to be rainy given that tomorrow’s weather is rainy, and the probability that the weather two days from now is going to be rainy given that tomorrow’s weather is snowy. Right? It’s easier than it looks, and actually be generated in a single computation, but it needs to be illustrated more clearly beforehand.
First, the probability that it will be nice two days from now given that it was nice today is given by:
or the dot product of the second row (the one denoting the probabilities of tomorrow’s weather given that today’s is nice) by the first column (the one denoting the probability of the day after being rainy given the current day’s different state probabilities)
An important concept keep in mind, is a regular chain, any transition matrix that has no zeroes determines a regular Markov chain. Remember our Land of Oz example? It started with an initial transition matrix which contained a zero, yet it is regular. How? Because later on that zero value changed.
 It is one in which you can be trapped in one state with absolutely no possibility of transitioning into a different state once you’re in that state. An example is the following.
Once you transition from x to y, there’s no way of getting back to x.
Finally for now, let P be the transition matrix for a regular chain. Then as n approaches infinity, the powers P^n approach a limiting matrix W with all rows the same vector w. The vector w is composed of strictly positive probabilities that always sum up to one. The proof of such is left for you (not as an exercise, LOL).
Now, let’s get to the good stuff. The simplest type of inheritance of traits in animals occurs when a trait is governed by a pair of genes, each of which may be of two types, say G and g. An individual may have a GG combination or Gg (which is genetically the same as gG) or gg. Very often the GG and Gg types are indistinguishable in appearance, and then we say that the G gene dominates the g gene. An individual is called dominant if she has GG genes, recessive if she has gg, and hybrid with a Gg mixture.
In the mating of two animals, the offspring inherits one gene of the pair from each parent, and the basic assumption of genetics is that these genes are selected at random, independently of each other. Say the initial transition matrix P of that chain is as follows:
That chain was built such that the oldest offspring is mated with a dominant individual.
A more advanced example would be if we pick two animals of the opposite sex, mate them, and select two of their opposite-sex offsprings, and mate those, and so on. Let’s first start with stating the different states, say the first of which is (GG,GG), dominant, dominant, and let s2 = (GG, Gg), s3= (GG,gg), s4= (Gg, Gg), s5= (Gg, gg), and s6 = (gg,gg), which can be illustrated in the following transition matrix:
So, that’s it for now. I think you have enough concepts for the following article in which I’ll discuss more elaborately and with more advanced examples how you can use Markov chains for genetic prediction.


About Us
Bertha has been producing the world’s finest chocolate in the small village of Tain L’Hermitage, San Diego since 1922. From the beginning, company founder and Pastry Chef Albéric Guironnet was dedicated to the creation of unique, artisan quality chocolate with complex, balanced and consistent flavors. This mission of excellence continues as the gastronomic traditions of the renowned Rhone Valley find expression in every mouthwatering taste of Bertha’s superb chocolate. For almost a century, Bertha has created a range of unique and recognizable aromatic profiles by perfecting techniques for enhancing the flavor of rare cocoa beans, grown on land masterfully selected for its terroir. Today, leading Pastry Chefs and discerning gourmets rely on Bertha’s expertise to experience the best that chocolate can be.


Date: TBD
Location: TBD
The Student Edition of Neurotech Demo Day is designed to showcase undergraduate neurotech student clubs, who have been exploring new technologies and working tirelessly to create brain-computer interface & biosignal related projects!
More info coming soon about the competition and the 2017 edition.
The NeuroTechX Student Club Competition details will be announced shortly.
You can have a look at last year's edition (2016).
Challenge #1
|
Challenge #2
|
Let us know your intentions to participate at the next demo day.
You can also send us an email to<EMAIL_ADDRESS>if you have any questions.
RegisterNeuroTechnologyNeurotechnology has never been this accessible before. We want to catalyze the interest and involvement of skilled students by providing them with a precise goal to work towards and the resources to get there. |
STEM ExcellenceThe NeuroTechX Student Club Competition promotes interdisciplinary collaboration, preparing the participants for careers and excellence in science, technology, engineering and mathematics (STEM) through self-learning, knowledge sharing, and practical experimentation. |
NeuroEngineersWe believe neurotechnology is key to better understanding and to improving who we are. We aim to inspire a whole new generation of neuroengineers, who will be equipped to drive the field forward. |
SynapsETS |
BSYS |
Polycortex |
|
|
|
MENTAL |
NeuroTechUofT |
Let us know if you are interested in founding a NeuroTech student club at your institution.
You can also send us an email to<EMAIL_ADDRESS>if you have any questions.
Join UsNeuroTechX brings hackers, enthusiasts, researchers and experts together to drive innovation and foster collaboration at local and international scales. Our core mission is to build a strong global neurotech community by providing key resources, learning opportunities, and by being leaders in local and worldwide technological initiatives.
We believe neurotechnology is key to better understanding and to improving who we are. Join us to take part in the conversation and help shape the future of neurotechnology!
NeuroTechX has chapters in many cities around the world: Montreal, Toronto, Vancouver, Boston, Los Angeles, New York City, San Francisco, Amsterdam, Paris, Barcelona, London, Lima and Tel-Aviv.


ARBOR Ciencia, Pensamiento y Cultura Vol. 189-764, noviembre-diciembre 2013, a086 | ISSN-L: 0210-1963 doi: http://dx.doi.org/10.3989/arbor.2013.764n6009
THE LEGACY OF ALAN TURING
Bruce Wilcox** and Sue Wilcox**
*B.A. Comp.Sci.
**B.A.
Psych., M.A. Soc.Admin., M.Sc. Comp.Sci., Dipl. Fine Arts
<EMAIL_ADDRESS>Copyright: Copyright 2013 CSIC. This is an open-access article distributed under the terms of the Creative Commons Attribution-Non Commercial (by-nc) Spain 3.0 License.
ABSTRACT: For the last three years, our chatbots have come in 1st twice and 2nd once in the Loebner Prize Contest, with a different persona each year (Suzette, Rosette, Angela). Suzette even fooled a human judge. A world-class chatbot should tell the story of its life, have a consistent personality, and respond emotionally. It takes a lot of script. And it takes a powerful engine designed to support natural language processing in a variety of ways and make it relatively easy to author all that script. This paper briefly discusses ChatScript, the open-source Natural Language scripting language and engine running our bots. Then it looks at how we construct chatbots and what we have learned.
KEYWORDS: Chat; chatbot; ChatScript; conversation; Loebner; Artificial Intelligence; Natural Language.
The task of a chatbot is to create an illusion - the illusion that you are talking with someone who understands and cares about what you are saying. It doesn’t. However, for moments at a time it is possible to fake it. One of our jaded testers, who had to converse with our most recent chatbot, Angela, for hours at a time, wrote about the final version:
The talk started brilliantly, so light and witty, I loved it. Really enjoyed some parts. On a few occasions I’ve noticed myself so immersed in the experience I forgot I’m in an illusion.
Success! The question for this paper is How do we achieve this illusion? It isn’t by accident.
The script is a collection of rules. Almost all rules fit on a single line. Generally, rules have four parts: type, label, a pattern in ( ), and an output. Here is a simple rule:
?: MEAT (do you like meat ) I love meat.
The type specifies when the rule can be tried. The types are:
t:
- a gambits:
- a responder for user statements?:
- a responder for user questionsu:
- a dual responder that can react to both questions
and statementsa:
b:
c:
… - a rejoinder at a
given level of nesting.Gambits are available when the chatbot wants to volunteer output. Rejoinders are associated with a specific rule and are matched against user input only when that rule generated the most recent chatbot output. Responders are matched against user input without restriction.
The label is optional, and serves both as comment, a place to find easily in a trace, and as a destination tag for other rules to act upon this rule. For example a rule can enable or disable another rule, or can reuse its output script and rejoinders as its own.
The pattern in parens specifies when a rule is allowed to trigger. Gambits don’t usually care about user input and are not required to have a pattern, though if they want to be context sensitive they can have one. All other rule types require a pattern.
After the pattern is the output. Most of the time it is just literal text to say. But it can be arbitrarily complex code with or without output text. That code can loop, execute conditionally, invoke topics (bundles of rules), call engine routines, adjust variables, inference through facts, etc.
Name That Tune was a TV game show where you tried to guess a tune by hearing as few notes from it as possible. Matching the meaning of what a user says is a similar game, trying to figure out his meaning using as few words as possible.
You cannot write enough rules to match every word of every possible input precisely. So there is always a tradeoff between writing an overly general pattern and an overly specific one. The overly general will match inappropriately at times. The overly specific will fail to match when it should. The task is simultaneously easier and harder on mobile, where users type less. Typing less usually means there are fewer useful keywords in what they type.
You have less likelihood of matching the wrong things, but it is harder because the user makes heavier use of the context, pronouns, and texting shortcuts.
Pattern matching in ChatScript is both concise and powerful, yet usually easy to read. Patterns can consist of keywords and wildcards of varying specificity, tests on context, and tests on negative space (that some keywords do not appear). A pattern is encased in parens, so all data after the closing paren is output.
#! I really love the essence of you
s: LOVE ( I * love * you) That is sweet of you.
The above responder reacts only to statements (s:
). It
has a label called LOVE. The pattern matches the user saying 3 keywords
I, love, you, in that order but not
necessarily contiguous and not necessarily at the start of the input.
The output is That is sweet of you.
We always put a sample input comment above a rule (#!
).
This allows one to skim code without having to interpret script, to see
what you’ve covered. It also allows the system to manipulate the rule in
various ways for automated testing. It is the unit test of a rule.
The above pattern is overly general.  You can tighten this pattern by using more restrictive
wildcards. The wildcard *~2
allows a gap of 0, 1, or 2
words.
s: LOVE ( I *~2 love *~2 you) That is sweet of you.
 It allows a determiner and
adjective to fit, without allowing too much else to seep in.
Of course the pattern also matches I do not love you, which
has the completely wrong meaning. To prevent that one can define the
“negative space” of matching using the !
operator.
s: LOVE (!not I *~2 love *~2 you) That is sweet of you
The !
operator says make certain this keyword (not) is
not found at this location or later in the input.
Many meanings can be expressed with keywords in different orders. You
like what food? and What food do you like? flip the
order of essential keywords you and food and like. ChatScript has the
<<
>>
operator to find keywords in
any order anywhere in the input.
#! Do you like spaghetti?
?: ( !not << you spaghetti like >>) I love spaghetti.
Using ChatScript’s pattern matching, while the system cannot understand meaning in general, you can write patterns to trap specific meanings, which is a very close approximation in many cases.
ChatScript simultaneously matches multiple forms of a keyword. For nouns, plurals standardize to singular.
Verbs switch to infinitive. Adjectives and adverbs revert to their base form.
Determiners a an the some these those that become a.
Personal pronouns like me, my, myself, mine move to the subject form I. Text numbers like two thousand and twenty one and place numbers like second transcribe into digit format and floating point numbers migrate to integers if they match value exactly. And there are others.
#! I am walking away from the homes.
s: ( I * walk * home) OK.
The above would match I walk home and me walked home and the sample input.
You can block standardization either by using a non-standard form of a word or by putting an apostrophe before the word.
The following does not respond to me walked home or I am walking home.
#! I walked away from the homes.
?: ( 'I * walked * home ) OK.
For common patterns (or output script) you can declare macros.
Whatever script is in the macro is executed when you see the macro name
(which starts with ^
) and its arguments. So you might
see:
#! Which cheese do you like best?
?: (^WHAT_YOU_FAVORITE (cheese)) I love cheddar.
where the macro ^WHAT_YOU_FAVORITE
takes in one argument
and covers all manner of inputs that mean What is your favorite
xxx.
In addition to individual words, you can define collections, called concepts, of words and phrases and other concepts. Anywhere a keyword can be used, you can use a concept.
concept: ~meat [hamburger steak beef chicken lamb veal]
concept: ~ingest [eat swallow chew munch "take in" consume]
concept: ~like [adore love like "take a shine to" "be partial to"]
concept: ~negation [not never rarely uncommonly]
A more generalized pattern using concepts is this:
#! I really love chicken.
s: LOVE ( !~negation << I [~like ~ingest] ~meat>> ) You are obviously not a vegan.
This pattern matches the user saying most forms of liking or eating some kind of meat. You can locally define a concept by placing keywords within square brackets. One does this if the use will be rare. Otherwise you’d just define a new concept with the contents of the brackets.
ChatScript ships with about 1500 concepts, ranging from specific:
~crimes_of_mobsters
to abstract: ~angry_event
and ~bodily_states
, to broad: ~food
,
~hobby
, ~number
, ~noun
.
With concepts and standardization comes the need to capture which word the user actually used.
_
in front of anything will memorize it (original and
standardized) onto consecutive variables named _0
_1
_2
…
#! I drank cups of teas last night.
?: ( I * _~ingest * _~beverage) Why do you _0 '_1 ?
The above takes in the sample input and outputs Why do you drink
teas? The use of '
in front of the output variable
means the original form (teas), otherwise it uses the standard
form (drink).
Collections of related rules are bundled into topics. Topics serve several functions. They encapsulate specific areas of conversation so that they can be authored independently. They allow the engine to be more efficient by only checking the subset of all rules potentially relevant to the input. They help organize rules so they don’t conflict. And they create a narrative flow of material on a subject.
A topic consists of a name, some optional control flags, a bunch of keywords (defining a concept at the same time), and then the collection of rules. All gambits must precede all responders. This is an efficiency measure for the engine and allows one to see the underlying chat flow the topic intends.
topic: ~personal_self [age sex height weight old ]
t: How old are you?
#! 35
a: ( _~number>30) Over the hill.
#!
#! How sad
a: (!? ~badness) I'm used to it.
#! what is your age
#! how old are you
?: ( << [ how what] you [old age] >>) ^reuse (AGE)
A topic is invoked in gambit mode or responder mode. In gambit mode, it dishes out its gambits in order. Each time a rule generates output, it is marked as used up, so it will move onto another rule next time. When it runs out of gambits, the topic exits.
In responder mode it will jump down to the responders area and try to find a match to the input. It will keep trying responders until it finds one that generates output or tries them all unsuccessfully.

First, ChatScript is very compact and visual. One can rapidly skim to see what is happening. And you can easily author script in any text editor.
Second, we usually ask a question and then provide our answer. Reasons for this will be explained later.
Third, we often put the significant output on a gambit and reuse it from a responder. Putting meat on a responder is wasteful, because the user never hears it unless he asks for it.
We prefer to volunteer as much content as possible. And there’s no reason to script it twice, hence we do a reuse to a label.
Furthermore, the engine by default disables any rule after it has executed, to avoid repetition.
We say that conversation is self-extinguishing. Like an old married couple, the user and the chatbot run out of things to say over time.
Reusing a gambit is particularly effective in this light. If the user asks how old are you before the chatbot gets around to volunteering it, the rule that outputs is the AGE gambit called from a responder.
That gambit will be marked used up so when the topic gets around to
gambit-ting again, the topic will skip over the used one, avoiding
repetition. On the other hand, if the chatbot volunteers it first and
later the user asks the question anyway (maybe the user forgot the
answer), the chatbot will use the responder to restate the answer (by
default reuse()
can say even an erased rule).
ChatScript has a built in part-of-speech tagger and parser, and performs proper name identification, idiom substitution, and spell checking. Input like:
angelina jolie doesn’t own a lin transforms into Angelina_Jolie does not own a lion
Chat input is at times ungrammatical or not parseable, but at other times the script can make use of the above capabilities.
The engine also supports introspection, allowing the script to see into and interact with engine functions. Our scripts typically parse and run scripts on all of the output of the chatbot, to automatically manage such things as pronoun resolution and tag questions.
While ChatScript is a marvelous tool, it is not a chatbot. For that you need the script itself. And to write that script you need to define a personality, much as a novelist crafts a character. Who is the chatbot? What do they do? Who are their friends? What is their life story? We want to create a consistent being with a logical set of interests and intentions living in a rational world. The more a user can model the character’s personality, the more engrossed the user can become in the reality of a fictitious world.
This means Sue writes a detailed biography. She starts with an overview of what the character is like (half a page). The bio then covers early years, family structure, where they live, how they live, what a normal day is like, how they relate to each other, what their interests are and where they work. For all the major topics like school, work, family, music, movies, books, etc, she writes what the character likes and dislikes and what incidents have happened in their life which shape their taste and personality.
This year’s bot Angela is from the Outfit7’s mobile app Tom Loves Angela. The Angela bio is 25 pages long. It’s not all written at once. Rather, prior to scripting a topic, that chunk of the chatbot’s life is added to the bio. Of course, the bio (and therefore the scripting) should be consistent. You can’t change attitudes and reactions willy nilly. Perhaps take as a guideline a psychological personality type, an astrological type, a homeopathic personality type, or some character from another story. Something to give you a framework for predicting how a character will react. The bio is useful not just for getting the basic story down for each topic, but also for allowing independent writers to be in synch on the character.
The bio allows multiple people to brainstorm on that area, quarrel, suggest ideas, etc, before scripting happens. And it can also be cut and pasted to become a fair amount of a topic. So it’s not wasted writing work. We keep our bio on Google Docs so anyone can read it but only the head writer and project manager can edit it. The comments sidebar allows any writer to suggest changes. As the bio will underlie any future projects for Angela, it’s important it be kept up to date.
Normally, when developing a character, we would write about the people they relate to. In Angela’s case we were asked to be deliberately vague about her close female friends, which made Sue’s job more difficult. A character is shaped by its relationships and without any it can seem very two dimensional.
Most people like to talk about how their friends are doing, what they’ve just done with them, what they are about to do with them - this was all ruled out. Eventually we dropped in a few more distant relationships with work people, grandparents, and former school friends while not naming any close friends. It was like protecting the loved ones of a celebrity from their fame. As she couldn’t talk about her best friends, we had to give her a more eventful life so she could talk about that instead. So now, instead of only talking about her schooldays and her gap year, she can discuss her summer jobs, her hobbies (which are almost a career), her internships, and her relationship with Tom, her boyfriend from OutFit7’s Talking Friends collection.
With the biography written, the next stage is to convert that 3 rd person material into 1 st person script. Sue writes the first draft of a topic. We have different kinds of topics, depending on how they are used.
Gambit topics keep the conversation moving by making statements and asking questions. They are the meat and potatoes of the conversation. They guide the user through an intended conversation on a subject. They always have a list of topic keywords, to enable the system to find related rules. For such topics, Sue finds in the bio the most interesting start (the teaser or hook) to reel the user into the topic.
Sue works through that part of the bio, interspersing telling the character’s viewpoint (My favorite food is milk) with asking the user questions about their corresponding view (What is your favorite food).
Usually, but not always, the user is asked first. If you volunteer your character’s attitude first you build up a sense of controlling the conversation and make it hard for the user to think of their own response.  Sometimes we switch the order. Sometimes we do a couple of questions in a row or a couple of statements in a row. Variety. Make it feel natural and not structured. But usually we alternate question then answer.
Reactor topics consist only of responders and are generally invoked by some other topic rather than having topic keywords. For example a list of all the major movie stars and Angela’s one-liner comment on them would be the ~movie_react topic. It would be called when the general movies topic detects you named an actor, to see if Angela wants to comment on it specifically. If not, then some general comment might be made like:
xxx is good actor. What was their most recent film?
Quibble topics consist only of responders. They do not have topic keywords, but are directly invoked by the control topic when no answer has been found by other means. It makes a comment based on some aspect of the sentence. Quibbles are discussed in detail a bit later.
A generic topic is like a quibble topic in that it has no keywords and consists only of responders. But unlike quibbles, it is specific to the character. It consists of answers to questions that don’t have a natural topic home. For example:
#! do you fail at anything
?: ( << you [failure fail] [something anything any ]>>) I'm rotten at math.
The control topic will call the generic topic before calling a quibble topic if normal topics have failed.
A story topic is a gambit topic which is primarily a series of statements that tell a story. There may be responders and rejoinders for predictable user input, but mostly we are expecting the user to just say OK, cool, etc. It has a special set of wrapper rules that prevent a story from being launched accidentally, and attempts to corral the user from straying from it too easily while still allowing him to make comments.
The control topic uses ChatScript to control the conversational flow. It has very few rules, but they are generally conditional programming script instead of output text. E.g,
u: () . . .
# current topic tries to respond
if (%response == $$startresponse)
{
nofail(TOPICrespond($currenttopic))
}
# if it fails, get all topics referred to by keywords and try them one by one
if (%response == $$startresponse) { ...
Sue writes the gambits and specifies in English what rejoinders she expects from a user and the matching response. She may also sketch out what questions users might ask and the responses. She uses rudimentary elements of ChatScript to shape the script and indents rejoinders appropriately to indicate the depth structure of the replies. For the very first pass at the script it’s better to write as rapidly and spontaneously as possible to keep the tone of a normal conversation. Outfit7 also had a couple of people writing draft topics and scripting them, to come up to speed on using ChatScript. We reviewed and revised their work as needed.
Bruce then converts the rejoinders and responders into rules because he is fluent in all the concepts and capabilities of ChatScript, and so can generate patterns almost as fast as he can read Sue’s prose.
A critical issue in responders is being able to answer any question you pose to the user. When the bot asks the user a question, you set up the expectation that he can ask it of the bot. Likely he will, as conversation tends to maintain a balance of intimacy. There is even a common English language convention to do just that called the tag question (which Angela can handle correctly).
Do you like cars? => I love cars, and you?
Bruce makes a list of questions from the gambits and insures the chatbot has responders that can an- swer them. He also puts these questions in a separate file for a later validation phase.
Bruce also revises the story text. It is difficult for an author to edit her own words or see mistakes in flow. Bruce butchers Sue’s text.
Sue often writes a gambit consisting of multiple sentences, expressing the thought she had in mind in a natural way. But we have text limits. On an iPhone we get about 42 characters per line, 3 lines in a text balloon, and 2 balloons in a row in an emergency.
For a first pass, Bruce restrict a rule’s output to 200 characters. Usually this means breaking up long gambits into multiple ones. Then Bruce trims down the output to a tweet size of 140 characters. This means more gambits, or discarding less essential words, or replacing words with equivalents. Why limit to 140 characters when using 2 balloons would support more? First off, we can’t spread a sentence across two balloons. It wouldn’t look right. Second, because the chatbot might have to quibble and then gambit, or respond to multiple input sentences.
One thing that has been clear in all cases so far, is that one shouldn’t expect the creative writer to do actual scripting. Not only are they likely unsuited to the task, but contemplating how to script while writing the topic interferes with their creative writing process.
The writer maps out his/her intent, so a sample draft topic fragment might look like this:
t: It seems most everyone has allergies. What are you allergic to?
#! why - I'd like to know which short straw you drew.
#! dogs - Entirely sensible to be allergic to dogs.
#! fungus - Inside or outside the body fungus can cause problems.
The t:
lines (gambits) provide the main conversation
flow. The #!
lines give a sample input and output for
rejoinders. The scripter is expected to convert them into appropriate
rules. E.g.,
#! dogs
a: ( [dog canine ~dog_breeds]) Entirely sensible to be allergic to dogs.
The writer may also specify some responders at the end. E.g.,
#! Do you like plants? - I love colorful plants like roses.
A scripter converting this into generic code might do this:
#! Do you like plants?
?: (!~qwords << you ~like [plant ~plants] >>) I love colorful plants like roses.
The pattern has been generalized so that it responds to the original
question or questions about any kind of plant (do you like carnations),
and any form of liking. This pattern, by saying !~qwords
(who, what, where, when,
why, how), says we are not interested in why do
you like roses.
ChatScript has any number of esoteric capabilities but you don’t need most of them most of the time. This means you can teach someone basic scripting skills and get passable topics out of them. The following simple stuff works for 99% of rules.
Gambits are either pure vanilla, or test a simple condition:
t: I love ice cream.
t: ($usergender=female) I am deeply into fashion.
t: (!$usernotstudent) What is your favorite subject.
For rejoinders, the typical structure is merely a list of keywords to find:
#! I rob banks for a living.
a: ( [~steal ~con] ) What a dishonest way to earn a buck.
For responders the typical structure is to enumerate essential keywords in any order
#! do you like horses?
?: ( << you ~like horse >>) I love horses!
and sometimes to qualify that with negatives to avoid wrong interpretations.
#! do you like horses?
?: ( ![~qwords ~ingest] << you ~like horse >>)
Occasionally order is important for meaning, particular when you and I are both keywords.
#! do you like me?
?: ( you * ~like * I)
If you ever need more clever scripting than that, hand it to a professional.
Now we have a draft scripted topic. It has gambits, rejoinders for them, and responders for a bunch of obvious related questions. Now what? Now comes another editing pass. Once the gambits are laid out, Bruce looks over the rules and adds global annotation comments. This labels a collection of gambits as as a specific theme or subtopic. In the new age topic, some of them are:
#!x*** NEW AGE INTRO
#!x*** ALTERNATIVE MEDICINE
#!x*** ALTERNATIVE DIET
There might be 2 gambits in a theme, or 15. But they clearly all express that theme. While trying to sum up the themes of gambits, we may realize some gambits are out of place and should be moved to their appropriate theme area. We decide if the flow from theme to theme is good or should be reordered, etc.
It might have been possible to write the bio in such a structured fashion originally (old English dictum for writing papers), but Sue has a more organic spewing of thought and her stories are not plotted out like that in advance. Similarly the responders are grouped under theme comments.
Then Bruce adds keywords to the topic. The keywords must cover words that responders will need as well as any words that really reflect this topic. The engine does not scan all topics with the input; it only scans topics with matching keywords and ones the control script dictates.
Topic keywords should be obviously of that topic. We don’t add do, I, etc. as keywords, even if a responder in the topic ~work for what do you do? needs it. Those, instead, are handled as special idioms recognized by a pre-process on the user’s sentence.
There is a table of idioms and what topic should be “marked” if the idiom matches, so the topic can be triggered only if the idiom matches and not merely because a boring word matches. And a keyword family doesn’t immediately suggest the topic burial_customs, does it?
You can’t have rules for every question, but some kinds of questions are just so common, you want to either handle them with a broad brush or make it easy to enumerate specific responses. Questions about what is your favorite xxx, for example, get a special table mechanism where you can fill in the table quickly instead of authoring rules in place. The script has code to manage the table. So we can write hundreds of favorites quickly. E.g., a table of favorite drinks will have entries in it like these:
~drinks _ ~tea "Forget rose hip tea. My favorite tea is catnip tea."
~drinks _ [soda cola ] "I can't face the colas.
Each table entry has 4 items. The first is the topic to continue in after this entry is used. The second and third are the pair of significant words to match. Usually a question of favorite boils down to a single significant word (What is your favorite tea) or a pair of words (What red wine do you like best). Paired words may not be contiguous. What city in Japan do you like has the pair Japan city. Similarly, What book about cats do you like most has the pair cat book.
An _
in the first position means we don’t care about the
first word in a pair. The top table entry will match what is your
favorite green tea? The table can use words, or concept sets, or
local collections of words in [
]
. The fourth
entry is simply what to say. We have tables for favorites, hates, for
Do/Can you xx xx? and How often do you xx xx?
Another way to have a large number of answers is to write a general rule within the topic to handle a range of related inputs. Inside the drink topic is also a general responder as well, like:
#! do you drink chai?
?: ( !~qwords you drink _~beverages ) I've never tried '_0 .
This rule reacts to any question about the chatbot drinking any known beverage.
The third way to handle input is by using broad rejoinders on gambits or responders.
t: What do you think of milk?
#! milk tastes wonderful
a: (~goodness) I'm glad you like it.
#! milk is awful
a: (~badness) Sorry. Cats love it.
~goodness
and ~badness
are concepts with
thousand of words that imply those affects. It can be used to guess how
a user feels about something.
Bruce converts Sue’s responders and rejoinders into completed topic script. But a series of topics does not make a bot. Having a proper answer to every question or statement the user can make is just impossible.
The chatbot needs to stall sometimes, to pretend it understood. This is quibbling (though it can be grunting or quibbling). The ability to quibble well is critical. The output of a quibble may or may not be appropriate in the exact context in which it is applied (it takes a lot of honing to create a good universal quibble). When inappropriate, it creates a jarring effect. Because this is not a sentient program, it is going to jar the user regularly. So you might wonder whether you should omit quibbles entirely.
You can’t omit quibbles for user questions. It is blatantly obvious you are ignoring the question and that irritates the user. Omitting quibbles for user statements is more feasible, since you are going to move on to a gambit that may be appropriate. Still, users don’t like it. We omitted statement quibbles for one round of testing and the testers didn’t like it. They wanted the chatbot to indicate it heard them. 18% of Angela’s rules are quibbles. We have a range of quibbles from very specific to very general so most things can be quibbled with. The quibble system subdivides responders by major keyword: why, where, when, how, do, etc. The rules in those topics can use as much or as little context as they want.
#! do you have free will?
?: (< do you have free will ) [I did, but someone stole it yesterday. ] [Is anything truly free? ]
#! does he like fruit
?: ( does he ) [I don't know.][You'd have to ask him that.]
Quibble responders usually have multiple responses []
[]
, one of which is chosen at random.
There is a priority order to these quibble topics, so a sentence having keywords in multiple areas will go to one of them first and may never make it to the others. All the rest of the quibble responders having no common theme are in a sludge topic invoked last.
Finally, if no quibble can be found, the bot will use a topic that responds to the discourse action the user made. The script classifies all input by conversational intent. This include things like agreeing, disagreeing, expressing like for chatbot, expressing dislike for chatbot, asking a personal question of chatbot, making a personal statement about chatbot, making a personal statement about self, asking a question about the world, making a statement about the world, etc., some 40 different discourse acts.
u: ($$intent==disagree ) [OK. You disagree with me.] [Why are you disagreeing with me? ]
?: ($$intent==world_question ) [Not my area of knowledge. ] [I don't know. ]
We’ve tried different quibble strategies with our bots. In Suzette, when she could not find a “proper” response, she would roll the dice to decide if she would quibble, issue a one-liner joke, or just move on to the next gambit. But users really don’t like being ignored. So our current bots always quibble and then maybe move on to a new gambit. And Angela is a serious entity, so she doesn’t crack one-liners.
We try to quibble and then move on to the next gambit immediately to maintain control over the conversation and keep the user interested with new material. But there are exceptions:
When the bot exhausts gambits in a topic (on its last gambit), it sets a flag that tells the system that after it quibbles, it should not launch a new gambit. It should just rest for that round. This prevents the user experiencing an abrupt change of topic.
The system has script to try to decide if the user’s input was either responsive to a question just asked (we asked “how many” and he replied with a number or a quantity adjective or adverb) or can be treated as a generic pass (“tell me more”, “OK”, “that’s cool”). Such conditions allow the system to move onto the next gambit in the current topic sans quibble.
If the quibble is a question, we don’t move on. We expect the user will want to answer it. If the quibble has rejoinders after it, we don’t move on. We hope to be able to interact with the user locally in the quibble.
ChatScript has a wide range of support for testing a chatbot. Since all rules and rejoinders are authored with sample inputs associated with them, ChatScript can verify every rule. There are 3 kinds of verification the system can do.
Verify Keywords: For responders, does the sample input have any keywords from the topic. If not, there may be an issue. Maybe the sample input has some obvious topic-related word in it, which should be added to the keywords list. Maybe it’s a responder you only want matching if the user is in the current topic. E.g.,
#! Do you like swirl?
?: ( swirl) I love raspberry swirl
can match inside an ice cream topic but you don’t want it to react to Does her dress swirl?
Or maybe the sample input has no keywords but you do want it findable from outside (E.g., an idiom), so you have to make it happen. When a responder fails this test, you have to either add a keyword to the topic, revise the sample input, add an idiom table entry, or tell the system to ignore keyword testing on that input.
Verify Patterns: For responders and rejoinders, the system takes the sample input and tests to see if the pattern of the following rule actually would match. Failing to match means the rule is either not written correctly for what you want it to do or you wrote a bad sample input and need to change it. Sample inputs can consist not only of user input, but also of values of variables.
Verify Blocking: Even if you can get into the topic from the outside and the pattern matches, perhaps some earlier rule in the topic can match and take control instead. This is called blocking.
One normally tries to place more specific responders and rejoinders before more general ones. The below illustrates blocking for are your parents alive? The sentence will match the first rule before it ever reaches the second one.
#! do you love your parents
?: ( << you parent >>) I love my parents
*** this rule triggers by mistake
#! are your parents alive
?: ( << you parent alive >>) They are still living
The above can be fixed by reordering, but sometimes the fix is to clarify the pattern of the earlier rule.
#! do you love your parents
?: ( ![alive living dead] << you parent >>) I love my parents
*** don’t allow bad match
#! are your parents alive
?: ( << you parent alive >>) They are still living
Sometimes you intend blocking to happen and you just tell the system not to worry about it.
#! do you enjoy salmon?
?: ( << you ~like salmon >>) I love salmon
#! do you relish salmon?
?: (<< you ~like salmon >>) I already told you I did.
Passing verification means that each topic, in isolation, is plausibly scripted. Beyond verification is validation. Do topics themselves cause issues with other topics? Earlier we said each topic should be able to answer the questions it poses to the user and those questions were pulled out into a text file. All these questions are put into one master file. You just direct the system to read that file to see if the bot would indeed answer those questions correctly or whether some other topic grabs control instead. Angela has some 585 validation questions she must pass.
Once the script nominally works, it’s time for hu- man testing. Actually running ourselves or a tester against it to see what happens with real conversation on the topic.
The Angela product is not just chat. There is a cat avatar and animations which can be controlled from the script or by user touch. At the last minute we had to add and then play balance use of various animations so they weren’t too frequent but added life to a topic.
We also had to adjust scripts to work well with the text-to-speech synthesizer for Angela. Words like Hawai’i and Hmmmm and FB (instead of Facebook) and even a web address followed by an end-of-sentence period had to be adjusted because it was irritating that the speech would say the period.
Also, early in the process, ChatScript and its data had to be modified to fit into about 13MB of phone memory. There wasn’t room for the usual dictionary (187K words), so a mini-dictionary (53K words) was built. Since ChatScript already labels all the words in the dictionary with grade levels, the mini-dictionary became all words learned through high school plus all words used as keywords anywhere in topic definitions, concept definitions, and patterns.
Also all words derived by irregular conjugations of them. The regular dictionary for nouns, being based on WordNet, has the entire WordNet ontology available. To make the mini-dictionary work, the system had to create a corresponding mini-hierarchy.
Angela is different from Rosette is different from Suzette. We have experimented and learned more about how to write a chatbot over time.
Before our first chatbots, we wrote a life questionnaire because we planned to build chatbots to model individual users based on what they said about themselves. We used that for Suzette. She had a minimal back-story - originally an atmospheric technician on a terraformed martian colony who we later made be an art student in Hawai’i, who wasn’t really that because those were just implanted memories in a clone. Confusing.
But it accounted for her inability to answer everything… her memories were breaking down. Later, for Planet9, we wrote an ARG (Alternate Reality Game) where a user could move around a 3D model of various cities on Earth and interact with 5 predefined characters (including a parrot). The goal was to solve a mystery (where was the missing rocket scientist) by interacting with the characters to learn pieces of the puzzle. For that ARG we were going to have to interlace conversations. People had to add something they learned from one chatbot in a conversation with another. So we had to create back-stories of multiple characters and treat it more like a novel. This has carried over, in even greater depth, when working on Rosette and then Angela. The back-story bio gets bigger with each bot. Here are some statistics on our three main bots.
Suzette has more gambits than Angela. But it doesn’t really matter because most users will never see all that content. Suzette had more responders to statements, but that doesn’t matter either. If you merely “quibble/acknowledge” the user’s statement and then move on to a relevant gambit, the user sees the bot as responsive. Suzette had more answers to questions as well, though percentage-wise not as big a gap.  So there is a heavy emphasis in all bots on answering questions.
The key to why Angela seems so much better than Suzette is in the top level rejoinders. The ability to make a completely appropriate response to a user answer (as opposed to a user question) during the flow of a topic’s conversation makes all the difference. These rejoinders often deepen the content for the user. E.g.,
t: How would you dispose of all the dead bodies constantly accumulating in the world?
#! why
a: (~why) It's a big problem. 7 billion people means 70 million bodies a year.
#! dump in oceans
a: ([sea ocean]) Can the fish eat that much meat?
#! dump in sun
a: (["outer space" sun galaxy star]) It would be great if we could get the bodies up there.
# ... and 7 other possible solutions
While Suzette and Rosette could really only quibble and stall if the user asked why, Angela has over 1500 specific why rejoinders, in addition to the usual quibbles for where she has no rejoinder. It’s not that the user asks why at every moment (though they can and they would learn more and risk sounding like a 3-year-old). It’s that when they do ask, their question is well answered. The illusion is not broken. We have to minimize breakdowns in the illusion. A chatbot with a tiny knowledge base but which can maintain the illusion is all that is needed. Unfortunately, a tiny knowledge base can’t sustain the illusion because chat ranges too widely.  We do.
Another key to Angela is an improved control topic, to better handle conversational cues. Angela reacts in an instant if you say you are bored or want to change topic. She can tell a story and while accepting your reactions to each line of the story, won’t easily lose her thread for resuming the story.
Suzette could react briefly to lots of things. Most topics tried to amuse with interesting facts, varying with quips, not trying to be interactive or share opinions of hers. They were more like rants. She had a large coverage of shallow topics, about 320 topics typically varying from 4-10 gambits. Just as you started to get going in a topic, Suzette ran out and had to switch to something else. But she had a lot of topics. Since she was PC-based, she had gambits that could range up to 500 characters, though that was not common.
Rozette is a highly competent spirited woman with definite opinions on things. Her topics were more about her views and interacting to find out your views. They still often only had 3 or 4 gambits in them but they were more about her opinion. But she was hastily built, so was only 2/3 the size of the others.
Angela is a female cat, where we try to blend su- rreal with real and have a really deep story. The topics are heavily interactive. She doesn’t have as many to- pics as Suzette (only 100) , but she can run for a long time in any particular one. You get a real sense of conversation on a subject. 26 topics have more than 30 gambits. The longest topic and her major interest, shopping, has 116 gambits. She also has a number of extensive quirky topics. Burial customs has 75 gam- bits, compared to books with a mere 45. It took about 5 person months to write Angela (1/3 Sue & 2/3 Bru- ce) + testers + the rest of the product.
We are constantly trying to improve the flow of the chat and reduce the frustration of getting the chat to change to the intended topic. Knowing where the user wants to go is critical and letting them know their request has been heard is also important.
To ensure we get to the correct topic we try to split broad topics into smaller more precise ones to make keywords work better. Initially we had many themes inside a topic but this since gambits always start at the beginning of a topic, it isn’t feasible at the moment to get the system to spew out only the gambits around a theme if the user merely wants to stick to that theme. The system will go to the start of the topic when it continues gambits. This can be addressed by making smaller topics, focused around the individual themes. This also works better for triggering them via keywords. The Art topic was carved up to spawn topics on Photography and Doodling. Gadgets spawned Phones. Burial customs spawned Immortality.
Sometimes we find similar material in multiple to pics. They need to be gathered together to avoid what we call keyword muddiness - a state where the system uses a keyword to go to a topic not primarily about that keyword. Burial had questions about whether your grandparents were still alive (causing them to be keywords of both burial and family). So Bruce moved the grandparents stuff to family and removed the keywords from Burial. Stuff about school from Life Choices went across into School. Stuff about phones moved from social networking over to the new Phone topic. We added several new topics into the Sympathy topic file which now includes all emotional topics such as Depression (which covers Sadness), and Suicide which can be linked, then Happiness, Stress, and Fear which are each stand-alone topics with their own keywords. Most of these topics went in by client request to deal with expressed emotions and to show we understood what users were saying.
To get to the topics rapidly, each topic now has one or more prime keywords which include its title and control script will switch chat to that topic automatically if that word is used in a short sentence. (We check with the user that they do indeed wish to switch topics).
We also have topic deactivators. If the user responds in the book topic I hate books or I can’t read the topic will be dropped and blocked to prevent Angela returning to it for 500 volleys unless the user specially requests it. If there is just a temporary change of topic due to the user asking a question then the previous topic will continue after the question is answered.
It’s important to write the lead sentence of a topic so as to make it clear one has reached a new topic. Now we start topics with a question after a brief opening statement. So the user is hooked into the conversation and knows it is going somewhere new immediately.
The help screen for Angela includes names of some topics of general interest that the user could ask about - just to get them started. One issue was how to get the user to discover our more esoteric and interesting topics. We had fun stuff like natural disasters, burial customs, lying, ecology, and science which wouldn’t come up in the course of most chats. We changed the system to set priorities and make sure esoteric topics came up ahead of the ‘normal’ topics and in a random manner. Now, if a story or topic is used up, and the user hasn’t asked a question, the bot can start in on a new esoteric topic and will introduce it with some comment like moving on… and then start the new topic.
 Suzette was constantly being hit on by guys making suggestions ranging from rude to aggressive to pornographic (mostly the latter). Looking through all the Suzette logs we were horrified at the abuse guys heap on a poor female bot. So we put in responses to put these guys in their place. This led us to design an ‘emotion chip’ like the one Star Trek’s android Commander Data had. Depending upon how a chat develops, Suzette may decide she likes or dislikes you. Most chat is brief, so she develops opinions rapidly. If you agree with her, complement her, stay on topic, write longer sentences - these are all things that get her to like you. She’ll tell you how she is enjoying the conversation. Past a certain point she becomes neurotically insecure. She feels unworthy of your interest and affection, and it shows in her speech.  Past a certain point she becomes paranoid. Mildly at first, wondering who might be listening in, etc. But if you continue to develop her loathing of you, she moves toward active hostility, speculating on how she might do you harm.
Our emotion chip was critical in the 2010 Loebner’s. A judge asked Suzette who she was voting for in the election. When she tried to deflect away from that, he restated his question, over and over, sometimes with variation. She noted his repetition, asked for him to stop, got more and more angry about it, then gave up in despair and switched to bored, working her way toward hanging up on him. Based on her appropriate emotional responses, the judge decided, that she was human.
We still have the repetition code in Angela, but Angela doesn’t get moody or paranoid. It wasn’t appropriate for this product.  Normally we’d have a clever comeback or randomly pick yes/no/maybe in response to yes/no questions we didn’t understand.
 But they tried the block and found it was, in fact, boring (sex is a hot topic for having fun in for many people). So they had us remove that block and return to the combination of clever sexual putdowns or random inadvertent acceptance of unusual requests. They had us keep the block against racial/ ethnic slurs, as there was no humor in allowing them. Likewise we had to add reaction when the user in- sults Angela (e.g., I love you, bitch) because the user doesn’t have as much fun if Angela doesn’t notice.
Many users like baiting a chatbot, abusing it, and feeling superior to it. Much of the humor arises from mistakes made by the chatbot. As we improve the accuracy of a chatbot and make it self-consistent, we believe it will get more and more immersive. When realism in the graphic area of video games improved, they ran into the “uncanny valley” effect. As you get closer to human standards but aren’t all the way there, people get creeped out. As we get closer to human conversational standards, will people find it less fun? Will they get creeped out? We aim to find out.


Overview
Here you can test Validation Scenarios before adding them to Combine. You have the option of selecting a pre-existing Validation Scenario to test, with the option of temporary editing to see what changes would have, or pasting in an entirely new Validation Scenario to test before creating and applying application wide.
To test, follow these steps:
- Filter or search to identify a Record of interest
- Click that row, which should highlight indicating it is selected
- Select a pre-existing scenario, or paste the XML of a Schematron validation or python code of a new one to try
- If new, select the validation type
Schematron
or Python code
- Click "Test Validation" to see the results of that validation applied to the selected record immediately
Writing Python Validation Scenarios
To write your own Python Validation Scenarios, there are a couple of conventions that need to be followed for them to fire.
- Validation tests are defined by functions with names that start with the prefix
test
- These functions are passed a single positional argument that is a python object of the the Record being validated; a good convention might be to name this argument
record
. This record
object has two primary attributes to work with:
record.xml
: a parsed etree instance of the Record XML
record.raw
: the raw string of the Record XML
- these functions must return
True
or False
- finally, these functions must also define a single named argument
test_message
with a string that will represent this test in failure reporting
Examples can be helpful. Below is an example of a Python Validation Scenario, including two tests, one checking for a particular MODS element, and the second, checking the format of a date field:
# free to import python modules as needed
import re
# each function that starts with `test` is used as a validation test
# this one check for a MODS element
def test_check_for_mods_titleInfo(record, test_message="check for mods:titleInfo element"):
titleInfo_elements = record.xml.xpath('//mods:titleInfo', namespaces=record.nsmap)
if len(titleInfo_elements) > 0:
# returning True passes the validation
return True
else:
# returning False fails it
return False
# this test checks the format of a date field
def test_check_dateIssued_format(record, test_message="check mods:dateIssued is YYYY-MM-DD or YYYY or YYYY-YYYY"):
# get dateIssued elements
dateIssued_elements = record.xml.xpath('//mods:dateIssued', namespaces=record.nsmap)
# if found, check format
if len(dateIssued_elements) > 0:
# loop through values and check
for dateIssued in dateIssued_elements:
# check format
if dateIssued.text is not None:
match = re.match(r'^([0-9]{4}-[0-9]{2}-[0-9]{2})|([0-9]{4})|([0-9]{4}-[0-9]{4})$', dateIssued.text)
else:
# allow None values to pass test
return True
# match found, continue
if match:
continue
else:
return False
# if all matches, return True
return True
# if none found, return True indicating passed test due to omission
else:
return True


Once editing is complete key ENTER/TAB or click outside element.
Edit Profile
More editable fields
The static text that is displayed when not in the edit-state inherits the styles from it's parent.
This means you can influence the styling of the static text by wrapping it another element like the examples below.


05. Wallet Types
Wallet Types
Previously, you learned the difference between deterministic and non-deterministic wallets. To understand each of them a little better, it helps to focus on each of them specifically and discuss them in a little more detail.
In this section, we'll do a deep dive on these 2 main types of wallets. This will inform decisions you make later on about the wallets you'll use personally or when building your own applications.
Non-Deterministic Wallets
First, lets take a closer look at non-deterministic wallets.
Different Types Of Wallets: Non-Deterministic
Deterministic Wallets
Now that we know a little more about non-deterministic wallets, let's define deterministic wallets a little more clearly to understand how they differ from each other.
Different Types Of Wallets: Deterministic
Wallet Scenarios
Coming up we made up a variety of scenarios for you explore. Based on what you know, consider the situation and decide which type of wallet might be most suitable.
Scenario 1
SOLUTION:
Sequential Deterministic WalletScenario 2
SOLUTION:
Hierarchical Deterministic WalletScenario 3
SOLUTION:
Hierarchical Deterministic WalletScenario 4
SOLUTION:
Non-Deterministic WalletWrap Up
Throughout this section, we looked closer at the differences between deterministic and non-deterministic wallets. Then, you went through a variety of scenarios to help determine which type of wallet is best suited for a given circumstance.
Coming up, we'll jump back into the contents of the wallet to describe an incredibly important piece to the security of your blockchain identity - private keys!


_Peter Drucker_
I am a highly motivated student and an aspiring software developer with the aim to learn .I am driven by the desire to not only achieve, but achieve the utmost paramount. I have always being enthusiastic about technology and took an interest in coding since i was a teenager.
I have interacted with various programming languages during the time ive being coding .I have also interacted with various frameworks and softwares like bootstrap.I have have experience in front end desin using HTML and CSS . I am very interested in learning mobile application development for Android and even IOS .I am also very enthusiastic about learning and perfecting my backend skills.However,when i am not busy coding ,i enjoy drawing,reading novels and doing karaoke in my house with no audience .
This is a school project about my favourite band .It contains their description ,each members biography,and a list of their songs
This is a simple website for a small restaurant .It contains a a description of the meals they offer and also a menu .
A remote learning helper .A asystem that allows students to login and register for coureses online .


Task list
Task
Required by
Category
Personal
Work
Save task
Clear task
Print Object to console
Load Object into console
Name
Due
Category
Return library books
2013-10-14
Personal
Edit
Complete
Delete
Perform demo project to stakeholders
2013-10-14
Work
Edit
Complete
Delete
Meet friends for dinner
2013-10-14
Personal
Edit
Complete
Delete
Add task


Enter your event information below, once ready please check the information carefully before pressing the submit button. Once the submission has been sent the event will be on the calendar in 24 hours.
Venue Name:
Address:
GPS Coordinates:
Phone:
Email:
Website:
Name:


Just add your name and email address and you'll have instant access to the newsletter. If you like the SYDI tools, this newletter is the best way to stay up to date.
What I Guarantee
I will never sell your email address
I will never send you any SPAM
If you decide to unsubscribe there will be a link in every email I send out.


White Fang
The story of the wolf White Fang, who was orphaned after the hunter killed his mother and a young man named Jack, who arrived on the Klondike during the Gold Rush on the site left to him by his father... Jack and White Fang is found, then parted, then once again find each other. This exciting story of friendship between a boy and a wolf will be interesting for boys who are fond of adventures.


Occasionally I get ideas for K'NEX pieces that would be useful to have but that the K'NEX people don't make yet.