-
addEventListener(eventName, eventListener) → {void}
-
Adds an event listener for a particular type of event.
Currently the only eventName supported is "roomOccupant".
Parameters:
| Name |
Type |
Description |
eventName |
String
|
the type of the event |
eventListener |
Function
|
the function that expects the event.
The eventListener gets called with the eventName as it's first argument, and the event
data as it's second argument. |
Returns:
-
Type
-
void
-
addStreamToCall(easyrtcId, streamName)
-
Add a named local stream to a call.
Parameters:
| Name |
Type |
Description |
easyrtcId |
String
|
The id of client receiving the stream. |
streamName |
String
|
The name of the stream. |
-
-
This function builds a new named local media stream from a set of existing audio and video tracks from other media streams.
Parameters:
| Name |
Type |
Description |
streamName |
String
|
is the name of the new media stream. |
audioTracks |
Array
|
is an array of MediaStreamTracks |
videoTracks |
Array
|
is an array of MediaStreamTracks |
Returns:
-
Type
-
void
Example
easyrtc.buildLocalMediaStream("myComposedStream",
easyrtc.getLocalStream("camera1").getVideoTracks(),
easyrtc.getLocalStream("camera2").getAudioTracks());
-
call(otherUser, callSuccessCB, callFailureCB, wasAcceptedCB, streamNames)
-
Initiates a call to another user. If it succeeds, the streamAcceptor callback will be called.
Parameters:
| Name |
Type |
Description |
otherUser |
String
|
the easyrtcid of the peer being called. |
callSuccessCB |
Function
|
(otherCaller, mediaType) - is called when the datachannel is established or the MediaStream is established. mediaType will have a value of "audiovideo" or "datachannel" |
callFailureCB |
Function
|
(errorCode, errMessage) - is called if there was a system error interfering with the call. |
wasAcceptedCB |
Function
|
(wasAccepted:boolean,otherUser:string) - is called when a call is accepted or rejected by another party. It can be left null. |
streamNames |
Array
|
optional array of streamNames. |
Example
easyrtc.call( otherEasyrtcid,
function(easyrtcid, mediaType){
console.log("Got mediaType " + mediaType + " from " + easyrtc.idToName(easyrtcid));
},
function(errorCode, errMessage){
console.log("call to " + easyrtc.idToName(otherEasyrtcid) + " failed:" + errMessage);
},
function(wasAccepted, easyrtcid){
if( wasAccepted ){
console.log("call accepted by " + easyrtc.idToName(easyrtcid));
}
else{
console.log("call rejected" + easyrtc.idToName(easyrtcid));
}
});
-
cleanId(idString) → {String}
-
A convenience function to ensure that a string doesn't have symbols that will be interpreted by HTML.
Parameters:
| Name |
Type |
Description |
idString |
String
|
|
Returns:
The cleaned string.
-
Type
-
String
Example
console.log( easyrtc.cleanId('&hello'));
-
-
Clears the media stream on a video object.
Parameters:
| Name |
Type |
Description |
element |
Object
|
the video object. |
Example
easyrtc.clearMediaStream( document.getElementById('selfVideo'));
-
-
Close the local media stream. You usually need to close the existing media stream
of a camera before reacquring it at a different resolution.
Parameters:
| Name |
Type |
Description |
streamName |
String
|
an option stream name. |
-
connect(applicationName, successCallback, errorCallback)
-
Connect to the easyrtc signaling server.
Parameters:
| Name |
Type |
Description |
applicationName |
|
|
successCallback |
|
|
errorCallback |
|
|
-
disconnect()
-
Disconnect from the EasyRTC server.
Example
easyrtc.disconnect();
-
doesDataChannelWork(otherUser) → {Boolean}
-
Checks to see if data channels work between two peers.
Parameters:
| Name |
Type |
Description |
otherUser |
String
|
the other peer. |
Returns:
true if data channels work and are ready to be used
between the two peers.
-
Type
-
Boolean
-
-
By default, the easyApp routine sticks a "close" button on top of each caller
video object that it manages. Call this function(before calling easyApp) to disable that particular feature.
Example
easyrtc.dontAddCloseButtons();
-
easyApp(applicationName, monitorVideoId, videoIds, onReady, onFailure)
-
Provides a layer on top of the easyrtc.initMediaSource and easyrtc.connect, assign the local media stream to
the video object identified by monitorVideoId, assign remote video streams to
the video objects identified by videoIds, and then call onReady. One of it's
side effects is to add hangup buttons to the remote video objects, buttons
that only appear when you hover over them with the mouse cursor. This method will also add the
easyrtcMirror class to the monitor video object so that it behaves like a mirror.
Parameters:
| Name |
Type |
Description |
applicationName |
String
|
name of the application. |
monitorVideoId |
String
|
the id of the video object used for monitoring the local stream. |
videoIds |
Array
|
an array of video object ids (strings) |
onReady |
Function
|
a callback function used on success. It is called with the easyrtcId this peer is known to the server as. |
onFailure |
Function
|
a callback function used on failure (failed to get local media or a connection of the signaling server). |
Example
easyrtc.easyApp('multiChat', 'selfVideo', ['remote1', 'remote2', 'remote3'],
function(easyrtcId){
console.log("successfully connected, I am " + easyrtcId);
},
function(errorCode, errorText){
console.log(errorText);
);
-
emitEvent(eventName, eventData)
-
Emits an event, or in otherwords, calls all the eventListeners for a
particular event.
Parameters:
| Name |
Type |
Description |
eventName |
String
|
|
eventData |
Object
|
|
-
enableAudio(enabled)
-
Sets whether audio is transmitted by the local user in any subsequent calls.
Parameters:
| Name |
Type |
Description |
enabled |
Boolean
|
true to include audio, false to exclude audio. The default is true. |
Example
easyrtc.enableAudio(false);
-
enableAudioReceive(value)
-
Control whether the client requests audio from a peer during a call.
Must be called before the call to have an effect.
Parameters:
| Name |
Type |
Description |
value |
|
true to receive audio, false otherwise. The default is true. |
-
enableCamera(enable, streamName)
-
This function is used to enable and disable the local camera. If you disable the
camera, video objects display it will "freeze" until the camera is re-enabled. *
By default, a camera is enabled.
Parameters:
| Name |
Type |
Description |
enable |
Boolean
|
true to enable the camera, false to disable it. |
streamName |
String
|
the name of the stream, optional. |
-
enableDataChannels(enabled)
-
Sets whether WebRTC data channels are used to send inter-client messages.
This is only the messages that applications explicitly send to other applications, not the WebRTC signaling messages.
Parameters:
| Name |
Type |
Description |
enabled |
Boolean
|
true to use data channels, false otherwise. The default is false. |
Example
easyrtc.enableDataChannels(true);
-
enableDebug(enable)
-
Enable or disable logging to the console.
Note: if you want to control the printing of debug messages, override the
easyrtc.debugPrinter variable with a function that takes a message string as it's argument.
This is exactly what easyrtc.enableDebug does when it's enable argument is true.
Parameters:
| Name |
Type |
Description |
enable |
Boolean
|
true to turn on debugging, false to turn off debugging. Default is false. |
Example
easyrtc.enableDebug(true);
-
enableMicrophone(enable, streamName)
-
This function is used to enable and disable the local microphone. If you disable
the microphone, sounds stops being transmitted to your peers. By default, the microphone
is enabled.
Parameters:
| Name |
Type |
Description |
enable |
Boolean
|
true to enable the microphone, false to disable it. |
streamName |
String
|
an optional streamName |
-
enableVideo(enabled)
-
Sets whether video is transmitted by the local user in any subsequent calls.
Parameters:
| Name |
Type |
Description |
enabled |
Boolean
|
true to include video, false to exclude video. The default is true. |
Example
easyrtc.enableVideo(false);
-
enableVideoReceive(value)
-
Control whether the client requests video from a peer during a call.
Must be called before the call to have an effect.
Parameters:
| Name |
Type |
Description |
value |
|
true to receive video, false otherwise. The default is true. |
-
-
This function performs a printf like formatting. It actually takes an unlimited
number of arguments, the declared arguments arg1, arg2, arg3 are present just for
documentation purposes.
Parameters:
| Name |
Type |
Description |
format |
String
|
A string like "abcd{1}efg{2}hij{1}." |
arg1 |
String
|
The value that replaces {1} |
arg2 |
String
|
The value that replaces {2} |
arg3 |
String
|
The value that replaces {3} |
Returns:
the formatted string.
-
Type
-
String
-
getApplicationFields() → {Object}
-
Get server defined fields associated with the current application. Only valid
after a connection has been made.
Returns:
A dictionary containing entries of the form {key:{'fieldName':key, 'fieldValue':value1}}
-
Type
-
Object
-
getConnectionCount() → {Number}
-
Returns the number of live peer connections the client has.
Returns:
-
Type
-
Number
Example
("You have " + easyrtc.getConnectionCount() + " peer connections");
-
getConnectionFields() → {Object}
-
Get server defined fields associated with the connection. Only valid
after a connection has been made.
Returns:
A dictionary containing entries of the form {key:{'fieldName':key, 'fieldValue':value1}}
-
Type
-
Object
-
getConnectStatus(otherUser) → {String}
-
Check if the client has a peer-2-peer connection to another user.
The return values are text strings so you can use them in debugging output.
Parameters:
| Name |
Type |
Description |
otherUser |
String
|
the easyrtcid of the other user. |
Returns:
one of the following values: easyrtc.NOT_CONNECTED, easyrtc.BECOMING_CONNECTED, easyrtc.IS_CONNECTED
-
Type
-
String
Example
if( easyrtc.getConnectStatus(otherEasyrtcid) == easyrtc.NOT_CONNECTED ){
easyrtc.call(otherEasyrtcid,
function(){ console.log("success"); },
function(){ console.log("failure"); });
}
-
getFreshIceConfig(callback)
-
Request fresh ice config information from the server.
This should be done periodically by long running applications.
Parameters:
| Name |
Type |
Description |
callback |
Function
|
is called with a value of true on success, false on failure. |
-
-
Returns the user assigned id's of currently active local media streams.
Returns:
-
Type
-
Array
-
getLocalStream() → {MediaStream}
-
Returns a media stream for your local camera and microphone.
It can be called only after easyrtc.initMediaSource has succeeded.
It returns a stream that can be used as an argument to easyrtc.setVideoObjectSrc.
Returns null if there is no local media stream acquired yet.
Returns:
-
Type
-
MediaStream
Example
easyrtc.setVideoObjectSrc( document.getElementById("myVideo"), easyrtc.getLocalStream());
-
getRemoteStream(easyrtcid, remotestreamName) → {Object}
-
Return the media stream shared by a particular peer. This is needed when you
add a stream in the middle of a call.
Parameters:
| Name |
Type |
Description |
easyrtcid |
String
|
the peer. |
remotestreamName |
String
|
an optional argument supplying the streamName. |
Returns:
A mediaStream.
-
Type
-
Object
-
getRoomApiField(roomName, easyrtcid, fieldName) → {Object}
-
Returns another peers API field, if it exists.
Parameters:
| Name |
Type |
Description |
roomName |
type
|
|
easyrtcid |
type
|
|
fieldName |
type
|
|
Returns:
Undefined if the attribute does not exist, its value otherwise.
-
Type
-
Object
-
getRoomField(roomName, fieldName) → {Object}
-
Gets a data field associated with a room.
Parameters:
| Name |
Type |
Description |
roomName |
String
|
the name of the room. |
fieldName |
String
|
the name of the field. |
Returns:
dataValue - the value of the field if present, undefined if not present.
-
Type
-
Object
-
getRoomFields(roomName) → {Object}
-
Get server defined fields associated with a particular room. Only valid
after a connection has been made.
Parameters:
| Name |
Type |
Description |
roomName |
String
|
the name of the room you want the fields for. |
Returns:
A dictionary containing entries of the form {key:{'fieldName':key, 'fieldValue':value1}} or undefined
if you are not connected to the room.
-
Type
-
Object
-
getRoomList(callback, errorCallback)
-
Sends the server a request for the list of rooms the user can see.
You must have already be connected to use this function.
Parameters:
| Name |
Type |
Description |
callback |
function(Object)
|
on success, this function is called with a map of the form { roomName:{"roomName":String, "numberClients": Number}}.
The roomName appears as both the key to the map, and as the value of the "roomName" field. |
errorCallback |
function(String, String)
|
is called on failure. It gets an errorCode and errorText as it's too arguments. |
Example
easyrtc.getRoomList(
function(roomList){
for(roomName in roomList){
console.log("saw room " + roomName);
}
},
function(errorCode, errorText){
easyrtc.showError(errorCode, errorText);
}
);
-
getRoomOccupantsAsArray(roomName) → {Array}
-
Returns an array of easyrtcid's of peers in a particular room.
Parameters:
| Name |
Type |
Description |
roomName |
|
|
Returns:
of easyrtcids or null if the client is not in the room.
-
Type
-
Array
Example
var occupants = easyrtc.getRoomOccupants("default");
var i;
for( i = 0; i < occupants.length; i++ ) {
console.log( occupants[i] + " is in the room");
}
-
getRoomOccupantsAsMap(roomName) → {Object}
-
Returns a map of easyrtcid's of peers in a particular room. You should only test elements in the map to see if they are
null; their actual values are not guaranteed to be the same in different releases.
Parameters:
| Name |
Type |
Description |
roomName |
|
|
Returns:
of easyrtcids or null if the client is not in the room.
-
Type
-
Object
Example
if( easyrtc.getRoomOccupantsAsMap("default")[some_easyrtcid]) {
console.log("yep, " + some_easyrtcid + " is in the room");
}
-
getRoomsJoined() → {Object}
-
Get a list of the rooms you are in. You must be connected to call this function.
Returns:
A map whose keys are the room names
-
Type
-
Object
-
getServerIce() → {Object}
-
Returns the last ice config supplied by the EasyRTC server. This function is not normally used, it is provided
for people who want to try filtering ice server configuration on the client.
Returns:
which has the form {iceServers:[ice_server_entry, ice_server_entry, ...]}
-
Type
-
Object
-
getSessionField(name)
-
Fetch the value of a session field by name.
Parameters:
| Name |
Type |
Description |
name |
String
|
name of the session field to be fetched. |
Returns:
the field value (which can be anything). Returns undefined if the field does not exist.
-
getSessionFields() → {Object}
-
Fetch the collection of session fields as a map. The map has the structure:
{key1: {"fieldName": key1, "fieldValue": value1}, ...,
key2: {"fieldName": key2, "fieldValue": value2}
}
Returns:
-
Type
-
Object
-
getVideoSourceList(callback)
-
Gets a list of the available video sources (ie, cameras)
Parameters:
| Name |
Type |
Description |
callback |
Function
|
receives list of {facing:String, label:String, id:String, kind:"video"}
Note: the label string always seems to be the empty string if you aren't using https.
Note: not supported by Firefox. |
Example
easyrtc.getVideoSourceList( function(list) {
var i;
for( i = 0; i < list.length; i++ ) {
console.log("label=" + list[i].label + ", id= " + list[i].id);
}
});
-
hangup(otherUser)
-
Hang up on a particular user or all users.
Parameters:
| Name |
Type |
Description |
otherUser |
String
|
the easyrtcid of the person to hang up on. |
Example
easyrtc.hangup(someEasyrtcid);
-
hangupAll()
-
Hangs up on all current connections.
Example
easyrtc.hangupAll();
-
haveAudioTrack(easyrtcid, streamName) → {Boolean}
-
Determines if a particular peer2peer connection has an audio track.
Parameters:
| Name |
Type |
Description |
easyrtcid |
String
|
the id of the other caller in the connection. If easyrtcid is not supplied, checks the local media. |
streamName |
String
|
an optional stream id. |
Returns:
true if there is an audio track or the browser can't tell us.
-
Type
-
Boolean
-
haveVideoTrack(easyrtcid, streamName) → {Boolean}
-
Determines if a particular peer2peer connection has a video track.
Parameters:
| Name |
Type |
Description |
easyrtcid |
String
|
the id of the other caller in the connection. If easyrtcid is not supplied, checks the local media. |
streamName |
String
|
an optional stream id. * |
Returns:
true if there is an video track or the browser can't tell us.
-
Type
-
Boolean
-
idToName(easyrtcid) → {String}
-
Convert an easyrtcid to a user name. This is useful for labeling buttons and messages
regarding peers.
Parameters:
| Name |
Type |
Description |
easyrtcid |
String
|
|
Returns:
the username associated with the easyrtcid, or the easyrtcid if there is
no associated username.
-
Type
-
String
Example
console.log(easyrtcid + " is actually " + easyrtc.idToName(easyrtcid));
-
-
Initializes your access to a local camera and microphone.
Failure could be caused a browser that didn't support WebRTC, or by the user
not granting permission.
If you are going to call easyrtc.enableAudio or easyrtc.enableVideo, you need to do it before
calling easyrtc.initMediaSource.
Parameters:
| Name |
Type |
Description |
successCallback |
function(Object)
|
will be called with localmedia stream on success. |
errorCallback |
function(String,String)
|
is called with an error code and error description. |
streamName |
String
|
an optional name for the media source so you can use multiple cameras and screen share simultaneously. |
Example
easyrtc.initMediaSource(
function(mediastream){
easyrtc.setVideoObjectSrc( document.getElementById("mirrorVideo"), mediastream);
},
function(errorCode, errorText){
easyrtc.showError(errorCode, errorText);
});
-
isNameValid(name) → {Boolean}
-
Checks if the supplied string is a valid user name (standard identifier rules)
Parameters:
| Name |
Type |
Description |
name |
String
|
|
Returns:
true for a valid user name
-
Type
-
Boolean
Example
var name = document.getElementById('nameField').value;
if( !easyrtc.isNameValid(name)){
console.error("Bad user name");
}
-
isTurnServer(ipAddress) → {boolean}
-
Returns true if the ipAddress parameter was the address of a turn server. This is done by checking against information
collected during peer to peer calls. Don't expect it to work before the first call, or to identify turn servers that aren't
in the ice config.
Parameters:
| Name |
Type |
Description |
ipAddress |
|
|
Returns:
true if ip address is known to be that of a turn server, false otherwise.
-
Type
-
boolean
-
joinRoom(roomName, roomParameters, successCB, failureCB)
-
This method allows you to join a single room. It may be called multiple times to be in
multiple rooms simultaneously. It may be called before or after connecting to the server.
Note: the successCB and failureDB will only be called if you are already connected to the server.
Parameters:
| Name |
Type |
Description |
roomName |
String
|
the room to be joined. |
roomParameters |
String
|
application specific parameters, can be null. |
successCB |
Function
|
called once, with a roomName as it's argument, once the room is joined. |
failureCB |
Function
|
called if the room can not be joined. The arguments of failureCB are errorCode, errorText, roomName. |
-
leaveRoom(roomName, successCallback, failureCallback)
-
This function allows you to leave a single room. Note: the successCB and failureDB
arguments are optional and will only be called if you are already connected to the server.
Parameters:
| Name |
Type |
Description |
roomName |
String
|
|
successCallback |
Function
|
A function which expects a roomName. |
failureCallback |
Function
|
A function which expects the following arguments: errorCode, errorText, roomName. |
Example
easyrtc.leaveRoom("freds_room");
easyrtc.leaveRoom("freds_room", function(roomName){ console.log("left the room")},
function(errorCode, errorText, roomName){ console.log("left the room")});
-
loadStylesheet()
-
Load Easyrtc Stylesheet.
Easyrtc Stylesheet define easyrtcMirror class and some basic css class for using easyrtc.js.
That way, developers can override it or use it's own css file minified css or package.
Example
easyrtc.loadStylesheet();
-
makeLocalStreamFromRemoteStream(easyrtcid, remotestreamName, localstreamName)
-
Assign a local streamName to a remote stream so that it can be forwarded to other callers.
Parameters:
| Name |
Type |
Description |
easyrtcid |
String
|
the peer supplying the remote stream |
remotestreamName |
String
|
the streamName supplied by the peer. |
localstreamName |
String
|
streamName used when passing the stream to other peers. |
Example
easyrtc.makeLocalStreamFromRemoteStream(sourcePeer, "default", "forwardedStream");
easyrtc.call(nextPeer, callSuccessCB, callFailureCB, wasAcceptedCB, ["forwardedStream"]);
-
removeEventListener(eventName, eventListener)
-
Removes an event listener.
Parameters:
| Name |
Type |
Description |
eventName |
String
|
|
eventListener |
Function
|
|
-
sendData(destUser, msgType, msgData, ackHandler)
-
Sends data to another user. This method uses data channels if one has been set up, or websockets otherwise.
Parameters:
| Name |
Type |
Description |
destUser |
String
|
a string containing the easyrtcId of the other user.
Specifying multiple fields restricts the scope of the destination (operates as a logical AND, not a logical OR). |
msgType |
String
|
the type of message being sent (application specific). |
msgData |
Object
|
a JSONable object. |
ackHandler |
Function
|
a function which receives acknowledgments. May only be invoked in
the websocket case. |
Example
easyrtc.sendData(someEasyrtcid, "roomData", {room:499, bldgNum:'asd'},
function ackHandler(msgType, msgData);
);
-
sendDataP2P(destUser, msgType, msgData)
-
Sends data to another user using previously established data channel. This method will
fail if no data channel has been established yet. Unlike the easyrtc.sendWS method,
you can't send a dictionary, convert dictionaries to strings using JSON.stringify first.
What data types you can send, and how large a data type depends on your browser.
Parameters:
| Name |
Type |
Description |
destUser |
String
|
(an easyrtcid) |
msgType |
String
|
the type of message being sent (application specific). |
msgData |
Object
|
a JSONable object. |
Example
easyrtc.sendDataP2P(someEasyrtcid, "roomData", {room:499, bldgNum:'asd'});
-
sendDataWS(destination, msgType, msgData, ackhandler)
-
Sends data to another user using websockets. The easyrtc.sendServerMessage or easyrtc.sendPeerMessage methods
are wrappers for this method; application code should use them instead.
Parameters:
| Name |
Type |
Description |
destination |
String
|
either a string containing the easyrtcId of the other user, or an object containing some subset of the following fields: targetEasyrtcid, targetGroup, targetRoom.
Specifying multiple fields restricts the scope of the destination (operates as a logical AND, not a logical OR). |
msgType |
String
|
the type of message being sent (application specific). |
msgData |
Object
|
a JSONable object. |
ackhandler |
Function
|
by default, the ackhandler handles acknowledgments from the server that your message was delivered to it's destination.
However, application logic in the server can over-ride this. If you leave this null, a stub ackHandler will be used. The ackHandler
gets passed a message with the same msgType as your outgoing message, or a message type of "error" in which case
msgData will contain a errorCode and errorText fields. |
Example
easyrtc.sendDataWS(someEasyrtcid, "setPostalAddress", {room:499, bldgNum:'asd'},
function(ackMsg){
console.log("saw the following acknowledgment " + JSON.stringify(ackMsg));
}
);
-
sendPeerMessage(destination, msgType, msgData, successCB, failureCB)
-
Sends a message to another peer on the easyrtcMsg channel.
Parameters:
| Name |
Type |
Description |
destination |
String
|
either a string containing the easyrtcId of the other user, or an object containing some subset of the following fields: targetEasyrtcid, targetGroup, targetRoom.
Specifying multiple fields restricts the scope of the destination (operates as a logical AND, not a logical OR). |
msgType |
String
|
the type of message being sent (application specific). |
msgData |
Object
|
a JSONable object with the message contents. |
successCB |
function(String, Object)
|
a callback function with results from the server. |
failureCB |
function(String, String)
|
a callback function to handle errors. |
Example
easyrtc.sendPeerMessage(otherUser, 'offer_candy', {candy_name:'mars'},
function(msgType, msgBody ){
console.log("message was sent");
},
function(errorCode, errorText){
console.log("error was " + errorText);
});
-
sendServerMessage(msgType, msgData, successCB, failureCB)
-
Sends a message to the application code in the server (ie, on the easyrtcMsg channel).
Parameters:
| Name |
Type |
Description |
msgType |
String
|
the type of message being sent (application specific). |
msgData |
Object
|
a JSONable object with the message contents. |
successCB |
function(String, Object)
|
a callback function with results from the server. |
failureCB |
function(String, String)
|
a callback function to handle errors. |
Example
easyrtc.sendServerMessage('get_candy', {candy_name:'mars'},
function(msgType, msgData ){
console.log("got candy count of " + msgData.barCount);
},
function(errorCode, errorText){
console.log("error was " + errorText);
});
-
setAcceptChecker(acceptCheck)
-
Sets the callback used to decide whether to accept or reject an incoming call.
Parameters:
| Name |
Type |
Description |
acceptCheck |
Function
|
takes the arguments (callerEasyrtcid, acceptor).
The acceptCheck callback is passed an easyrtcid and an aceptor function. The acceptor function should be called with either
a true value (accept the call) or false value( reject the call) as it's first argument, and optionally,
an array of local media streamNames as a second argument. |
Example
easyrtc.( function(easyrtcid, acceptor){
if( easyrtc.idToName(easyrtcid) === 'Fred' ){
acceptor(true);
}
else if( easyrtc.idToName(easyrtcid) === 'Barney' ){
setTimeout( function(){
acceptor(true, ['myOtherCam']); // myOtherCam presumed to a streamName
}, 10000);
}
else{
acceptor(false);
}
});
-
setApplicationName(name)
-
Set the application name. Applications can only communicate with other applications
that share the same API Key and application name. There is no predefined set of application
names. Maximum length is
Parameters:
| Name |
Type |
Description |
name |
String
|
|
Example
easyrtc.setApplicationName('simpleAudioVideo');
-
-
Controls whether a default local media stream should be acquired automatically during calls and accepts
if a list of streamNames is not supplied. The default is true, which mimicks the behaviour of earlier releases
that didn't support multiple streams. This function should be called before easyrtc.call or before entering an
accept callback.
Parameters:
| Name |
Type |
Description |
flag |
Boolean
|
true to allocate a default local media stream. |
-
setCallCancelled(callCancelled)
-
Sets the callCancelled callback. This will be called when a remote user
initiates a call to you, but does a "hangup" before you have a chance to get his video stream.
Parameters:
| Name |
Type |
Description |
callCancelled |
Function
|
takes an easyrtcid as an argument and a boolean that indicates whether
the call was explicitly cancelled remotely (true), or actually accepted by the user attempting a call to
the same party. |
Example
easyrtc.setCallCancelled( function(easyrtcid, explicitlyCancelled){
if( explicitlyCancelled ){
console.log(easyrtc.idToName(easyrtcid) + " stopped trying to reach you");
}
else{
console.log("Implicitly called " + easyrtc.idToName(easyrtcid));
}
});
-
setCookieId(cookieId)
-
This function sets the name of the cookie that client side library will look for
and transmit back to the server as it's easyrtcsid in the first message.
Parameters:
| Name |
Type |
Description |
cookieId |
String
|
|
-
setCredential(credentialParm)
-
Set the authentication credential if needed.
Parameters:
| Name |
Type |
Description |
credentialParm |
Object
|
a JSONable object. |
-
setDataChannelCloseListener(listener)
-
Sets a callback that is called when a previously open data channel closes.
The callback will be called with an easyrtcid as it's sole argument.
Parameters:
| Name |
Type |
Description |
listener |
Function
|
|
Example
easyrtc.setDataChannelCloseListener( function(easyrtcid){
("No longer connected to " + easyrtc.idToName(easyrtcid));
});
-
setDataChannelOpenListener(listener)
-
Sets a callback that is called when a data channel is open and ready to send data.
The callback will be called with an easyrtcid as it's sole argument.
Parameters:
| Name |
Type |
Description |
listener |
Function
|
|
Example
easyrtc.setDataChannelOpenListener( function(easyrtcid){
easyrtc.sendDataP2P(easyrtcid, "greeting", "hello");
});
-
setDisconnectListener(disconnectListener)
-
Sets the listener for socket disconnection by external (to the API) reasons.
Parameters:
| Name |
Type |
Description |
disconnectListener |
Function
|
takes no arguments and is not called as a result of calling easyrtc.disconnect. |
Example
easyrtc.setDisconnectListener(function(){
easyrtc.showError("SYSTEM-ERROR", "Lost our connection to the socket server");
});
-
setIceUsedInCalls(ice)
-
Sets the ice server configuration that will be used in subsequent calls. You only need this function if you are filtering
the ice server configuration on the client or if you are using TURN certificates that have a very short lifespan.
Parameters:
| Name |
Type |
Description |
ice |
Object
|
An object with iceServers element containing an array of ice server entries. |
Example
easyrtc.setIceUsedInCalls( {"iceServers": [
{
"url": "stun:stun.sipgate.net"
},
{
"url": "stun:<IP_ADDRESS>"
},
{
"url": "stun:stun.sipgate.net:10000"
}
]});
easyrtc.call(...);
-
setOnStreamClosed(onStreamClosed)
-
Sets a callback to receive notification of a media stream closing. The usual
use of this is to clear the source of your video object so you aren't left with
the last frame of the video displayed on it.
Parameters:
| Name |
Type |
Description |
onStreamClosed |
Function
|
takes an easyrtcid as it's first parameter, the stream as it's second argument, and name of the video stream as it's third. |
Example
easyrtc.setOnStreamClosed( function(easyrtcid, stream, streamName){
easyrtc.setVideoObjectSrc( document.getElementById("callerVideo"), "");
( easyrtc.idToName(easyrtcid) + " closed stream " + stream.id + " " + streamName);
});
-
setPeerListener(listener, msgType, source)
-
Sets a listener for data sent from another client (either peer to peer or via websockets).
If no msgType or source is provided, the listener applies to all events that aren't otherwise handled.
If a msgType but no source is provided, the listener applies to all messages of that msgType that aren't otherwise handled.
If a msgType and a source is provided, the listener applies to only message of the specified type coming from the specified peer.
The most specific case takes priority over the more general.
Parameters:
| Name |
Type |
Description |
listener |
Function
|
has the signature (easyrtcid, msgType, msgData, targeting).
msgType is a string. targeting is null if the message was received using WebRTC data channels, otherwise it
is an object that contains one or more of the following string valued elements {targetEasyrtcid, targetGroup, targetRoom}. |
msgType |
String
|
a string, optional. |
source |
String
|
the sender's easyrtcid, optional. |
Example
easyrtc.setPeerListener( function(easyrtcid, msgType, msgData, targeting){
console.log("From " + easyrtc.idToName(easyrtcid) +
" sent the following data " + JSON.stringify(msgData));
});
easyrtc.setPeerListener( function(easyrtcid, msgType, msgData, targeting){
console.log("From " + easyrtc.idToName(easyrtcid) +
" sent the following data " + JSON.stringify(msgData));
}, 'food', 'dkdjdekj44--');
easyrtc.setPeerListener( function(easyrtcid, msgType, msgData, targeting){
console.log("From " + easyrtcid +
" sent the following data " + JSON.stringify(msgData));
}, 'drink');
-
setRoomApiField(roomName, fieldName, fieldValue)
-
Provide a set of application defined fields that will be part of this instances
configuration information. This data will get sent to other peers via the websocket
path.
Parameters:
| Name |
Type |
Description |
roomName |
String
|
the room the field is attached to. |
fieldName |
String
|
the name of the field. |
fieldValue |
Object
|
the value of the field. |
Example
easyrtc.setRoomApiField("trekkieRoom", "favorite_alien", "Mr Spock");
easyrtc.setRoomOccupantListener( function(roomName, list){
for( var i in list ){
console.log("easyrtcid=" + i + " favorite alien is " + list[i].apiFields.favorite_alien);
}
});
-
setScreenCapture()
-
This function requests that screen capturing be used to provide the local media source
rather than a webcam. If you have multiple screens, they are composited side by side.
Note: this functionality is not supported by Firefox, has to be called before calling initMediaSource (or easyApp), we don't currently supply a way to
turn it off (once it's on), only works if the website is hosted SSL (https), and the image quality is rather
poor going across a network because it tries to transmit so much data. In short, screen sharing
through WebRTC isn't worth using at this point, but it is provided here so people can try it out.
Example
easyrtc.setScreenCapture();
-
setSdpFilters(localFilter, remoteFilter)
-
Sets functions which filter sdp records before calling setLocalDescription or setRemoteDescription.
This is advanced functionality which can break things, easily. See the easyrtc_rates.js file for a
filter builder.
Parameters:
| Name |
Type |
Description |
localFilter |
Function
|
a function that takes an sdp string and returns an sdp string. |
remoteFilter |
Function
|
a function that takes an sdp string and returns an sdp string. |
-
setServerListener(listener)
-
Sets a listener for messages from the server.
Parameters:
| Name |
Type |
Description |
listener |
Function
|
has the signature (msgType, msgData, targeting) |
Example
easyrtc.setServerListener( function(msgType, msgData, targeting){
("The Server sent the following message " + JSON.stringify(msgData));
});
-
setSocketUrl(socketUrl)
-
Sets the url of the Socket server.
The node.js server is great as a socket server, but it doesn't have
all the hooks you'd like in a general web server, like PHP or Python
plug-ins. By setting the serverPath your application can get it's regular
pages from a regular web server, but the EasyRTC library can still reach the
socket server.
Parameters:
| Name |
Type |
Description |
socketUrl |
String
|
|
Example
easyrtc.setSocketUrl(":8080");
-
setStreamAcceptor(acceptor)
-
easyrtc.setStreamAcceptor sets a callback to receive media streams from other peers, independent
of where the call was initiated (caller or callee).
Parameters:
| Name |
Type |
Description |
acceptor |
Function
|
takes arguments (caller, mediaStream) |
Example
easyrtc.setStreamAcceptor(function(easyrtcid, stream){
document.getElementById('callerName').innerHTML = easyrtc.idToName(easyrtcid);
easyrtc.setVideoObjectSrc( document.getElementById("callerVideo"), stream);
});
-
setUseFreshIceEachPeerConnection(value)
-
Determines whether fresh ice server configuration should be requested from the server for each peer connection.
Parameters:
| Name |
Type |
Description |
value |
Boolean
|
the default is false. |
-
setUsername(username) → {Boolean}
-
Sets the user name associated with the connection.
Parameters:
| Name |
Type |
Description |
username |
String
|
must obey standard identifier conventions. |
Returns:
true if the call succeeded, false if the username was invalid.
-
Type
-
Boolean
Example
if( !easyrtc.setUsername("JohnSmith") ){
console.error("bad user name);
-
setVideoBandwidth(kbitsPerSecond)
-
Parameters:
| Name |
Type |
Description |
kbitsPerSecond |
Number
|
is rate in kilobits per second. |
- Deprecated:
- No longer supported by Google.
Sets the bandwidth for sending video data.
Setting the rate too low will cause connection attempts to fail. 40 is probably good lower limit.
The default is 50. A value of zero will remove bandwidth limits.
Example
easyrtc.setVideoBandwidth( 40);
-
setVideoDims(width, height, frameRate)
-
This function is used to set the dimensions of the local camera, usually to get HD.
If called, it must be called before calling easyrtc.initMediaSource (explicitly or implicitly).
assuming it is supported. If you don't pass any parameters, it will default to 720p dimensions.
Parameters:
| Name |
Type |
Description |
width |
Number
|
in pixels |
height |
Number
|
in pixels |
frameRate |
number
|
is optional |
Examples
easyrtc.setVideoDims(1280,720);
easyrtc.setVideoDims();
-
setVideoObjectSrc(videoObject, stream)
-
Sets a video or audio object from a media stream.
Chrome uses the src attribute and expects a URL, while firefox
uses the mozSrcObject and expects a stream. This procedure hides
that from you.
If the media stream is from a local webcam, you may want to add the
easyrtcMirror class to the video object so it looks like a proper mirror.
The easyrtcMirror class is defined in this.css.
Which is could be added using the same path of easyrtc.js file to an HTML file
Parameters:
| Name |
Type |
Description |
videoObject |
Object
|
an HTML5 video object |
stream |
MediaStream
|
String
|
a media stream as returned by easyrtc.getLocalStream or your stream acceptor. |
Example
easyrtc.setVideoObjectSrc( document.getElementById("myVideo"), easyrtc.getLocalStream());
-
setVideoSource(videoSrcId)
-
Specify particular video source. Call this before you call easyrtc.initMediaSource().
Note: this function isn't supported by Firefox.
Parameters:
| Name |
Type |
Description |
videoSrcId |
String
|
is a id value from one of the entries fetched by getVideoSourceList. null for default. |
Example
easyrtc.setVideoSrc( videoSrcId);
-
showError(messageCode, message)
-
Default error reporting function. The default implementation displays error messages
in a programmatically created div with the id easyrtcErrorDialog. The div has title
component with a class name of easyrtcErrorDialog_title. The error messages get added to a
container with the id easyrtcErrorDialog_body. Each error message is a text node inside a div
with a class of easyrtcErrorDialog_element. There is an "okay" button with the className of easyrtcErrorDialog_okayButton.
Parameters:
| Name |
Type |
Description |
messageCode |
String
|
An error message code |
message |
String
|
the error message text without any markup. |
Example
easyrtc.showError("BAD_NAME", "Invalid username");
-
supportsDataChannels() → {Boolean}
-
Determines whether the current browser supports the new data channels.
EasyRTC will not open up connections with the old data channels.
Returns:
-
Type
-
Boolean
-
-
Determines if the local browser supports WebRTC GetUserMedia (access to camera and microphone).
Returns:
True getUserMedia is supported.
-
Type
-
Boolean
-
supportsPeerConnections() → {Boolean}
-
Determines if the local browser supports WebRTC Peer connections to the extent of being able to do video chats.
Returns:
True if Peer connections are supported.
-
Type
-
Boolean
-
updatePresence(state, statusText)
-
Sets the presence state on the server.
Parameters:
| Name |
Type |
Description |
state |
String
|
one of 'away','chat','dnd','xa' |
statusText |
String
|
User configurable status string. May be length limited. |
Example
easyrtc.updatePresence('dnd', 'sleeping');
-
usernameToIds(username, room) → {Array}
-
Get an array of easyrtcids that are using a particular username
Parameters:
| Name |
Type |
Description |
username |
String
|
the username of interest. |
room |
String
|
an optional room name argument limiting results to a particular room. |
Returns:
an array of {easyrtcid:id, roomName: roomName}.
-
Type
-
Array
-
useThisSocketConnection(alreadyAllocatedSocketIo)
-
Supply a socket.io connection that will be used instead of allocating a new socket.
The expected usage is that you allocate a websocket, assign options to it, call
easyrtc.useThisSocketConnection, followed by easyrtc.connect or easyrtc.easyApp. Easyrtc will not attempt to
close sockets that were supplied with easyrtc.useThisSocketConnection.
Parameters:
| Name |
Type |
Description |
alreadyAllocatedSocketIo |
Object
|
A value allocated with the connect method of socket.io. |


chfn
Update `finger` info for a user.
More information: home page
- Update a user's "Name" field in the output of `finger`:
chfn -f new_display_name username
- Update a user's "Office Room Number" field for the output of `finger`:
chfn -o new_office_room_number username
- Update a user's "Office Phone Number" field for the output of `finger`:
chfn -p new_office_telephone_number username
- Update a user's "Home Phone Number" field for the output of `finger`:
chfn -h new_home_telephone_number username


Highly organized and detail oriented analyst with several years experience in both a clerical and research environment. Able to strategize and prioritize to effectively multitask while working with demanding projects and clients. Experienced in management, organization, and research.
I enjoy spending time outside going on adventures with my border/aussie mix, Dakota, if you know the breeds they are very high energy and demand lots of mental and physical stimulation. My boyrfriend and I are also planning our first camping trip where we will be going to Big Bend, where we hope to do some hiking, off roading, and star gazing. When I am not outside I enjoy relaxing on the couch with a good book, as I am currently part of a book club.


--- layout: page title: Skills ---
Swift
Objective-C
HTML5
CSS3
JavaScript
Java
A Grunt plugin for running server-side Mocha tests.
A Grunt plugin for running server-side Mocha tests.
A Grunt plugin for running server-side Mocha tests.
A Grunt plugin for running server-side Mocha tests.
A Grunt plugin for running server-side Mocha tests.
A Grunt plugin for running server-side Mocha tests.
A Grunt plugin for running server-side Mocha tests.
A Grunt plugin for running server-side Mocha tests.
A Grunt plugin for running server-side Mocha tests.
A Grunt plugin for running server-side Mocha tests.
A Grunt plugin for running server-side Mocha tests.
A Grunt plugin for running server-side Mocha tests.
A Grunt plugin for running server-side Mocha tests.


1. Discuss a time you had a conflict. What was it about? What happened?
When I graduated from college in 2013, I wanted to move to Santiago, Chile to integrate myself in the StartUp Chile scene. I told my parents I wanted to move to South America and they immediately freaked out. "Is it safe?", "Where are you going to live?", "How are you going to afford it?". They baraded me with questions, many of which I didn't know the answer to. However, I did know that I wanted to explore South America before coming back to the United States.
2. What was the source of the conflict?
The main source of conflict was my parents not understanding why I wanted to move to South America. They thought I had come up with this idea on a whim and was not going to plan the move in advance. They were also concerned for my safety as a tall, blonde woman.
3. What basic emotions did you feel upon analyzing the conflict?
 I was mad because I thought I had a great plan, and they flat out said they would not support the move.
4. What actions did you take to resolve your conflict?
I worked on brushing out more concrete details for the trip and one of my friends also decided to come along too. I also began networking and connecting with friends of friends who lived in Santiago, Chile. They were a helpful source of information in terms of housing, jobs, etc. I was able to share this with my parents, which eased their fears. Also, as I began to plan, my parents started to see I was serious about moving and was educating myself on the best way to successfully move to Santiago.
5. If you could go back, what would you do differently, if anything?
I would have presented more of a concrete plan from the get-go to my parents. I also should have been more understanding about their reaction, since they were only concerned about my well-being.
6. What did you learn from this experience?
I learned that in a conflict I should always think about how the other side is perceiving the conflict. For example, my parents were coming from the side of being concerned about my health, happiness and well-being, as most parents do. Whereas, I thought this would be a learning experience and fun adventure. My parents wanted me to think about different aspects of the move than what I was thinking about. From then on, I try to approach conflicts initially from the other side, and work my presentation and approach based off of that perspective rather than mine. This method has proven to reduce conflict right off the bat so I use it as frequently as possible now.


3D world encyclopedia built using React, Flask, TypeDB that draws data from various open data sources such as the CIA Factbook and UN open datasets


For loops over find output are fragile. Use find -exec or a while read loop.
for file in $(find mydir -mtime -7 -name '*.mp3')
do
let count++
echo "Playing file no. $count"
play "$file"
done
echo "Played $count files"
This will fail for filenames containing spaces and similar, such as My File.mp3
, and has a series of potential globbing issues depending on other filenames in the directory like (if you have MyFile2.mp3
and MyFile[2014].mp3
, the former file will play twice and the latter will not play at all).
There are many possible fixes, each with its pros and cons.
The most general fix (that requires the least amount of thinking to apply) is having find
output a \0
separated list of files and consuming them in a while read
loop:
while IFS= read -r -d '' file
do
let count++
echo "Playing file no. $count"
play "$file"
done < <(find mydir -mtime -7 -name '*.mp3' -print0)
echo "Played $count files"
In usage it's very similar to the for
loop: it gets its output from a find
statement, it executes a shell script body, it allows updating/aggregating variables, and the variables are available when the loop ends.
It requires Bash, and works with GNU, Busybox, OS X, FreeBSD and OpenBSD find, but not POSIX find.
find
is just matching globs recursivelyIf you don't need find
logic like -mtime -7
and just use it to match globs recursively (all *.mp3
files under a directory), you can instead use globstar
and nullglob
instead of find
, and still use a for
loop:
shopt -s globstar nullglob
for file in mydir/**/*.mp3
do
let count++
echo "Playing file no. $count"
play "$file"
done
echo "Played $count files"
This is bash 4 specific.
If you need POSIX compliance, this is a fair approach:
find mydir ! -name "$(printf "*\n*")" -name '*.mp3' > tmp
while IFS= read -r file
do
let count++
echo "Playing file #$count"
play "$file"
done < tmp
rm tmp
echo "Played $count files"
The only problem is for filenames containing line feeds. A ! -name "$(printf "*\n*")"
has been added to simply skip these files, just in case there are any.
If you don't need variables to be available after the loop (here, if you don't need to print the final play count at the end), you can skip the tmp
file and just pipe from find
to while
.
If you don't need a shell script loop body or any form of variable like if we only wanted to play the file, we can dramatically simplify while maintaining POSIX compatibility:
# Simple and POSIX
find mydir -name '*.mp3' -exec play {} \;
This does not allow things like let counter++
because let
is a shell builtin, not an external command.
If we do need a shell script body but no aggregation, you can do the above but invoking sh
(this is still POSIX):
find mydir -name '*.mp3' -exec sh -c '
echo "Playing ${1%.mp3}"
play "$1"
' sh {} \;
This would not be possible without sh
, because ${1%.mp3}
is a shell construct that find
can't evaluate by itself. If we had tried to let counter++
in this loop, we would have found that the value never changes.
Note that using +
instead of \;
, and using an embedded for file in "$@"
loop rather than "$1"
, will not allow aggregating variables. This is because for large lists, find
will invoke the command multiple times, each time with some chunk of the input.
for var in $(find ...)
loops rely on word splitting and will evaluate globs, which will wreck havoc with filenames containing whitespace or glob characters.
find -exec
for i in glob
and find
+while
do not rely on word splitting, so they avoid this problem.
If you know about and carefully apply IFS=$'\n'
and set -f
, you could choose to ignore this message.


[gecode-users] "usage" parameter as IntVar in cumulative constraint
Andrea Pretto
a.pretto at miriade.it
Thu Apr 26 17:11:33 CEST 2012
Hi,
Looking at Gecode documentation and in source code, I don't find a way to
have the "usage" parameter as variable (only as constant by, IntArgs) on
the "cumulative" constraint.
Today the only way to get the usage as variable is to use the "cumulatives"
constraint, but that deploy different algorithms.
Is there any plan to implement that in the "cumulative" constraint ??
P.S:
reference algorithm:
Max Energy Algorithm for Discrete Cumulative Resources
by Petr Vilim
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.gecode.org/pipermail/users/attachments/20120426/44ee79d6/attachment.htm>
More information about the users
mailing list


--- layout: default title: Mayday 2.0 hideFromNav: true ---
Over 90% of Americans agree that big money in politics has broken our government. Over two hundred Members of Congress are already committed to reform. It’s time for us to finish the job.
We have strategically chosen a select number of representatives to focus on, and will run highly targeted campaigns in their districts urging them to join us. When we win them over, we will move on to others. Slowly but surely, we will tip the scales and pass reform to take back our democracy.
As our campaign evolves, we’ll measure how representatives respond. We’ll double-down on what works, and let go of what doesn’t. We’ll get smarter as we go. Our data-driven campaign has no place for ideological blinders. Mayday is in it to win it.
Our plan’s success relies on the support of our community. We are counting on you to be part of the movement to restore the principles our republic was founded on and end the systemic corruption in Washington, D.C.


Object
The Routing table. Contains all routes for a system. Routes can be added to the table by calling Routes#add_route
Add a route to the routing table.
# File lib/journey/routes.rb, line 58 def add_route app, path, conditions, defaults, name = nil route = Route.new(name, app, path, conditions, defaults) route.precedence = routes.length routes << route named_routes[name] = route if name clear_cache! route end
# File lib/journey/routes.rb, line 41 def ast return @ast if @ast return if partitioned_routes.first.empty? asts = partitioned_routes.first.map { |r| r.ast } @ast = Nodes::Or.new(asts) end
# File lib/journey/routes.rb, line 27 def each(&block) routes.each(&block) end
# File lib/journey/routes.rb, line 18 def length @routes.length end
# File lib/journey/routes.rb, line 35 def partitioned_routes @partitioned_routes ||= routes.partition { |r| r.path.anchored && r.ast.grep(Nodes::Symbol).all? { |n| n.default_regexp? } } end
Generated with the Darkfish Rdoc Generator 2.


RoadSafetyBC's Driver Medical Fitness Portal for medical practitioners
RoadSafetyBC is part of the Ministry of Public Safety and Solicitor General. This portal serves the medical community by:
- Modernizing BC's driver medical fitness process by providing an electronic Driver's Medical Examination Report (DMER)
- Simplifying the process of completing, submitting and monitoring the status of a DMER
- Enhancing public safety and contributing to RoadSafetyBC's Vision Zero goal
Portal In Progress
RoadSafetyBC's Driver Medical Fitness Portal for medical practitioners is currently in progress. You cannot register or login at this time.
However, you can access resources on this page to assist you with completing driver medical fitness forms.
This portal is estimated to be available to medical practitioners in 2024.
Medical Professionals
Has RoadSafetyBC required your patient to have a DMER completed? Or do you want to check the status of a DMER you have submitted?
This portal is estimated to be available to medical practitioners in 2024. At that time if you are a medical practitioner, Medical Office Manager or Medical Office Assistant, you will be able to register for the RoadSafetyBC Medical Practitioner Portal in order to conduct DMERs online.
Medical Standards and Guidelines
RoadSafetyBC follows the Canadian Council of Motor Transport Administrators (CCMTA) Medical Standards with B.C. Specific Guidelines when making driver medical fitness decisions.
Please refer to these guidelines when you have questions regarding which medical conditions may have an impact on your patient's fitness to drive.
Do you have a concern about a driver?
If a patient has a medical condition that raises significant concern about their ability to safely operate a motor vehicle, please submit a Report of a Condition Affecting Fitness and Ability to Drive.
NOTE: Reporting a condition does not replace performing a medical assessment and submitting a DMER which RoadSafetyBC has required for your patient.
About RoadSafetyBC
At RoadSafetyBC we are responsible for determining driver medical fitness. We require certain individuals to complete a DMER. We use DMERs to assess if a driver's medical condition affects their ability to drive safely.
Are you a driver? Learn more about the Driver Medical Fitness process.


Three Kings ***
Rated on a 4-star scale Screening venue: Odeon (Liverpool City Centre) Released in the UK by Warner Bros on March 3, 2000; certificate 15; 115 minutes; country of origin USA; aspect ratio 2.35:1
Directed by David O. Russell; produced by Edward L. McDonnell, Charles Roven, Paul Junger Witt. Written by David O. Russell; from a story by John Ridley. Photographed by Newton Thomas Sigel; edited by Robert K. Lambert.
CAST..... George Clooney..... Major Archie Gates Mark Wahlberg..... Sergeant Troy Barlow Ice Cube..... Staff Sergeant Chief Elgin Spike Jonze..... Private Conrad Vig Said Taghmaoui..... Captain Said Nora Dunn..... Adriana Cruz Mykelti Williamson..... Colonel Horn
David O. Russell's "Three Kings" is the first war movie I have seen that takes the camera into an imaginary bullet wound to show it filling up with bile. What's more, the moment seems perfectly normal in the context of the film. This is a fast-talking, cheerfully deranged depiction of army intervention in Iraq, which plays with style, structure and tone in the dangerously excited manner of a fire-eating juggler.
The story takes place in 1991, just after the end of the Gulf War. In a camp of American soldiers who are rounding up prisoners and waiting to go home, Major Archie Gates (George Clooney) discovers an "ass map" -- a treasure map, that is, found between a captive's butt cheeks. Gates orders a goofy hillbilly, Private Conrad Vig (Spike Jonze), to take it out. "Can't I have a glove, Sir?" he asks. "No," Gates replies, "That's how the chain of command works."
Gates and Vig consult two reliable young comrades, muscle-bound family man Sergeant Troy Barlow (Mark Wahlberg) and firm, shrewd staff sergeant Chief Elgin (Ice Cube). Together the quintet deduce the location of the loot to be an Iraqi army bunker near Cordoba, and guess that it will be several million dollars worth of Kuwaiti gold bullion. Their plan: To steal it. If they get caught: They'll say they were on a legitimate mission to rescue their allies' property from the enemy.
Since we never see movie characters plan heists and then follow them through without a hitch, we know this scheme will somehow go wrong. Our heroes' obstacle comes when they're about to leave the village in which the gold-filled bunker is situated. Iraqi guards are making clear they plan to harm civilians, and it would be wrong to leave them to do so.
There is a scene of agonising effectiveness here, as the action goes into slow motion to mark the cease-fire's dissolution into chaos. A mother is shot in full view of her husband and children. Soldiers resume fighting. Watching this at a delayed pace accentuates the tension, the horror, and the reality of each bullet, and all we can do is sit there, watching, feeling helpless.
Of course, that's all the American soldiers can do for most of the time. George Bush may have urged Iraqi citizens to rise up against Saddam Hussein's evil regime, but he's not letting his troops help them, because the Gulf War wasn't about liberating people, and was fought to make sure Kuwait could keep supplying oil to the Western world. Most people already realise and are resigned to that, but "Three Kings" angrily indicts Bush for it, with a second half that is dramatic and political. The film surrounds Gates, Vig, Barlow and Elgin with hypocrisy and devastation as they attempt to get back to their base, fight off hostile fire, save the lives of refugees and salvage some bullion.
That's a little anticlimactic, as the opening chapters are full of brilliantly crude slapstick satire, and at times thereafter the film becomes inappropriately slowed down when accommodating its serious stuff. Russell, who wrote and directed, should have found some way to blend the different elements in less jarring fashion. It is creative to follow an elaborate practical gag about pretending to be Saddam with realistic footage of refugee orphans, but it isn't necessarily wise, because it means the audience is still laughing when we should be settling down for sober thought.
What "Three Kings" conveys brilliantly, throughout everything light and heavy, is the utter confusion of war -- in the opening words ("Are we still shooting?"), the disorganisation of the U.S. forces' barracks, and the mad dash to safety the film spends most of its time on. We can decipher what's going on during immediate moments, but the general experience is intentionally perplexing and dizzying. Ambiguous individual point of view shots contribute to this, as does unstable, screw-loose pacing.
Newton Thomas Sigel's cinematography is the most crucial element in putting us in the middle of the unpredictability. In the tradition of a lot of recent Hollywood war dramas, it's shaky and grainy, but its underdeveloped film stock is a much more original touch, making the frame extremely sensitive to light. There are huge contrast changes all the time, and the film seems to be REACTING to situations, and SEEING images, rather than creating them.
The four main actors work subtle wonders, too, performing in ways that balance each other's efforts nicely. Clooney has authoritative star power; Jonze, who has also done good work as a director, is pleasing in what is essentially a jester role; Wahlberg is charming and boyish; Cube reassures us that there's someone sensible in this motley crew.
As of yet, the only other theatrical motion picture dealing with the Gulf War has been Edward Zwick's "Courage Under Fire", from 1996. So it's amazing, when you think about it, that Russell has so soon found the courage to make a bizarre comedic commentary on the subject.  They're shooting themselves in the foot, as fans of that sort of thing will be put off when they learn what the movie is actually about, and most other people will the alienated by the commercials. "Three Kings" deserves better treatment -- uneven patches notwithstanding, it's original, powerful, and very unexpected.
COPYRIGHT(c) 2000 Ian Waldron-Mantgani
Please visit, and encourage others to visit, the UK Critic's website, which is located at http://members.aol.com/ukcritic
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


GeoMesa Raster Support¶
This tutorial will show you how to:
- Deploy and use the raster data support in GeoMesa
- Prepare and ingest raster data
- Conduct WMS/WCS queries of raster data
Prerequisites¶
Warning
For Accumulo deployment, you will need access to an Accumulo 1.5, 1.6, or 1.7 instance.
Before you begin, you should have these:
- basic knowledge of GeoTools and GeoServer
- access to a GeoServer 2.8.x installation
- an Accumulo user that has both create-table and write permissions
- the Geospatial Data Abstraction Library (GDAL) installed
Before you begin, you should have also set up GeoMesa, using the instructions in Installation and Configuration.
Note
Make sure you follow the instruction on installing the GeoServer community module.
Introduction¶
The Raster support in GeoMesa was produced to support image pyramids in EPSG:4326.
Currently WMS and WCS (version 1.0.0) queries are supported via the GeoServer plugin.
Ingest¶
First, download and extract the example data set Natural Earth 2 with
Shaded Relief, Water, and
Drainages.
To ingest the raster image into GeoMesa, you must first produce an image
pyramid from this file by using gdal_retile.py
. For an explanation
of the parameters used below, see the gdal_retile
documentation.
$ gdal_retile.py -v -pyramidOnly -r lanczos -levels 4 \
-ps 675 675 -targetDir ./ NE2_HR_LC_SR_W_DR.tif
Once the image pyramid has been prepared, ingest the tiles using the GeoMesa command line tools. To do this you will first need to follow the tools deployment instructions in Installation and Configuration. Once the GeoMesa tools have been deployed you will be able to ingest the prepared pyramid:
$ geomesa ingestraster -u username -p password \
-t natearth -f "/path/to/pyramid/1/" -F geotiff
The ingest needs to be repeated per level of the pyramid generated by GDAL. Keep the table name (in this case “natearth”) the same between runs of the ingest. Once this process is complete you will need to register the table into a GeoServer coverage store of the type “GeoMesa Coverage Format”.
When attempting to ingest your own rasters, tiles should be on the order of 128x128 to 1024x1024 pixels.
GeoServer Deployment¶
The GeoMesa GeoServer community module is required to enable registering GeoMesa Raster layers in GeoServer. If you have not allready, please follow the Installation and Configuration instructions in the user manual.
If you have not deployed the community module yet, it can be downloaded from OpenGeo <http://ares.opengeo.org/geoserver/>, or can be built from source <https://github.com/geoserver/geoserver/tree/master/src/community/geomesa>.
Once obtained, the community module can be installed by copying geomesa-gs-<version>.jar
into
the GeoServer lib
directory.
Registering in GeoServer¶
To view the ingested pyramid via WMS and WCS you must register the new table in a “Accumulo (Geomesa Raster)” coverage store in the GeoServer UI. Login to your GeoServer and follow these steps:
- Add a new datastore to GeoServer by navigating to the Stores page and then click “Add new Store”.
- Click the “Accumulo (Geomesa Raster)” as an option under “Raster Data Sources”
- Fill in the fields as appropriate to your Accumulo and Zookeeper configurations. The “tableName” field must match the name of the table we ingested the demo data to.
- Click “Save”, then click “Publish” when GeoServer prompts you to add the layer.
- Once you have completed registering the layer, you should be able to use the open layers preview for the layer to view the raster via WMS.
WCS Queries¶
WCS version 1.0.0 queries are fairly similar to WMS queries. Try running the following WCS query on the Natural Earth test data table by first modifying and running the following url as needed for your GeoServer configuration.
http://localhost:8080/geoserver/workspace/wcs?service=WCS&version=1.0.0&request=GetCoverage&coverage=workspace:natearth&bbox=-180.0,-90.0,180.0,90.0&width=660&height=330&crs=EPSG:4326&format=geotiff
This will return a GeoTIFF of the extension requested. As in the WMS open layers viewer, the tiles are concatenated together into a mosaic.


There are no corresponding sections because chapter {{chapter.number}} has been repealed.
Loading Sections...


--- layout: post title: Choropleths in R date: 2010-07-31 22:01:30.000000000 -05:00 type: post parent_id: '0' published: true password: '' status: publish categories: [] tags: - choropleths - code - R meta: _edit_last: '1412221' _wp_old_slug: '' _wpas_done_fb: '1' _wpas_done_twitter: '1' image_url: http://dreamessenceonthemove.files.wordpress.com/2010/07/chor.png image_md5: d41d8cd98f00b204e9800998ecf8427e image_size: a:6:{i:0;s:3:"263";i:1;s:3:"218";i:2;s:1:"3";i:3;s:24:"width="263" height="218"";s:4:"bits";s:1:"8";s:4:"mime";s:9:"image/png";} image_tag: image_colors_bg: a:11:{i:0;s:6:"000000";s:2:"+1";s:6:"262626";s:2:"+2";s:6:"404040";s:2:"+3";s:6:"808080";s:2:"+4";s:6:"bfbfbf";s:2:"+5";s:6:"e6e6e6";i:-1;s:6:"000000";i:-2;s:6:"000000";i:-3;s:6:"000000";i:-4;s:6:"000000";i:-5;s:6:"000000";} image_colors_fg: a:11:{i:0;s:6:"808080";s:2:"+1";s:6:"bfbfbf";s:2:"+2";s:6:"ffffff";s:2:"+3";s:6:"000000";s:2:"+4";s:6:"000000";s:2:"+5";s:6:"000000";i:-1;s:6:"808080";i:-2;s:6:"808080";i:-3;s:6:"808080";i:-4;s:6:"808080";i:-5;s:6:"808080";} author: login: dreamessenceonthemove email<EMAIL_ADDRESS>display_name: darribas first_name: Daniel last_name: Arribas-Bel permalink: "/2010/07/31/choropleths-in-r/" ---
The other day I run into the need of creating choropleths, which are thematic maps where attribute data are displayed using a color scale and look like this:
It is a very simple task, provided you have the geo-referenced data, and many packages (such as qGIS) make it a click away. However, I had to create around 300 choropleths and computers were not made for us to click 300 times to perform the same task over and over...
R is a fantastic free software that provides a very powerful graphical support and also has a lot of great packages other people have contributed, so first I assumed it'd be almost built in. I'm sure it is somewhere, but after 2mins. of googling I realized I'd enjoy more spending time coding it myself (something it looked like a 5-minutes thing) than looking it up on the web, and so I did. After many series of "5 minutes", I did it (and it works). I wasn't really thinking of posting it as it is a very simple function but after some of the pain (and fun) I went trhough to code it, I figured if it saved somebody else time, it'd have been a better invested time.
Big thanks to David Folch for initial idea and support as well as the original source cited below.
Feel free to post any comments or feedback if you've used the function. Thanks in advance.
It is a very simple function that assumes you have a shapefile and the attribute data you want to plot are appended to the .dbf that comes with the shapefile. If that is the case, simply pass in the arguments like this:
[sourcecode language="c"]
map <- choropleth(shp, field, png=FALSE, bins=FALSE, bgLayer=FALSE, colPal="Blues", style="hclust", lwd=0.5, title='', sub='', xlab='', ylab='', legend=TRUE)
[/sourcecode]
Simply copy the source code posted below to a file and source it to be able to use the function:
[sourcecode language="c"]
source('/path/to/file.r')
[/sourcecode]
Arguments
[sourcecode language="c" collapse="false"]
##################################
# Choropleth: thematic maps in R #
##################################
# Author: Daniel Arribas-Bel<EMAIL_ADDRESS># Copyright 2010 by Daniel Arribas-Bel
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# See: <http://creativecommons.org/licenses/GPL/2.0/> or <http://www.gnu.org/licenses/>
library(maptools)
library(spatial)
library(RColorBrewer)
library(classInt)
choropleth <- function(shp, field, png=FALSE, bins=FALSE, bgLayer=FALSE,
colPal="Blues", style="hclust", lwd=0.5, title='', sub='', xlab='',
ylab='', legend=TRUE){
# If not 'bins' -> categorical data
poly <- readShapeSpatial(shp)
attach(poly@data, warn.conflicts=FALSE)
data <- get(field)
if(bins==FALSE){
bins <- length(unique(get(field)))
colCode <- colCoder(poly, field, colPal)
leyenda <- colCode$legend
fill <- colCode$paleta
colCode <- colCode$colVec
} else {
colors <- brewer.pal(bins, colPal)
class = classIntervals(data, bins, style)
colCode = findColours(class, colors, digits=4)
leyenda = names(attr(colCode, "table"))
fill = attr(colCode, "palette")
}
detach(poly@data)
#
if(png!=FALSE){
png(png, width=960, height=960, bg="transparent")
}
if(bgLayer!=FALSE){
polyBg <- readShapeSpatial(bgLayer)
plot(polyBg, lwd=lwd)
plot(poly, add=TRUE, col=colCode, lwd=lwd)
} else {
plot(poly, col=colCode, lwd=lwd)
}
title(main=title, sub=sub, xlab=xlab, ylab=ylab)
if(legend==TRUE){legend("topleft", legend=leyenda, fill=fill, cex=0.75, bty="n")}
if(png!=FALSE){
dev.off()
}
#"Map created"
colCode
}
colCoder <- function(poly, var, colPal){
attach(poly@data, warn.conflicts=FALSE)
uniques <- unique(get(var))
paleta <- brewer.pal(length(uniques), colPal)
colVec <- mat.or.vec(length(get(var)), 1)
for(row in seq(length(get(var)))){
ind <- which(uniques == get(var)[row])
colVec[row] <- paleta[ind]
}
detach(poly@data)
res <- list(colVec=colVec, legend=uniques, paleta=paleta)
res
}
[/sourcecode]
This software is licensed under the CC-GNU GPL version 2.0 or later.


High winds blow trailer on top of pickup truck bed
by Jared Leone, Cox Media Group National Content DeskCHADRON, Neb. -
High winds blew a trailer onto the bed of a pickup truck that was driving along a highway near the border of South Dakota and Nebraska.
Nebraska State Patrol shared a photo Wednesday of the trailer balancing on the back of the pickup truck.
"High winds and a lightweight trailer resulted in this unlikely predicament," a trooper said on social media.
© 2019 Cox Media Group.


GitLab CI is a first class citizen in GitLab to enable continuous integration and delivery to your project. Builds are orchestrated via GitLab Runners, which are agents registered to your GitLab account. An agent runs builds using a local shell or a container. Runnings these builds requires a well-defined infrastructure, both with respect to the type of server and the server capacity. Would it not be great if you can scale the infrastructure based on your needs? Indeed, GitLabs runner supports out of the box auto scaling using docker machine, which is discussed in the GitLab blog article: Autoscale GitLab CI runners and save 90% on EC2 costs.
The GitLab blog article nicely explains how to create your infrastructure in a manual way. However, we rather automate all things. Thus, we will automate the set up described in the blog article. In this post I will discuss how to create the infrastructure needed to run the build on AWS spot instances with Hashicorp Terraform. The GitLab Runner module discussed in the post is available in the Terraform Registery.
Before we start, we need to briefly discuss the GitLab runners. To execute the builds, GitLab uses an agent to orchestrate the build with a docker machine. A docker machine creates instances with docker engine to run docker containers. The first step for setting up a runner is to register a new runner. Because GitLab currently does not provide a fully automated way for this, we will do this manually.
Open you GitLab project and lookup the token to register a runner. Be aware that there are project tokens and a GitLab global token. Next, we use a docker container to register a runner. The command will ask a few details.
docker run -it --rm gitlab/gitlab-runner register
Provide the requested details and consult the GitLab manual for more details. Once done, you should see a new runner registered at your project or globally. Open the runner settings in edit mode and record the token. This token is needed later for connecting the agent.
Now the runner is configured in GitLab, we can start creating the infrastructure on AWS. For setting up the network layers, we use Amazon networking scenario 2 to build a VPC with a public and private subnets. For more details see this post about creating a VPC in terraform. You can also simply use the official terraform module.
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "1.5.1"
name = "vpc-${var.environment}"
cidr = "<IP_ADDRESS>/16"
azs = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
private_subnets = ["<IP_ADDRESS>/24", "<IP_ADDRESS>/24", "<IP_ADDRESS>/24"]
public_subnets = ["<IP_ADDRESS>/24", "<IP_ADDRESS>/24", "<IP_ADDRESS>/24"]
enable_nat_gateway = true
tags = {
Environment = "${var.environment}"
}
}
Next, we create a t2.micro
instance using an autoscaling group in the private network. On this instance we install and configure the GitLab runner. Configuration of GitLab runners is done via the config.toml
file. Below the parameterized version of this configuration file. In the Terraform module you will find that the configuration file is loaded via a data template.
concurrent = ${runner_concurrent}
check_interval = 0
[[runners]]
name = "${runners_name}"
url = "${gitlab_url}"
token = "${runners_token}"
executor = "docker+machine"
limit = ${runners_limit}
[runners.docker]
tls_verify = false
image = "docker:17.11.0-ce"
privileged = ${runners_privilled}
disable_cache = false
volumes = ["/cache"]
shm_size = 0
[runners.cache]
Type = "s3"
ServerAddress = "s3-${aws_region}.amazonaws.com"
AccessKey = "${bucket_user_access_key}"
SecretKey = "${bucket_user_secret_key}"
BucketName = "${bucket_name}"
Insecure = false
[runners.machine]
IdleCount = ${runners_idle_count}
IdleTime = ${runners_idle_time}
MachineDriver = "amazonec2"
MachineName = "runner-%s"
MachineOptions = [
"amazonec2-access-key=${access_key}",
"amazonec2-secret-key=${secret_key}",
"amazonec2-instance-type=${instance_type}",
"amazonec2-region=${aws_region}",
"amazonec2-vpc-id=${vpc_id}",
"amazonec2-subnet-id=${subnet_id}",
"amazonec2-private-address-only=true",
"amazonec2-request-spot-instance=true",
"amazonec2-spot-price=${spot_price_bid}",
"amazonec2-security-group=${security_group_name}"
]
All variables can be configured and most of them have default values. Only the name of the runner, the token and the GitLab URL need to be configured. The configuration contains a shared cache in S3 which will expire at the end of the next day (after creation) by default. Files will be deleted via S3 lifecycle management once expired, but the number of expiration days can be changed to your needs. You can find all the available variables in the variables.tf
file of the module. Next we add the module to our Terraform file and define a minimal set of variables.
module "gitlab-runner" {
source = "npalm/gitlab-runner/aws"
aws_region = "<region-to-use>"
environment = "ci-runners"
ssh_public_key = "<contains-public-key"
vpc_id = "${module.vpc.vpc_id}"
subnet_id_gitlab_runner = "${element(module.vpc.private_subnets, 0)}"
subnet_id_runners = "${element(module.vpc.private_subnets, 0)}"
# Values below are created during the registration process of the runner.
runner_name = "<name-of-the-runner"
runner_gitlab_url = "<gitlab-url>"
runner_token = "<token-of-the-runner"
}
The complete example is in GitHub. Now it is time to execute the scripts to create the actual infrastructure. Be aware that you need to configure AWS keys and have Terraform installed. The steps below should guide you through the setup.
git clone https://github.com/npalm/terraform-aws-gitlab-runner.git
cd tf-aws-gitlab-runner/example
The example directory contains the example as described above, so the properties for your newly registered runner in GitLab need to be configured. Please register a runner in GitLab (see docker command above) and update the terraform.tfvars
file. That is all, now execute the Terraform code.
# genere SSH key pair
./init.sh
# initialize terraform
terraform init
# apply, or plan first
terraform apply
After a few minutes the runner should be running and you should see it in your AWS console.
The runner should be active as well in GitLab. Check the runner pages which should now indicate the latest moment of contact.
The modules also enable CloudWatch logging, all systemd
logging is streamed. Go to CloudWatch to inspect the logging and you will see that the installation process was logged as well.
Finally we can verify that the runner is working properly by executing a build. The .gitlab-ci.yml
below is an example to verify the runner is working properly. The build contains two stages. In the first stage an ascii art image is generated, stored in a file which is cached in S3. In the second stage the file is retrieved from the build cache.
stages:
- build
- verify
cache:
key: "$CI_BUILD_REF"
untracked: true
image: npalm/cowsay
build:
stage: build
script:
- cowsay -f ghostbusters building "$CI_BUILD_NAME" @ stage "$CI_BUILD_STAGE" > ghosts.txt
tags:
- docker.m3
verify:
stage: verify
script:
- cat ghosts.txt
tags:
- docker.m3
Add the file above to the GitLab repository that has the created runner attached. Once you commit the file a build should triggered. The logging of the verification step should contain the ascii art image.
Be aware that prices of a spot instance can change over the time and instances can be terminated without a warning. Last black Friday prices of spot instances went up to over 2 dollar occasionally.


The Number Concept
by Levi Leonard Conant, Ph. D.
Preface
Additional Information
- Year Published: 1896
- Language: English
- Country of Origin: United States of America
- Source: Conant, L.L. (1896).The Number Concept. New York: Macmillan & Co.
-
Readability:
- Flesch–Kincaid Level: 8.5
- Word Count: 314
- Genre: Informational
- Keywords: math
- ✎ Cite This
Downloads
In the selection of authorities which have been consulted in the preparation of this work, and to which reference is made in the following pages, great care has been taken. Original sources have been drawn upon in the majority of cases, and nearly all of these are the most recent attainable. Whenever it has not been possible to cite original and recent works, the author has quoted only such as are most standard and trustworthy. In the choice of orthography of proper names and numeral words, the forms have, in almost all cases, been written as they were found, with no attempt to reduce them to a systematic English basis. In many instances this would have been quite impossible; and, even if possible, it would have been altogether unimportant. Hence the forms, whether German, French, Italian, Spanish, or Danish in their transcription, are left unchanged. Diacritical marks are omitted, however, since the proper key could hardly be furnished in a work of this kind.
With the above exceptions, this study will, it is hoped, be found to be quite complete; and as the subject here investigated has never before been treated in any thorough and comprehensive manner, it is hoped that this book may be found helpful. The collections of numeral systems illustrating the use of the binary, the quinary, and other number systems, are, taken together, believed to be the most extensive now existing in any language. Only the cardinal numerals have been considered. The ordinals present no marked peculiarities which would, in a work of this kind, render a separate discussion necessary. Accordingly they have, though with some reluctance, been omitted entirely.
Sincere thanks are due to those who have assisted the author in the preparation of his materials. Especial acknowledgment should be made to Horatio Hale, Dr. D.G. Brinton, Frank Hamilton Cushing, and Dr. A.F. Chamberlain.
WORCESTER, MASS., Nov. 12, 1895.


Use My Location
[OR]
A
B
B
B
B
Aungier Street
Bolton Street
Grangegorman
Cathal Brugha Street
Reset
Direction Steps Will Render Here
<


WITNESS LIST Transportation & Homeland Security Committee May 11, 2005 - 8:00A HB 55 Registering, but not testifying: On: Saenz, Amadeo Asst. Ex. Director of Engineering Operations (TX Dept. of Transportation), Austin, TX HB 160 Registering, but not testifying: For: O'Ryan, Anne Legislative and Community Affairs (AAA Texas), Austin, TX HB 341 FOR: Willis, John Chairman SMA (Self), El Paso, TX AGAINST: Blair, Greg (Foster Malish & Blair, LLP; Weehaul, Inc; and The Apartment Movers, Inc.), Austin, TX ON: Davis, Carol Director, Motor Carrier Division (TX Dept. of Transportation), Austin, TX Registering, but not testifying: For: Cargill, Johnny Lobbyist (Texas Motor Transportation Association/Texas Stakeholders), Austin, TX Cates, Phil (TMTA), Austin, TX Findeisen, Les Director of Policy (Texas Motor Transportation Association), Austin, TX HB 468 ON: Kuntz, Jr., William H. Executive Director (Texas Department of Licensing and Regulation), Austin, TX Registering, but not testifying: On: Murphy, Margaret Policy Analyst (Sunset Commission Staff), Austin, TX HB 754 Registering, but not testifying: For: Reed, Cyrus Lobbyist (Lone Star Chapter of Sierra Club), Austin, TX Schneider, Robin Executive Director (Texas Campaign for the Environment), Austin, TX HB 805 Registering, but not testifying: On: Perkins, Kathryn C. Director (Department of State Health Services), Austin, TX HB 962 ON: Saenz, Amadeo Asst. Ex. Director of Engineering Operations (TX Dept. of Transportation), Austin, TX HB 1136 Registering, but not testifying: On: Saenz, Amadeo Asst. Executive Director of Engineering Operations (TX Dept. of Transportation), Austin, TX HB 1339 Registering, but not testifying: On: Saenz, Amadeo Asst. Executive Director of Engineering Operations (TX Dept. of Transportation), Austin, TX HB 1350 Registering, but not testifying: On: Craig, Mike Deputy Director, Vehicles, Titles and Registration Division (TX Dept. of Transportation), Austin, TX HB 1645 Registering, but not testifying: On: Saenz, Amadeo Asst. Executive Director of Engineering Operations (TX Dept. of Transportation), Austin, TX HB 1735 Registering, but not testifying: For: Rice, Chuck (Texas Bike Coalition), Austin, TX On: Craig, Mike Deputy Director, Vehicles, Titles and Registration Division (TX Dept. of Transportation), Austin, TX HB 1814 Registering, but not testifying: On: Simmons, Steve Deputy Executive Director (TX Dept. of Transportation), Austin, TX HB 2659 ON: Saenz, Amadeo Asst. Ex. Dir. of Engineering Operations (TX Dept. of Transportation), Austin, TX Registering, but not testifying: For: Langmore, John (Infrastructure Corporation of America), Austin, TX HB 2921 FOR: Hastings, Don Deputy City Manager (City of Midlothian), Midlothian, TX Registering, but not testifying: On: Kearns, Dennis Attorney (BNSF Railway), Austin, TX


3D Tech 203
lecturer: Rouan van der Ende -<EMAIL_ADDRESS>Welcome. In this module we'll explore a new medium. 3D delivered to any device. With applications such as games, entertainment and interactive information.
SublimeText text editor
json exporters for blender, max and maya
We're going to be working on an online music experience for yogazelle. See the look reference below. You are free to stay as close to this style as you like, we are focussing on learning the techniques in a short time.
Lesson 1 - Your First Cube In this lesson we'll learn how to set up our scene, camera and render out our first object inside the browser. You'll learn how to program the position, scale and rotation of objects as well as the camera.
Lesson 2 - Interaction We'll cover some basics of javascript. For loops, while loops, if and else conditionals. We see how we can build controls for our scene using the keyboard and mouse. We introduce you to functions and how to make our own rgb color generator.
Lesson 3 - Particles We create our first particle system and learn how to use sprites.
Lesson 4 - 3D import We install the threejs json exporter addon for blender, and export our first object ready for web.
Lesson 5 - Sound We learn how to make things move to sound. Import mp3 and connect your scene up to visualise the amplitude.
Coming soon Lesson 6 - Shaders We introduce vertex and fragment shaders. How to offload processing to the graphics card and use the CPU for other things.
Coming soon Lesson 7 - Morphing and bones We continue with importing assets, with animation this time. We handle the vertex and bone data directly.
Three.js
We will be focussing on three.js to render visuals and 3D in the browser. It is code based and could be intimidating to those who have not programmed before. You can access the threejs documentation locally.
Useful links
THREE.JS EXAMPLES view and learn from the three.js examples and its code!
http://stemkoski.github.io/Three.js/#model-animation
Intro to Pixel Shaders in Three.js


{{brand-logo}}
We look forward to helping you build a beautiful website. If you have any questions along the way, email us at {{reply-to}}.
You can view your site at: {{new-site-url}}.
You can update your site at: {{login-url}}.


Guide the green block through the maze and reach the end!
Don't touch the walls! They are dangerous!!
Complete all 3 levels to win the game!
- Move the green block around the maze and reach the end!
- Hitting any wall will reduce your life count by 1!
- Losing all 3 lives will send you to the previous level!
W or Up-Arrow - Moves Block Upward
A or Left-Arrow - Moves Block Leftward
S or Down-Arrow - Moves Block Downward
D or Right-Arrow - Moves Block Rightward


An introduction to the Japanese language
Leanne Guy
Tuesday 5 May 2020
Origins of Japanese
- No conclusive evidence relating Japanese to any other language family.
- The spoken and written languages have unrelated histories.
- The writing clearly comes from Chinese characters.
- But Japanese has no genetic relationship to Chinese
- The origins of the spoken language are obscure — it's genetic affiliation is unknown.
Characteristics of Japanese
- Subject-Object-Verb (SOV) language.
- Mora timed language — all syllables stressed equally.
- Phonetic, no compound or blended sounds
- Unlike most Asian languages, it is not a tonal language
Japanese is a language that both fascinates and intimidates people.
What makes Japanese hard?
- Most complicated system of writing of any language in the world
- Grammatical structure is very different to that of most other languages.
- Your audience changes how you speak; 敬語 (keigo)
- The subject is frequently omitted from the sentence; context is key
- There are a lot of ways to count — counter words
.. and what makes it easy ?
- No sound that cannot be pronounced by speakers of European languages. ('R' is a little different though).
- No gender, no articles, no plurals.
- No verb conjugations.
- No future tense.
- The grammar, though very different, is very regular (and IMHO very logical)
— there are very few exceptions to the rule.
Sentence Structure
Most people find Japanese sentence structure to be confusing.
I find it to be very logical. You need to change how you think.
Particles — 助詞 — joshi
Japanese sentences are structured around 'particles'.
Particles are 'psuedo-words' that attach to the
end of a content word to define its grammatical function
in the sentence.
It is 'particles' not word order that tell us what happens.
Particles at the end of a sentence
- ka —か : Makes a sentence a question
- yo —よ : Exclamation mark - except you say it
- ne —ね : Asks for the listener's confirmation — Isn't it / Aren't they, etc
Let's eat sushi — 寿司
Watashi, "I"; tabemasu "eat"; yoru "night"; oishii "delicious"; minna "everyone".
- watashi wa sushi o tabemasu.
- sushi o watashi wa tabemasu.
- watashi wa sushi o Princeton de tabemasu.
- Robert-san wa yoru ni Princeton de sushi o tabemasu.
- yoru ni Robert-san to Jim-kun wa Princeton de sushi o tabemasu.
- Robert-san to Jim-kun wa yoru ni oishii sushi o Princeton de tabemasu.
- minna-san wa Princeton de yoru ni oishii sushi o tabemasu ka.
Honorific Speech —
敬語(keigo)
Literally "respectful language"
Japanese has an extensive grammatical system to express politeness and formality.
Three categories of keigo
The (very complicated) Japanese Writing System
Writing was introduced from China about 1500 years ago, before that there was no written language
Given the very different structure of the language, Chinese characters (kanji) were not a good fit for Japanese,
and so the Japanese writing system evolved into the complicated system that exists today
Syllabic 'kana' scripts were later derived from kanji
The Four writing scripts
Kanji - Pictographs, Ideographs that convey meaning.
Hiragana - a syllabic script for writing native Japanese words and grammatical elements.
Katakana - a syllabic script for writing words of foreign origin, onomatopoeic words and to add stress to words.
Romaji - Roman letters with Japanese words
Kanji — 漢字
Chinese characters derived from pictures of things they represented — pictographs and ideographs
Kanji are used to write most content words of native Japanese or historically Chinese origin
-->
Kanji — 漢字
Kanji are used to write most content words of native Japanese or historically Chinese origin
- most nouns, such as 川 (kawa, "river")
- stems of: verbs, 食べます (tabemasu, "to eat")
adjectives, 速い (haya-i, "fast") , and
adverbs 速く (haya-ku, "quickly")
- most Japanese personal names and place names, such as 田中 (Tanaka) and 東京 (Tōkyō).
How to read Kanji
The meaning of a kanji never changes, but it's pronumciation does
- kun-yomi, literally "meaning-reading" —
the native Japanese pronunciation that existed before kanji were introduced
- on-yomi, literally "sound reading" —
the Chinese pronunciation that was adopted into Japanese when Chinese characters were introduced.
How to use a Japanese dictionary
辞書 — Jisho (.org)
s
Apologizing
Japanese has many ways of apologizing, which you use depends on both what you are apologizing for
and to whom
sumimasen — すみません
The most common way to say sorry in daily life.
- Sorry — "I cannot fully express my remorse for what has happened and I apologize"
- Thank you — "I cannot thank you enough for going out of your way for me" or
"I’m sorry to have troubled you, but thank you"
sumimasen deshita: Past tense, "I'm sorry for what I did" —
a little more polite/formal, can be used with a superior
Gomen — 御免
Gomen means "to forgive" - carries a sense of admission of wrongdoing by asking for forgiveness.
- gomen — I'm sorry (informal)
- gomen ne — I'm sorry, OK. (very informal)
- gomen nasai — Please forgive me (more polite)
- gomen kudasi — ... even more polite. Also means "may I come in?"
Use the first 2 only with close friends and family, never with a superior
Shitsurei — 失礼
Shitsurei means "discourtesy, impoliteness", Shimasu means "to do" so literally " to do something impolite".
Used when excusing rude behaviour or insults.
- shitsurei shimasu: I am about to do something rude, please excuse me
- shitsurei shimashita: I was rude, I'm sorry (past tense)
- shitsurei itashimashita: more polite (keigo) of above
Commonly used in the workplace,
e.g you forget to inform a colleague that a meeting time has changed
Moushiwake-nai — 申し訳ない
Moushiwake means "excuse", nai means "there is not" so literally "there is no excuse"
- Moushiwake-nai: No excuse can justify my actions and I apologize"
- Moushiwake-arimasen:More polite
- Moushiwake-gozaimasen: Most polite (keigo)
Very formal expression - should be used with superiors
E.g if your actions cost your company a client
How to say thank you
Do not say thank you if what you are thanking someone for has inconvenienced them, use sumimasen instead.
- arigatou: Thanks, informal
- doumo arigatou: Thanks very much (a lot), informal
- doumo (literally "very") : thanks , very casual
- arigatou gozaimasu: Thank you, polite (teineigo)
- doumo arigatou gozaimasu: Thank you very much.
- doumo arigatou gozaimashita: Thank you very much (for what you did, past tense)
- dou itashimashite: You're welcome
Do not use the first 3 with a superior.
- hajimemashite — 初めまして literally "for the first time".
Said when meeting someone for the first (and only first) time. Accompanied by a bow
- yoroshiku o-negai shimasu — Nice to meet you / I'm counting on you / Please help me
- kekko desu — No thanks (literally "I'm fine")- polite way to unambiguously
refuse something
- itadakimasu — Always say before a meal
- gochisousama deshita — Always say after a meal
- otsukaresama deshita — Good job, thank you for your work / efforts.
Literally "Honorable one who has become tired".
- otsukaresama desu Present tense, as above but used if the work is still in progress.
- gokurousama deshita — Same meaning as above but used by a superior to an subordinate at work.
E.g : A friend finishes a workout, a colleague finishes a piece of work. Also said by everyone at the end of a meeting
- o-makase — Lets someone know that you will follow their recommendation . Especially used in restaurants
- irashai/mase — Honorific expression welcoming someone
- onegai shimasu — Used when making a request for something or asking a favour - "Can you help me?"
- osewa ni narimashita — To thank someone for their help or favors done for you over a period of time
- osaki ni shitsurei shimasu! Say this when you leave the office before your co-workers


--- layout: article title: Onslaught! Arena v1.2.25 is FREE (today only) author: matt tags: [onslaughtarena] ---
Good news, everyone! We just launched a big update to Onslaught! Arena, and to celebrate we're making it FREE for today only in the Chrome Webstore!
Based on market research findings, this update includes the following changes:
It's normally $1.99, so get it while it's hot! I mean, free and stuff!


BACKBEAT A film review by Steve Rhodes Copyright 1996 Steve Rhodes
RATING (0 TO ****): *
[This is one of my golden oldies reviews - written years ago when I was just getting started and never posted. I stand by the conclusions, but in most cases many details are missing that I would normally include today.]
In theory the new movie BACKBEAT is about the early days of the Beatles in Hamburg and Liverpool before they became famous. At least this is the movie I went to see. This movie would have been or at least should have been fascinating. I was a teenager in the 60s and was a big fan of the Beatles's music when I was growing up.
Forget theory. The film known as BACKBEAT is actually about Stuart Sutcliffe (Stephen Dorff) who dropped out of the group to paint and about his girlfriend and photographer Astrid Kirchherr (Sheryl Lee).
A review of this botched attempt at telling the early life of the Beatles is pretty easy. If it was really this boring why make a movie, and if it wasn't, why is this movie so?
Now there are a few, and only a few good aspects of this film. First and foremost, there are about a dozen music segments. Ah, that is the good news. The bad news is that most of them seem to last all of about thirty seconds so that the audience is not distracted from the awful movie about Sutcliffe. There is also Astrid's wonderful smile. I am sure there must have been something else good about the film, but I am unable to recall anything. For the short music clips and for Astrid's smile, I generously award the picture a single star.
If anybody ever makes a good film about the early days of the Beatles, I would love to see it. My recommendation is to pass this one by and look for one of the many Beatles documentaries if you want to know more.
**** = One of the top few films of this or any year. A must see film. *** = Excellent show. Look for it. ** = Average movie. Kind of enjoyable. * = Poor show.  Totally unbearable.
REVIEW WRITTEN ON: April 23, 1994
Opinions expressed are mine and not meant to reflect my employer's.
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Russian prof questioned after severed arms found in backpack
by EndPlayMOSCOW (AP) - Police in the Russian city of St. Petersburg plan to interrogate a prominent professor who has been detained on suspicion of killing a female student after he was pulled from a frigid river with a backpack containing severed arms.
Oleg Sokolov, a history professor at St. Petersburg State University who is an expert in French revolutionary military history, was found Saturday in the Moika River with the rucksack. Police later found the body of his student in his apartment, Russian news reports said.
Lawyer Alexander Pochuev said Sokolov has signed a statement of guilt, the Russian media reports said. Sokolov was hospitalized Saturday for hypothermia but was taken to a police station Sunday for questioning.
Reports said Sokolov had been awarded France's Legion of Honor for his work.


GUI.AddLine
Syntax
GUI.AddLine (widgetID : int, text : string)
Description
GUI.AddLine adds text and a newline to the current line of the text box specified by widgetID. It is essentially equivalent to put text in the text box. GUI.AddLine scrolls the text box (if necessary) so that the added text is now visible. The widgetID parameter must be the widget id of a text box. The text parameter is the text to be added to the text box.
Example
The following creates a text box and puts the numbers from 1 to 25 in it.
import GUI
var boxID : int := GUI.CreateTextBox (50, 50, 200, 200)
for i : 1 .. 25
GUI.AddLine (boxID, intstr (i))
end for
loop
exit when GUI.ProcessEvent
end loop
Status
Exported qualified.
This means that you can only call the function by calling GUI.AddLine, not by calling AddLine.
See also
GUI.CreateTextBox.