Webhook API
Table of Contents
- Introduction
- Usage
- Events for CodeSignal Pre-Screen
- Events for CodeSignal Pre-Screen Certify
Introduction
What is a webhook?
A webhook is a way to receive an event notification from a server. When certain events occur in CodeSignal, a JSON payload containing information about the event will be sent via an HTTP POST request to a specified endpoint URL.
What information is needed to create a webhook?
- Endpoint URL: The URL that will receive POST payloads. This must be a valid URL that returns a 200 HTTP status after receiving each POST. When the webhook is created or updated, the URL will be POSTed with an empty payload, which must return a 200 status code within 10 seconds in order to successfully complete creating or updating the webhook.
- Event types: The list of events the webhook will be notified about.
- Secret key: (optional) A string used to generate a signature header that you can use to verify that the webhook data came from CodeSignal. The secret key is used in conjunction with the webhook's payload to generate a digital signature. Although it is not strictly required, we strongly encourage use of the secret key to verify that webhooks are actually coming from our platform.
- Owner emails: (optional) If the webhook cannot deliver its payload to the endpoint URL successfully, we will send a notification email to every provided email address. Read more about the retry policy below.
- Custom headers: (optional) Custom HTTP request headers that we will send to your endpoint in addition to the signature header.
How do I create a webhook?
If you're not already using CodeSignal, start a conversation with us by requesting a demo.
- Go to the Manage Webhooks page to create a webhook, and hit the "add a webhook" button.
- Fill out all of the required fields, as well as optional ones if you need them. We will generate a Secret key automatically, but you can overwrite it with a custom one.
- All newly created webhooks are initially active.
- A webhook that fails 25 times becomes "disabled".
- You can re-enable a webhook by updating its endpoint with a valid one.
Usage
Authentication
For webhooks with a secret key, CodeSignal will sign every request with a X-CodeSignal-Signature HTTP header, generated using the following algorithm:
getSignature(secretKey, endpointUrl, { eventType = '', triggeredOn = '' }) {
const plainText = `${endpointUrl}${eventType}${triggeredOn}`;
const hash = crypto.createHmac('sha256', secretKey);
hash.update(plainText);
return hash.digest('hex');
}
Here, triggeredOn is the timestamp present in every event payload.
Event handling
For each webhook, we store a list of events the hook should be notified about. When events have been triggered, CodeSignal sends webhooks one event at a time, at a rate of about one per second. If a web hook needs to be notified about multiple events, events are guaranteed to be sent in the order they were triggered.
Retry policy
secondsToWait = failCount^4 + 15 + (random(30) * (failCount + 1))
Assuming that random(30) always returns its average of 15, that would lead to the following retry attempts. (Not all retries are listed in the table, since this is just meant to give a sense of the retry backoff timeline.)
| Previous failed attempts | Time since last attempt | Time since first attempt |
|---|---|---|
| 0 | 30 seconds | 30 seconds |
| 1 | 46 seconds | 1.3 minutes |
| 2 | 1.2 minutes | 2.5 minutes |
| 3 | 2.6 minutes | 5.1 minutes |
| 5 | 12.2 minutes | 23 minutes |
| 10 | 2.8 hours | 7.4 hours |
| 13 | 8 hours | 1 day |
| 15 | 14 hours | 2.1 days |
| 24 | 3.8 days | 20.5 days |
CodeSignal will also send an email notification to the owner emails associated with the webhook, if any. To make sure we don't spam you, CodeSignal will send at most one email a day for every webhook. This means that you will generally be notified about the first fail, the 14th fail, and every fail starting from the 16th.
When a webhook is unhealthy, events will be queued in the order they were triggered, and the queue will not be flushed until the first event in the queue is able to be processed successfully (by receiving a 200 OK response from the endpoint URL). If you are able to identify and resolve the issue with the endpoint URL, you can open the webhook settings modal, then test and save the fixed webhook in order to mark it as healthy again. Once it is marked as healthy, the webhook will immediately flush its queue of pending events.
Webhook payloads
- event: [string] The type of event
- triggeredOn: [number] The timestamp of when the event was triggered, represented as number of milliseconds since the Unix epoch.
- payload: [object] The list of events the webhook will be notified about.
Events for CodeSignal Pre-Screen
Here is an overview of the end to end workflow of events for CodeSignal Pre-Screen.
Company Client workflow
companyTestSessionCreated
Fired when a test session is created.
{
event: 'companyTestSessionCreated',
triggeredOn: number,
payload: {
testSessionId: string,
testId: string,
testTitle: string,
candidateEmail: string,
candidateName: string
}
};
{
event: 'companyTestSessionCreated',
triggeredOn:<PHONE_NUMBER>347,
payload: {
testSessionId: 'lehu382hdleh29',
testId: 'dhey29hcl28hl28',
testTitle: 'Software Engineer intern',
candidateEmail<EMAIL_ADDRESS>candidateName: 'Jane Doe'
}
};
Candidate workflow
preScreenCandidateDeclined
Fired when a candidate declines a test session invitation.
{
event: 'preScreenCandidateDeclined',
triggeredOn: number,
payload: {
testSessionId: string,
testId: string,
testTitle: string,
candidateEmail: string,
candidateName: string,
externalId?: string
}
};
{
event: 'preScreenCandidateDeclined',
triggeredOn:<PHONE_NUMBER>347,
payload: {
testSessionId: 'lehu382hdleh29',
testId: 'dhey29hcl28hl28',
testTitle: 'Software Engineer intern',
candidateEmail<EMAIL_ADDRESS>candidateName: 'Jane Doe'
}
};
preScreenResultShared
Fired when a candidate shares their existing result with a test session invitation.
{
event: 'preScreenResultShared',
triggeredOn: number,
payload: {
testSessionId: string,
testId: string,
testTitle: string,
candidateEmail: string,
candidateName: string,
duration: number,
score: number,
maxScore: number | null | undefined,
codingScore?: number | null, // deprecated; use versionedCodingScore instead
versionedCodingScore?: {
version: 'original' | 'codingScore2023',
value: number,
},
externalId?: string
}
};
{
event: 'preScreenResultShared',
triggeredOn:<PHONE_NUMBER>347,
payload: {
testSessionId: 'lehu382hdleh29',
testId: 'dhey29hcl28hl28',
testTitle: 'Software Engineer intern',
candidateEmail<EMAIL_ADDRESS>candidateName: 'Jane Doe',
duration: 3480000, // 58 minutes
score: 900,
maxScore: 1000,
codingScore: 820,
versionedCodingScore: {
version: 'codingScore2023',
value: 575
},
plagiarismLevel: 0.5,
plagiarismLabel: 'medium',
url: https://app.codesignal.com/test-result/oH3qeBC38oFsf7qB4?accessToken=A7HnBpab4aD7xm7Kp-iPhk2se5Wnxeg7x9GruANLzn
}
};
preScreenExpired
Fired when a test session invitation expires without the candidate responding.
{
event: 'preScreenExpired',
triggeredOn: number,
payload: {
testSessionId: string,
testId: string,
testTitle: string,
candidateEmail: string,
candidateName: string,
externalId?: string
}
};
{
event: 'preScreenExpired',
triggeredOn:<PHONE_NUMBER>347,
payload: {
testSessionId: 'lehu382hdleh29',
testId: 'dhey29hcl28hl28',
testTitle: 'Software Engineer intern',
candidateEmail<EMAIL_ADDRESS>candidateName: 'Jane Doe'
}
};
companyTestSessionStarted
Fired when a candidate starts a test session.
{
event: 'companyTestSessionStarted',
triggeredOn: number,
payload: {
testSessionId: string,
testId: string,
testTitle: string,
candidateEmail: string,
candidateName: string
}
};
{
event: 'companyTestSessionStarted',
triggeredOn:<PHONE_NUMBER>347,
payload: {
testSessionId: 'lehu382hdleh29',
testId: 'dhey29hcl28hl28',
testTitle: 'Software Engineer intern',
candidateEmail<EMAIL_ADDRESS>candidateName: 'Jane Doe'
}
};
preScreenResultVerificationPending
Fired when a candidate finishes a proctored test session.
{
event: 'preScreenResultVerificationPending',
triggeredOn: number,
payload: {
testSessionId: string,
testId: string,
testTitle: string,
candidateEmail: string,
candidateName: string,
duration: number,
score: number,
maxScore: number | null | undefined,
codingScore?: number | null, // deprecated; use versionedCodingScore instead
versionedCodingScore?: {
version: 'original' | 'codingScore2023',
value: number,
},
externalId?: string
}
};
{
event: 'preScreenResultVerificationPending',
triggeredOn:<PHONE_NUMBER>347,
payload: {
testSessionId: 'lehu382hdleh29',
testId: 'dhey29hcl28hl28',
testTitle: 'Software Engineer intern',
candidateEmail<EMAIL_ADDRESS>candidateName: 'Jane Doe',
duration: 3480000, // 58 minutes
score: 900,
maxScore: 1000,
codingScore: 820,
versionedCodingScore: {
version: 'codingScore2023',
value: 575
},
}
};
companyTestSessionFinished
Fired when a non-proctored test session is finished.
{
event: 'companyTestSessionFinished',
triggeredOn: number,
payload: {
testSessionId: string,
testId: string,
testTitle: string,
candidateEmail: string,
candidateName: string,
duration: number, // milliseconds
score: number,
maxScore: number,
codingScore?: number | null, // deprecated; use versionedCodingScore instead
versionedCodingScore?: {
version: 'original' | 'codingScore2023',
value: number,
},
plagiarismLevel: number,
plagiarismLabel: 'none' | 'low' | 'medium' | 'high' | '-',
url: string,
}
};
{
event: 'companyTestSessionFinished',
triggeredOn:<PHONE_NUMBER>347,
payload: {
testSessionId: 'lehu382hdleh29',
testId: 'dhey29hcl28hl28',
testTitle: 'Software Engineer intern',
candidateEmail<EMAIL_ADDRESS>candidateName: 'Jane Doe',
duration: 3480000, // 58 minutes
score: 900,
maxScore: 1000,
codingScore: 820,
versionedCodingScore: {
version: 'codingScore2023',
value: 575
},
plagiarismLevel: 0.5,
plagiarismLabel: 'medium',
url: https://app.codesignal.com/test-result/oH3qeBC38oFsf7qB4?accessToken=A7HnBpab4aD7xm7Kp-iPhk2se5Wnxeg7x9GruANLzn
}
};
CodeSignal Auditor workflow
preScreenResultNotVerified
Fired when a test session is marked as not verified by CodeSignal. This means that either the session has been flagged for suspicious behavior, or a technical issue has been identified during the session (in which case the candidate will be automatically granted a retake).
{
event: 'preScreenResultNotVerified',
triggeredOn: number,
payload: {
testSessionId: string,
testId: string,
testTitle: string,
candidateEmail: string,
candidateName: string,
rejectedReasons: string[],
}
};
{
event: 'preScreenResultNotVerified',
triggeredOn:<PHONE_NUMBER>347,
payload: {
testSessionId: 'lehu382hdleh29',
testId: 'dhey29hcl28hl28',
testTitle: 'Software Engineer intern',
candidateEmail<EMAIL_ADDRESS>candidateName: 'Jane Doe',
rejectedReasons: ['Incomplete recording', 'Screen not visible]
}
};
preScreenResultVerified
Fired when a proctored test session is verified by CodeSignal.
{
event: 'preScreenResultVerified',
triggeredOn: number,
payload: {
testSessionId: string,
testId: string,
testTitle: string,
candidateEmail: string,
candidateName: string,
duration: number, // milliseconds
score: number,
maxScore: number,
codingScore?: number | null, // deprecated; use versionedCodingScore instead
versionedCodingScore?: {
version: 'original' | 'codingScore2023',
value: number,
},
plagiarismLevel: number,
plagiarismLabel: 'none' | 'low' | 'medium' | 'high' | '-',
url: string,
}
};
{
event: 'preScreenResultVerified',
triggeredOn:<PHONE_NUMBER>347,
payload: {
testSessionId: 'lehu382hdleh29',
testId: 'dhey29hcl28hl28',
testTitle: 'Software Engineer intern',
candidateEmail<EMAIL_ADDRESS>candidateName: 'Jane Doe',
duration: 3480000, // 58 minutes
score: 900,
maxScore: 1000,
codingScore: 820,
versionedCodingScore: {
version: 'codingScore2023',
value: 575
},
plagiarismLevel: 0.5,
plagiarismLabel: 'medium',
url: https://app.codesignal.com/test-result/oH3qeBC38oFsf7qB4?accessToken=A7HnBpab4aD7xm7Kp-iPhk2se5Wnxeg7x9GruANLzn
}
};
Events for CodeSignal Pre-Screen Certify
Pre-Screen Certify webhooks process flow
certificationResultPending
Fired when a candidate finishes a standardized test session, if that session has been autoshared with your company. The certification request is still pending and has not yet been certified by the CodeSignal certification team.
{
event: 'certificationResultPending',
triggeredOn: number,
payload: {
certificationRequestId: string,
testSessionId: string,
testId: string,
testTitle: string,
candidateEmail: string,
candidateName: string,
duration: number, // milliseconds
score: number,
maxScore: number,
codingScore: number,
}
};
{
event: 'certificationResultPending',
triggeredOn:<PHONE_NUMBER>347,
payload: {
certificationRequestId: 'lehjeh36dleh29',
testSessionId: '2TgbrRMkBiksAXqEd',
testId: 'dhey29hcl28hl28',
testTitle: 'General Coding Assessment',
candidateEmail<EMAIL_ADDRESS>candidateName: 'Jane Doe',
duration: 5286253,
score: 876,
maxScore: 1300,
codingScore: 793
}
};
certificationResultNotCertified
Fired when a candidate's standardized test session is denied certification by the CodeSignal certification team, if that test session has been autoshared with your company. The certification request will remain open even after this, in case of retakes or technical issues, so receiving this webhook is not "final" -- you may subsequently receive a certificationResultShared or certificationRequestExpired event.
{
event: 'certificationResultNotCertified',
triggeredOn: number,
payload: {
certificationRequestId: string,
testId: string,
testTitle: string,
candidateEmail: string,
candidateName: string,
rejectedReasons: Array<string>
}
};
{
event: 'certificationResultNotCertified',
triggeredOn:<PHONE_NUMBER>347,
payload: {
certificationRequestId: 'lehjeh36dleh29',
testId: 'dhey29hcl28hl28',
testTitle: 'General Coding Assessment',
candidateEmail<EMAIL_ADDRESS>candidateName: 'Jane Doe',
rejectedReasons: ['Unauthorized resource', 'Presence of others']
}
};
certificationResultShared
Fired when a candidate shares their certification result(s) to a specific certification request, or when the result they agreed to automatically share gets certified.
{
event: 'certificationResultShared',
triggeredOn: number,
payload: {
certificationRequestId: string,
testId: string,
testTitle: string,
candidateEmail: string,
candidateName: string,
sharedTestSessions: Array<{ // ordered by codingScore in descending order
codingScore: number,
score: number,
maxScore: number,
startDate: number,
finishDate: number,
duration: number,
id: string,
url: string,
}>
}
};
{
event: 'certificationResultShared',
triggeredOn:<PHONE_NUMBER>347,
payload: {
certificationRequestId: 'lehjeh36dleh29',
testId: 'dhey29hcl28hl28',
testTitle: 'General Coding Assessment',
candidateEmail<EMAIL_ADDRESS>candidateName: 'Jane Doe',
sharedTestSessions: [{
codingScore: 823,
score: 1148,
maxScore: 1300,
startDate:<PHONE_NUMBER>000,
finishDate:<PHONE_NUMBER>000,
duration: 3600000,
id: '272bu5Na997EdzmQ8',
url: https://app.codesignal.com/coding-report/8rRHAnRb3mW6RSfJG-a7RFoj2CESoWCji588zCnDJy/J3y6nqx6C89oMq998?accessToken=5ejNbPLLD79xFGNuQ-cEq43zQPQrQqkg2cn3danTag,
}, {
codingScore: 793,
score: 876,
maxScore: 1300,
startDate:<PHONE_NUMBER>000,
finishDate:<PHONE_NUMBER>000,
duration: 3600000,
id: '2TgbrRMkBiksAXqEd',
url: https://app.codesignal.com/coding-report/8rRHAnRb3mW6RSfJG-a7RFoj2CESoWCji588zCnDJy/J3y6nqx6C89oMq998?accessToken=5ejNbPLLD79xFGNuQ-cEq43zQPQrQqkg2cn3danTag,
}]
}
};
certificationRequestExpired
Fired when a request for a certified test result cannot be fulfilled within the expiration window. The expiredReason field indicates whether the expiration is due to the test not being taken at all, or whether the test could not be certified by CodeSignal due to possibility/suspicion of cheating. If the latter, a rejectedReasons field will also be provided.
{
event: 'certificationRequestExpired',
triggeredOn: number,
payload: {
certificationRequestId: string,
testId: string,
testTitle: string,
candidateEmail: string,
candidateName: string,
expiredReason: 'testNotTaken' | 'notCertified',
rejectedReasons?: Array<string>
}
};
{
event: 'certificationRequestExpired',
triggeredOn:<PHONE_NUMBER>347,
payload: {
certificationRequestId: 'lehjeh36dleh29',
testId: 'dhey29hcl28hl28',
testTitle: 'General Coding Assessment',
candidateEmail<EMAIL_ADDRESS>candidateName: 'Jane Doe',
expiredReason: 'notCertified',
rejectedReasons: ['Unauthorized resource', 'Presence of others'],
}
};
certificationRequestRejected
Fired when a candidate explicitly declines a request to share a certification result. This means that they neither took the test upon request nor agreed to share any pre-existing results.
{
event: 'certificationRequestRejected',
triggeredOn: number,
payload: {
certificationRequestId: string,
testId: string,
testTitle: string,
candidateEmail: string,
candidateName: string,
}
};
{
event: 'certificationRequestRejected',
triggeredOn:<PHONE_NUMBER>347,
payload: {
certificationRequestId: 'lehjeh36dleh29',
testId: 'dhey29hcl28hl28',
testTitle: 'General Coding Assessment',
candidateEmail<EMAIL_ADDRESS>candidateName: 'Jane Doe',
}
};


Red River (1948)
Grade: 99
When the American Film Institute released their list of the 100 greatest American films, the most glaring omission was "Red River". "Red River" is surely the greatest Western, and perhaps even the greatest of all films.
If "Stagecoach" delivered John Wayne from "B" Western obscurity, "Red River" was the film that made him a top box office draw. "Red River" defined his on-screen persona: the great speaking voice, his stubborness, and his preference of leadership to romance.
"Red River" was also the first film for Montgomery Clift, although his second film "The Heiress" beat it to the theatres. A lawsuit by Howard Hughes and lengthy post-production delayed the release of "Red River" for two years. You would think that Clift would be miscast in a Western, but he does just fine, playing Wayne's gentler alter ego.
Perhaps "Red River" should have been titled "Mutiny on the Plains" instead. It takes the story of "Mutiny on the Bounty" and places it in a Western setting. Wayne is a big-time rancher going broke despite owning thousands of cattle, which have no market in Texas. He aims to drive them far North to Missouri, where waiting railroads and slaughterhouses will pay top dollar. Clift is his adopted son, and Walter Brennan is his sidekick. During the big cattle drive, Wayne's increasing tyranny leads to mutiny. Joanne Dru shows up late in the film as a love interest for Clift.
"Red River" is not a perfect film. The preteen version of Clift's character is misplayed by Mickey Kuhn. Many times the lead actors are superimposed over a Western background. None of Wayne's hired gunmen have any speaking lines. The stampede results in a litter of dead cattle, but only some 600 head are said to be lost in the entire driver. Dru breaks up the climatic fight between Wayne and Clift. During an indian battle, she seems more interested in annoying Clift than in shooting the indians that are an immediate threat to her life. The long suggested battle between Clift and Ireland never arrives. These faults are all trivial, however, compared to the magnificence of the script (Borden Chase), the cinematography (Russell Harlan) and the direction (by Howard Hawks, his first Western).
Dru's character has been the subject of some criticism. She seems to have been inserted to provide a requisite love interest for Clift. However, her presence does increase the tension of the impending confrontation between Wayne and Clift, and provides an excuse for a peaceful resolution. Her character has plenty of motivation for obsessively pursuing Clift: he is after all a land baron, and has saved her life from marauding indians.
"Red River" cost three million to make, quite a sum in those days. However, it made five million at the box office during its initial run. Somehow it only received two Oscar nominations, for Film Editing (Christian Nyby) and Writing.
<EMAIL_ADDRESS>http://members.tripod.com/~Brian_Koller/movies.html
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


I like the focus on both technical and personal development and I think their values align well with my own. It's also clear the experience will be very different from any learning environment I have been part of before.
It's going to be tough and you will need to be completely commited if you want to succeed, but the more I take part in it the more sure I am I have made the right choice in signing up with EDA.
I attended an EDA day in the life session and one of the main reasons I ended up signing up to the bootcamp was the values they emphasised and the positive, supportive and collabaritive culture they tried to foster. I hope to embrace the culture, especially when it comes to reflection and collaboration as these are areas that I struggle in.
Shereef’s video and the first week of phase 0 have reinforced what I took out of the day in the life session and I am excited to jump into rest of the bootcamp. I am a bit nervous as well as this is a big step for me and I will definitely be out of my comfort zone?


class JW6SS
comScore StreamSense plugin for JW Player 6
First, include the .js file in your HTML. This has to be done after including the JW Player and StreamSense JavaScript files:
<!-- JW Player 6 -->
<script type='text/javascript' src='http://jwpsrv.com/library/x_xxxxxxxxxxxxxxxxxxxxxx.js'></script>
<!-- StreamSense -->
<script type='text/javascript' src='/streamsense.min.js'></script>
<!-- This library -->
<script type='text/javascript' src='/jw6ss.js'></script>
If there's only one player in the whole page, you can use the short initialization:
JW6SS.observeAll()
In case you have more, you can specify which player you want to observe:
var p = jwplayer('main-player');
JW6SS.observe(p);
This library is coded in CoffeeScript, with compiled js bundled in the dist
folder. In case you want to manually build it (ie. you made some modifications), first install CoffeeScript:
npm -g install coffee-script
Then run the compiler (this will keep the compiler watching for changes inside the src
directory):
coffee -o dist -cw src
The source code is heavily documented (well, not heavily, but i'm trying to do so) in a Literate way. You can find the documentation inside the docs
folder.
Of course you can re-generate with Docco:
npm -g install docco
And running the following command:
docco -o docs src\jw6ss.coffee
The JW6SS Class is our namespace-like container, to avoid global scope pollution.
class JW6SS
The Observe class method provides a shorthand utility to start reporting player events.
It just takes one argument, a JW Player instance, and if it isn't provided
it will call the jwplayer()
function.
It returns a Reporter
instance, so you can store it for later use.
@observe: (jw = jwplayer())=>
Create a ns_.StreamSense
instance.
ss = new ns_.StreamSense
Create a new Reporter
object.
reporter = new @Reporter jw, ss
Start reporting inmediately! As the observe()
instance method from
Reporter
class returns this
, this last line will return the
forementioned Reporter
instance.
reporter.observe()
@observeAll: (jws = @_getAllPlayers())=>
@observe jw for jw in jws
@_getAllPlayers: ()->
i = 0
player while (player = jwplayer i++) and player.id?
This is the main Class for the library, it handles the mapping between player events and StreamSense events, and keeps updated all the variables the latter needs to report.
class JW6SS.Reporter
Define some internal states as Class properties. This is needed because of
how JW fires Seeking events (we will get onto this later on). While just
States.SEEKING
is really needed, we define other basic states for the sake
of completeness.
@States:
IDLE: 0
PLAYING: 1
PAUSED: 2
SEEKING: 3
Reporter
provides debugging information for every event, modification and
notification. Defining loggingEnabled
to true
will use console.log
to
output this information.
loggingEnabled: false
This private variable stores the current Player status, idle by default.
_state = @States.IDLE
When a seeking event is fired, we will store its target offset in this variable.
_seekOffset = null
To create a Reporter
instance, you have to provide a JW Player instance (as
returned by jwplayer()
and a ns_.StreamSense
instance.
constructor: (@jw, @ss)->
if @jw.config.streamsense? and @jw.config.streamsense.loggingEnabled?
@loggingEnabled = @jw.config.streamsense.loggingEnabled
log: ()->
if @loggingEnabled and console? and console.log?
console.log.apply console, arguments
observe: ()->
@resetPlayer()
@jw.onVolume (e)=>
@log '[JW6SS::JW6] onVolume event fired', e
@resetPlayer()
@jw.onMute (e)=>
@log '[JW6SS::JW6] onMute event fired', e
@resetPlayer()
@jw.onFullscreen (e)=>
@log '[JW6SS::JW6] onFullscreen event fired', e
@resetPlayer()
@jw.onPlaylist (e)=>
@log '[JW6SS::JW6] onPlaylist event fired', e
@resetPlaylist()
@jw.onPlaylistItem (e)=>
@log '[JW6SS::JW6] onPlaylistItem event fired', e
@resetClipLabels()
@jw.onPlaylistComplete (e)=>
@log '[JW6SS::JW6] onPlaylistComplete event fired', e
@notify ns_.StreamSense.PlayerEvents.END,
ns_st_pe: 1
@jw.onPlay (e)=>
@log '[JW6SS::JW6] onPlay event fired', e
@updateClipLabels()
labels = {}
seconds = null
if _state is @constructor.States.SEEKING
labels.ns_st_ui = 'seeking'
seconds = _seekOffset
@notify ns_.StreamSense.PlayerEvents.PLAY, labels, seconds
_seekOffset = null
_state = @constructor.States.PLAYING
@jw.onPause (e)=>
@log '[JW6SS::JW6] onPause event fired', e
@notify ns_.StreamSense.PlayerEvents.PAUSE
_state = @constructor.States.PAUSED
@jw.onBuffer (e)=>
@log '[JW6SS::JW6] onBuffer event fired', e
Only notify Buffering when starting a new clip. This needs to be done to avoid Seeking being reported as a Buffering event. Downside: We are losing buffering events during playback. :(
if @jw.getPosition() is 0 and e.oldstate is "IDLE"
@notify ns_.StreamSense.PlayerEvents.BUFFER
@jw.onIdle (e)=>
@log '[JW6SS::JW6] onIdle event fired', e
_state = @constructor.States.IDLE
@jw.onComplete (e)=>
@log '[JW6SS::JW6] onComplete event fired', e
@notify ns_.StreamSense.PlayerEvents.END
_state = @constructor.States.IDLE
@jw.onSeek (e)=>
@log '[JW6SS::JW6] onSeek event fired', e
@notify ns_.StreamSense.PlayerEvents.PAUSE,
ns_st_ui: 'seeking'
, e.position
_state = @constructor.States.SEEKING
Note the actual position the player will eventually seek to may differ, e.g. because Flash progressive can only seek to keyframes and HLS can only seek to fragment boundaries.
http://www.longtailvideo.com/support/jw-player/28851/javascript-api-reference
_seekOffset = e.offset
@jw.onError (e)=>
@log '[JW6SS::JW6] error event fired', e
@notify ns_.StreamSense.PlayerEvents.END
return @
generatePlayerLabels: ()->
labels =
ns_st_mp: "JW Player"
ns_st_mv: jwplayer.version
ns_st_it: not provided by JW ns_st_br: not provided by JW
ns_st_ws: if @jw.isFullscreen then 'full' else 'norm'
ns_st_vo: @jw.getVolume() || 100
if @jw.config.streamsense? and @jw.config.streamsense.player?
labels extends @jw.config.streamsense.persistent
return labels
resetPlayer: ()->
labels = @generatePlayerLabels()
@ss.setLabels labels
@log '[JW6SS] resetted persistent labels', labels
generatePlaylistLabels: ()->
labels =
ns_st_pl: @jw.config.title
ns_st_ca: not provided by JW
ns_st_cp: @jw.getPlaylist().length
if @jw.config.streamsense? and @jw.config.streamsense.playlist?
labels extends @jw.config.streamsense.playlist
return labels
resetPlaylist: ()->
labels = @generatePlaylistLabels()
@ss.setPlaylist labels
@log '[JW6SS] updated playlist labels', labels
generateClipLabels: ()->
clip = @jw.getPlaylistItem()
clipDuration = @jw.getDuration()
clipLength = if clipDuration > 0 then clipDuration * 1000 else 0
clipURL = clip.file.split('?').shift()
labels =
ns_st_cn: @jw.getPlaylistIndex() + 1
ns_st_ci: generateHash clipURL
ns_st_cl: clipLength
ns_st_pn: 1
ns_st_tp: 1
ns_st_el: clipLength
ns_st_pr: clip.title
ns_st_ep: not provided by JW ns_st_ty: not provided by JW ns_st_ge: not provided by JW ns_st_de: not provided by JW ns_st_pu: not provided by JW ns_st_dt: not provided by JW ns_st_st: not provided by JW ns_st_fee: not provided by JW ns_st_ad: not provided by JW ns_st_li: not provided by JW ns_st_cs: not provided by JW
ns_st_cu: clipURL
if clip.streamsense?
labels extends clip.streamsense
return labels
resetClipLabels: ()->
labels = @generateClipLabels()
@ss.setClip labels
@log '[JW6SS] resetted clip labels', labels
updateClipLabels: ()->
labels = @generateClipLabels()
@ss.getClip().setLabels labels
@log '[JW6SS] updated clip labels', labels
notify: (state, labels = {}, seconds = @jw.getPosition())->
@log "[JW6SS::StreamSense] notifying event", state, labels, seconds
@ss.notify state, labels, seconds * 1000
generateHash = (s) ->
h = 0
if s.length is 0
return h
for i in [0...s.length]
do (i)->
c = s.charCodeAt i
h = ((h<<5)-h)+c
h |= 0
return Math.abs(h).toString(36)
Export global module
window.JW6SS = JW6SS


{% extends "mobile/page.html" %} {% set pagetitle = _('Email sent') %} {% set body_id = 'forgot-pwd' %} {% set hide_menu = True %} {% block pagecontent %}
{% trans %} You're almost there. We just sent you a link to reset your password. Please wait a few moments before it arrives, then follow the instructions to sign back in. {% endtrans %}
{% trans %} If you do not receive an email please check your spam folder and confirm you used the same email address during registration. {% endtrans %}


 Here’s what you need you to know.
College Affordability Act
The College Affordability Act is a new legislative proposal that could reshape the future of student loans. The legislation, which was introduced by House Democrats in October, promises to increase federal student aid and fight the rising cost of college. The College Affordability Act is expected to cost $400 billion over 10 years and seeks to change the education landscape in several ways:
- Refinance Student Loans
- No Origination Fees
- Simplify Student Loan Repayment
Refinance Student Loans
The federal government does not refinance student loans. If you want to refinance student loans, you can refinance your federal student loans, private student loans or both with a private lender. Student loan refinancing helps you get a lower interest rate, lower your monthly payment and pay off student loans faster.
The College Affordability Act would enable borrowers to refinance their student loans to today’s interest rates, which have dropped to as low as 1.81%.
Eliminates origination fees
When you borrow federal student loans, the government charges you an origination fee, which is charged as a percentage of the amount you borrow and is added to your student loan balance. In contrast, most private student loan lenders do not charge an origination fee. Under the College Affordability Act, origination fees for federal student loans would be eliminated, which would save you money.
Simplifies Student Loan Repayment
Today, the latest student loan debt statistics show that there are more than 44 million borrowers who collectively owe $1.6 trillion of student loan debt. If you have federal student loans, there are multiple student loan repayment plans. Each have different requirements, which may be complicated for student loan borrowers to follow. Income-driven repayment plans, for example, base your student loan payments on your family size and a percentage of your discretionary income, and then offer student loan forgiveness after 20 or 25 years.
The College Affordability Act would replace the current student loan repayment plans with two plans: one fixed student loan repayment plan and one income-based repayment plan. Fewer plans could simply student loan repayment and avoid confusion. Borrowers also could automatically re-certify their income each year, which would save time from the current task of completing annual paperwork.
Other Key Issues
The key question will continue to be: What role with the federal government play in student lending? How will taxpayers be impacted?
Two areas that do not appear in The College Affordability Act:
- Free College: There is no mention of “free college.” Through federal-state partnerships, tuition would be reduced at public colleges and universities. Federal funding would be allocated to states that make community college tuition-free.
- Cancel Student Loan Debt: There is no mention of student loan debt cancellation.


Mercury and polychlorinated biphenyls (PCBs) are two contaminants of concern for anglers in the San Francisco Bay. Mercury, in its elemental and methylmercury forms, can harm the nervous system. This can cause cognitive impairment, especially in children. Eating fish is the number one source of mercury exposure for Americans. Polychorinated biphenyls (PCBs) are industrial chemicals that were manufactured until 1979. A PCB congener is one chemical compound in the PCB category. There are 209 unique PCB congeners. PCBs can cause cancer as well as negatively affect the immune, reproductive, nervous, and endocrine systems. Despite the ban on PCB manufacturing, PCBs persist in the environment and can contaminate meat, dairy, water, and especially fish.
I obtained data from the Contaminant Data Display and Download (CD3) tool of the San Francisco Estuary Institute. I used Python 3.8 for all analysis and visualization. I used the Pandas package for data cleaning and Geoviews, Holoviews, and Bokeh for visualization.
Because the data came from different collection times and stations, I examined the units the results were reported in to ensure the data were all comparable (see supplementary information). Because of a significant difference in the distribution of mercury concentrations in fish tissue in ug/g dry weight (dw) versus ug/g wet weight (ww), I chose to plot data using the two units separately for the time series analysis. Mercury concentrations in sediment were reported in ug/kg dw and mg/kg dw, which should differ by three orders of magnitude. However, my analysis led me to conclude that the data belonged to similar distributions and the difference in units may be an error in reporting.
Fish and sediment were not collected at the same coordinates, so I grouped the data by county to facilitate comparisons.
The EPA recommends that people avoid eating fish that contain over 0.46 ug/g mercury. In the San Francisco Bay, the concentration of mercury in fish has decreased since 2003 such that the majority of fish contain less than this threshold. In recent years (2011-2015), fish caught off Pier 40 contain the lowest concentrations of mercury. The mercury concentration in sediment from the Bay does not show any trends over time except for a recent spike in Contra Costa county (El Cerrito). There is not a strong correlation between mercury levels in sediment and in fish.
The US tolerance for total PCBs in fish is 2000 ng/g wet weight. None of the fish sampled in San Francisco Bay in 2009 and 2010 reached this level. However, over those two years, the level of total PCBs increased. Individual PCB congeners spanned from 0 to 100 ng/g in fish tissue; the maximum concentration for any individual congener did not change over time. However, sediment in San Mateo county spiked to over 0.1 g/g in 2010, over ten thousand times higher than the next highest measurement. However, sediment concentrations have recovered to typical levels. Although much less data is available for total PCBs than for mercury, increased total PCBs in sediment appears to correlate strongly with total PCBs in fish tissue.
Python 3.8, NumPy, Pandas, Bokeh, Holoviz, iqplot, bootcamp_utils


Cooperative
PH
: Banking Solutions
404
The page you are looking for might have been removed. If you believe this is an error, contact the system administrator.


?CAR?
THE
NEW
YORK
BOTANICAL
GARDEN
EXPLORATION
OF
JAMAICA
Vicinity
of
cinchona
Hwtitoflr
If
W-'MTi
AfflifciCAK
N.
L.
Britton
1906
BOTANICAL
GARDEN
01362123
01362123
Legend -
Level of confidence that token is an accurately-transcribed word
extremely low
very low
low
undetermined
medium
high
very high


Install and configure Ghost with NGINX - Debian, CMS, Ghost, NGINX
Ghost is simple blogging platform, fast to setup and easy to setup. Besides, it provides good customization options to the users. This article describes the steps to set up a Ghost blogging platform with nginx on a Debian platform.
Note: It is assumed that the user has sudo privileges user.
node.js
source
node.js
npm
config.js
file
production: { url: 'http://<IP_ADDRESS>', mail: {}, database: { client: 'sqlite3', connection: { filename: path.join(__dirname, '/content/data/ghost.db') }, debug: false }, server: { // Host to be passed to node's `net.Server#listen()` host: '<IP_ADDRESS>', // Port to be passed to node's `net.Server#listen()`, for iisnode set this to `process.env.PORT` port: '2368' } }
forever
as the node daemon tool
Or
nginx.conf
file by replacing the following content
user www-data; worker_processes 4; pid /run/nginx.pid; events { worker_connections 768; # multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/x-javascript text/xml application/ xml application/xml+rss text/javascript; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
server { listen 80; server_name <IP_ADDRESS> root ~; index index.php; if ($http_host != “<IP_ADDRESS>") { rewrite ^ http://<IP_ADDRESS>request_uri permanent; } location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://<IP_ADDRESS>:2368; } location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|woff)$ { access_log off; expires 30d; add_header Pragma public; add_header Cache-Control "public, mustrevalidate, proxy-revalidate"; proxy_pass http://<IP_ADDRESS>:2368; } location = /robots.txt { access_log off; log_not_found off; } location = /favicon.ico { access_log off; log_not_found off; } location ~ /\.ht { deny all; } }


Management Interface
Online User
Account
Node ID
Action
Permission
User ID
Node ID
Action
Asterisk Account
Account
Password
Action