Unordered List
Ordered List -Normal
- One
- Two
- Three
Ordered List -start sequence changed
- One
- Two
- Three
Ordered List -Reversed
- One
- Two
- Three
Ordered List -Marker Specified "A..B..C..."
- One
- Two
- Three
Ordered List -Marker Specified Roman Numericals
- One
- Two
- Three
Description List
- Unordered List :
- Bulletin points for list items
- Ordered List :
- List with a set of sequential markers
- Description List :
- To define a term with a definition
Nested List
- One
- Two
- Three


name
<plugin name>
<name>
The goal of this documentation is to comprehensively explain Etherpad, both from a reference as well as a conceptual point of view.
Where appropriate, property types, method arguments, and the arguments provided to event handlers are detailed in a list underneath the topic heading.
Every .html
file is generated based on the corresponding
.markdown
file in the doc/api/
folder in the source tree. The
documentation is generated using the bin/doc/generate.js
program.
The HTML template is located at doc/template.html
.
Etherpad keeps track of the goings-on inside the edit machinery. If you'd like to have a look at this, just point your browser to /stats
.
We currently measure:
Under the hood, we are happy to rely on measured for all our metrics needs.
To modify or simply access our stats in your plugin, simply require('ep_etherpad-lite/stats')
which is a measured.Collection
.
Etherpad provides a multi-language user interface, that's apart from your users' content, so users from different countries can collaborate on a single document, while still having the user interface displayed in their mother tongue.
We rely on http://translatewiki.net to handle the translation process for us, so if you'd like to help...
Translate Etherpad lite interface
Fetch
Translations will be send back to us regularly and will eventually appear in the next release.
/src/locales
contains files for all supported languages which contain the translated strings. Translation files are simple *.json
files and look like this:
{ "pad.modals.connected": "Connecté."
, "pad.modals.uderdup": "Ouvrir dans une nouvelle fenêtre."
, "pad.toolbar.unindent.title": "Dèsindenter"
, "pad.toolbar.undo.title": "Annuler (Ctrl-Z)"
, "timeslider.pageTitle": "{{appTitle}} Curseur temporel"
, ...
}
Each translation consists of a key (the id of the string that is to be translated) and the translated string. Terms in curly braces must not be touched but left as they are, since they represent a dynamically changing part of the string like a variable. Imagine a message welcoming a user: Welcome, {{userName}}!
would be translated as Ahoy, {{userName}}!
in pirate.
We use a language
cookie to save your language settings if you change them. If you don't, we autodetect your locale using information from your browser. Then, the preferred language is fed into a library called html10n.js, which loads the appropriate translations and applies them to our templates. Its features include translation params, pluralization, include rules and a nice javascript API.
In the template files of your plugin, change all hardcoded messages/strings...
from:
<option value="0">Heading 1</option>
to:
<option data-l10n-id="ep_heading.h1" value="0"></option>
In the javascript files of your plugin, change all hardcoded messages/strings...
from:
alert ('Chat');
to:
alert(window._('pad.chat'));
.json
en.json
In order to avoid naming conflicts, your message keys should start with the name of your plugin followed by a dot (see below)
ep_your-plugin/locales/en.json*
 "ep_your-plugin.h1": "Heading 1"

ep_your-plugin/locales/es.json*
 "ep_your-plugin.h1": "Título 1"

Every time the http server is started, it will auto-detect your messages and merge them automatically with the core messages.
You can overwrite Etherpad's core messages in your plugin's locale files.
For example, if you want to replace Chat
with Notes
, simply add...
ep_your-plugin/locales/en.json
{ "ep_your-plugin.h1": "Heading 1"
, "pad.chat": "Notes"
}
Etherpad allows you to include your own static files in the browser, by modifying the files in static/custom
.
index.js
Javascript that'll be run in /
index.css
Stylesheet affecting /
pad.js
Javascript that'll be run in /p/:padid
pad.css
Stylesheet affecting /p/:padid
timeslider.js
Javascript that'll be run in /p/:padid/timeslider
timeslider.css
Stylesheet affecting /p/:padid/timeslider
favicon.ico
Overrides the default favicon.robots.txt
Overrides the default robots.txt
.Example:
Cut and paste the following code into any webpage to embed a pad. The parameters below will hide the chat and the line numbers.

Default: true
Default: true
Default: true
Default: false
Default: "unnamed"
Example: userName=Etherpad%20User
Default: randomly chosen by pad server
Example: userColor=%23ff9900
Default: false
Default: false
Default: en
Example: lang=ar
(translates the interface into Arabic)
Default: true Displays pad text from right to left.
The API gives another web application control of the pads. The basic functions are
The API is designed in a way, so you can reuse your existing user system with their permissions, and map it to Etherpad. Means: Your web application still has to do authentication, but you can tell Etherpad via the api, which visitors should get which permissions. This allows Etherpad to fit into any web application and extend it with real-time functionality. You can embed the pads via an iframe into your website.
Take a look at HTTP API client libraries to check if a library in your favorite programming language is available.
A portal (such as WordPress) wants to give a user access to a new pad. Let's assume the user have the internal id 7 and his name is michael.
Portal maps the internal userid to an etherpad author.
Request:
http://pad.domain/api/1/createAuthorIfNotExistsFor?apikey=secret&name=Michael&authorMapper=7
Response:
{code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif"}}
Portal maps the internal userid to an etherpad group:
Request:
http://pad.domain/api/1/createGroupIfNotExistsFor?apikey=secret&groupMapper=7
Response:
{code: 0, message:"ok", data: {groupID: "g.s8oes9dhwrvt0zif"}}
Portal creates a pad in the userGroup
Request:
http://pad.domain/api/1/createGroupPad?apikey=secret&groupID=g.s8oes9dhwrvt0zif&padName=samplePad&text=This is the first sentence in the pad
Response:
{code: 0, message:"ok", data: null}
Portal starts the session for the user on the group:
Request:
http://pad.domain/api/1/createSession?apikey=secret&groupID=g.s8oes9dhwrvt0zif&authorID=a.s8oes9dhwrvt0zif&validUntil=1312201246
Response:
{"data":{"sessionID": "s.s8oes9dhwrvt0zif"}}
Portal places the cookie "sessionID" with the given value on the client and creates an iframe including the pad.
A portal (such as WordPress) wants to transform the contents of a pad that multiple admins edited into a blog post.
Portal retrieves the contents of the pad for entry into the db as a blog post:
Request:
http://pad.domain/api/1/getText?apikey=secret&padID=g.s8oes9dhwrvt0zif$123
Response:
{code: 0, message:"ok", data: {text:"Welcome Text"}}
Portal submits content into new blog post
Portal.AddNewBlog(content)
The latest version is 1.2.13
The current version can be queried via /api.
The API is accessible via HTTP. HTTP Requests are in the format /api/$APIVERSION/$FUNCTIONNAME. Parameters are transmitted via HTTP GET. $APIVERSION depends on the endpoints you want to use.
Responses are valid JSON in the following format:
{
"code": number,
"message": string,
"data": obj
}
Authentication works via a token that is sent with each request as a post parameter. There is a single token per Etherpad deployment. This token will be random string, generated by Etherpad at the first start. It will be saved in APIKEY.txt in the root folder of Etherpad. Only Etherpad and the requesting application knows this key. Token management will not be exposed through this API.
All functions will also be available through a node module accessable from other node.js applications.
The API provides JSONP support to allow requests from a server in a different domain.
Simply add &jsonp=?
to the API call.
Example usage: http://api.jquery.com/jQuery.getJSON/
Pads can belong to a group. The padID of grouppads is starting with a groupID like g.asdfasdfasdfasdf$test
creates a new group
Example returns:
* {code: 0, message:"ok", data: {groupID: g.s8oes9dhwrvt0zif}}
this functions helps you to map your application group ids to Etherpad group ids
Example returns:
* {code: 0, message:"ok", data: {groupID: g.s8oes9dhwrvt0zif}}
deletes a group
Example returns:
{code: 0, message:"ok", data: null}
{code: 1, message:"groupID does not exist", data: null}
returns all pads of this group
Example returns:
{code: 0, message:"ok", data: {padIDs : ["g.s8oes9dhwrvt0zif$test", "g.s8oes9dhwrvt0zif$test2"]}
{code: 1, message:"groupID does not exist", data: null}
creates a new pad in this group
Example returns:
{code: 0, message:"ok", data: null}
{code: 1, message:"pad does already exist", data: null}
* {code: 1, message:"groupID does not exist", data: null}
lists all existing groups
Example returns:
{code: 0, message:"ok", data: {groupIDs: ["g.mKjkmnAbSMtCt8eL", "g.3ADWx6sbGuAiUmCy"]}}
{code: 0, message:"ok", data: {groupIDs: []}}
These authors are bound to the attributes the users choose (color and name).
creates a new author
Example returns:
* {code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif"}}
this functions helps you to map your application author ids to Etherpad author ids
Example returns:
* {code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif"}}
returns an array of all pads this author contributed to
Example returns:
{code: 0, message:"ok", data: {padIDs: ["g.s8oes9dhwrvt0zif$test", "g.s8oejklhwrvt0zif$foo"]}}
{code: 1, message:"authorID does not exist", data: null}
Returns the Author Name of the author
Example returns:
* {code: 0, message:"ok", data: {authorName: "John McLear"}}
-> can't be deleted cause this would involve scanning all the pads where this author was
Sessions can be created between a group and an author. This allows an author to access more than one group. The sessionID will be set as a cookie to the client and is valid until a certain date. The session cookie can also contain multiple comma-seperated sessionIDs, allowing a user to edit pads in different groups at the same time. Only users with a valid session for this group, can access group pads. You can create a session after you authenticated the user at your web application, to give them access to the pads. You should save the sessionID of this session and delete it after the user logged out.
creates a new session. validUntil is an unix timestamp in seconds
Example returns:
{code: 0, message:"ok", data: {sessionID: "s.s8oes9dhwrvt0zif"}}
{code: 1, message:"groupID doesn't exist", data: null}
{code: 1, message:"authorID doesn't exist", data: null}
{code: 1, message:"validUntil is in the past", data: null}
deletes a session
Example returns:
{code: 0, message:"ok", data: null}
{code: 1, message:"sessionID does not exist", data: null}
returns informations about a session
Example returns:
{code: 0, message:"ok", data: {authorID: "a.s8oes9dhwrvt0zif", groupID: g.s8oes9dhwrvt0zif, validUntil:<PHONE_NUMBER>}}
{code: 1, message:"sessionID does not exist", data: null}
returns all sessions of a group
Example returns:
{"code":0,"message":"ok","data":{"s.oxf2ras6lvhv2132":{"groupID":"g.s8oes9dhwrvt0zif","authorID":"a.akf8finncvomlqva","validUntil":2312905480}}}
{code: 1, message:"groupID does not exist", data: null}
returns all sessions of an author
Example returns:
{"code":0,"message":"ok","data":{"s.oxf2ras6lvhv2132":{"groupID":"g.s8oes9dhwrvt0zif","authorID":"a.akf8finncvomlqva","validUntil":2312905480}}}
{code: 1, message:"authorID does not exist", data: null}
Pad content can be updated and retrieved through the API
returns the text of a pad
Example returns:
{code: 0, message:"ok", data: {text:"Welcome Text"}}
{code: 1, message:"padID does not exist", data: null}
sets the text of a pad
Example returns:
{code: 0, message:"ok", data: null}
{code: 1, message:"padID does not exist", data: null}
* {code: 1, message:"text too long", data: null}
appends text to a pad
Example returns:
{code: 0, message:"ok", data: null}
{code: 1, message:"padID does not exist", data: null}
* {code: 1, message:"text too long", data: null}
returns the text of a pad formatted as HTML
Example returns:
{code: 0, message:"ok", data: {html:"Welcome Text
More Text"}}
{code: 1, message:"padID does not exist", data: null}
sets the text of a pad based on HTML, HTML must be well formed. Malformed HTML will send a warning to the API log.
Example returns:
{code: 0, message:"ok", data: null}
{code: 1, message:"padID does not exist", data: null}
returns the attribute pool of a pad
Example returns:
{ "code":0,
"message":"ok",
"data": {
"pool":{
"numToAttrib":{
"0":["author","a.X4m8bBWJBZJnWGSh"],
"1":["author","a.TotfBPzov54ihMdH"],
"2":["author","a.StiblqrzgeNTbK05"],
"3":["bold","true"]
},
"attribToNum":{
"author,a.X4m8bBWJBZJnWGSh":0,
"author,a.TotfBPzov54ihMdH":1,
"author,a.StiblqrzgeNTbK05":2,
"bold,true":3
},
"nextNum":4
}
}
}
{"code":1,"message":"padID does not exist","data":null}
get the changeset at a given revision, or last revision if 'rev' is not defined.
Example returns:
{ "code" : 0,
"message" : "ok",
"data" : "Z:1>6b|5+6b$Welcome to Etherpad!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nGet involved with Etherpad at http://etherpad.org\n"
}
{"code":1,"message":"padID does not exist","data":null}
* {"code":1,"message":"rev is higher than the head revision of the pad","data":null}
returns an object of diffs from 2 points in a pad
Example returns:
{"code":0,"message":"ok","data":{"html":"Welcome to Etherpad!

This pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!

Get involved with Etherpad at http://etherpad.org
aw

","authors":["a.HKIv23mEbachFYfH",""]}}
{"code":4,"message":"no or wrong API Key","data":null}
Restores revision from past as new changeset
Example returns: {code:0, message:"ok", data:null} {code: 1, message:"padID does not exist", data: null}
returns
start
and end
are givenExample returns:
{"code":0,"message":"ok","data":{"messages":[{"text":"foo","userId":"a.foo","time":1359199533759,"userName":"test"},{"text":"bar","userId":"a.foo","time":1359199534622,"userName":"test"}]}}
{code: 1, message:"start is higher or equal to the current chatHead", data: null}
{code: 1, message:"padID does not exist", data: null}
returns the chatHead (last number of the last chat-message) of the pad
Example returns:
{code: 0, message:"ok", data: {chatHead: 42}}
{code: 1, message:"padID does not exist", data: null}
creates a chat message, saves it to the database and sends it to all connected clients of this pad
Example returns:
{code: 0, message:"ok", data: null}
{code: 1, message:"text is no string", data: null}
Group pads are normal pads, but with the name schema GROUPID$PADNAME. A security manager controls access of them and its forbidden for normal pads to include a $ in the name.
creates a new (non-group) pad. Note that if you need to create a group Pad, you should call createGroupPad. You get an error message if you use one of the following characters in the padID: "/", "?", "&" or "#".
Example returns:
{code: 0, message:"ok", data: null}
{code: 1, message:"padID does already exist", data: null}
* {code: 1, message:"malformed padID: Remove special characters", data: null}
returns the number of revisions of this pad
Example returns:
{code: 0, message:"ok", data: {revisions: 56}}
{code: 1, message:"padID does not exist", data: null}
returns the number of saved revisions of this pad
Example returns:
{code: 0, message:"ok", data: {savedRevisions: 42}}
{code: 1, message:"padID does not exist", data: null}
returns the list of saved revisions of this pad
Example returns:
{code: 0, message:"ok", data: {savedRevisions: [2, 42, 1337]}}
{code: 1, message:"padID does not exist", data: null}
saves a revision
Example returns:
{code: 0, message:"ok", data: null}
{code: 1, message:"padID does not exist", data: null}
returns the number of user that are currently editing this pad
Example returns:
* {code: 0, message:"ok", data: {padUsersCount: 5}}
returns the list of users that are currently editing this pad
Example returns:
{code: 0, message:"ok", data: {padUsers: [{colorId:"#c1a9d9","name":"username1","timestamp":1345228793126,"id":"a.n4gEeMLsvg12452n"},{"colorId":"#d9a9cd","name":"Hmmm","timestamp":1345228796042,"id":"a.n4gEeMLsvg12452n"}]}}
{code: 0, message:"ok", data: {padUsers: []}}
deletes a pad
Example returns:
{code: 0, message:"ok", data: null}
{code: 1, message:"padID does not exist", data: null}
copies a pad with full history and chat. If force is true and the destination pad exists, it will be overwritten.
Example returns:
{code: 0, message:"ok", data: null}
{code: 1, message:"padID does not exist", data: null}
moves a pad. If force is true and the destination pad exists, it will be overwritten.
Example returns:
{code: 0, message:"ok", data: null}
{code: 1, message:"padID does not exist", data: null}
returns the read only link of a pad
Example returns:
{code: 0, message:"ok", data: {readOnlyID: "r.s8oes9dhwrvt0zif"}}
{code: 1, message:"padID does not exist", data: null}
returns the id of a pad which is assigned to the readOnlyID
Example returns:
{code: 0, message:"ok", data: {padID: "p.s8oes9dhwrvt0zif"}}
{code: 1, message:"padID does not exist", data: null}
sets a boolean for the public status of a pad
Example returns:
{code: 0, message:"ok", data: null}
{code: 1, message:"padID does not exist", data: null}
return true of false
Example returns:
{code: 0, message:"ok", data: {publicStatus: true}}
{code: 1, message:"padID does not exist", data: null}
returns ok or a error message
Example returns:
{code: 0, message:"ok", data: null}
{code: 1, message:"padID does not exist", data: null}
returns true or false
Example returns:
{code: 0, message:"ok", data: {passwordProtection: true}}
{code: 1, message:"padID does not exist", data: null}
returns an array of authors who contributed to this pad
Example returns:
{code: 0, message:"ok", data: {authorIDs : ["a.s8oes9dhwrvt0zif", "a.akf8finncvomlqva"]}
{code: 1, message:"padID does not exist", data: null}
returns the timestamp of the last revision of the pad
Example returns:
{code: 0, message:"ok", data: {lastEdited:<PHONE_NUMBER>602}}
{code: 1, message:"padID does not exist", data: null}
sends a custom message of type msg
to the pad
Example returns:
{code: 0, message:"ok", data: {}}
{code: 1, message:"padID does not exist", data: null}
returns ok when the current api token is valid
Example returns:
{"code":0,"message":"ok","data":null}
{"code":4,"message":"no or wrong API Key","data":null}
lists all pads on this epl instance
Example returns:
* {code: 0, message:"ok", data: {padIDs: ["testPad", "thePadsOfTheOthers"]}}
All hooks are called with two arguments:
A hook should always return a list or undefined. Returning undefined is equivalent to returning an empty list.
All the returned lists are appended to each other, so if the return values where [1, 2]
, undefined
, [3, 4,]
, undefined
and [5]
, the value returned by callHook would be [1, 2, 3, 4, 5]
.
This is, because it should never matter if you have one plugin or several plugins doing some work - a single plugin should be able to make callHook return the same value a set of plugins are able to return collectively. So, any plugin can return a list of values, of any length, not just one value.
Most of these hooks are called during or in order to set up the formatting process.
Called from: src/templates/pad.html
Things in context:
nothing
This hook proxies the functionality of jQuery's $(document).ready
event.
Called from: src/static/js/domline.js
Things in context:
This hook is called for elements in the DOM that have the "lineMarkerAttribute" set. You can add elements into this category with the aceRegisterBlockElements hook above. This hook is run BEFORE the numbered and ordered lists logic is applied.
The return value of this hook should have the following structure:
{ preHtml: String, postHtml: String, processedMarker: Boolean }
The preHtml and postHtml values will be added to the HTML display of the element, and if processedMarker is true, the engine won't try to process it any more.
Called from: src/static/js/domline.js
Things in context:
This hook is called for elements in the DOM that have the "lineMarkerAttribute" set. You can add elements into this category with the aceRegisterBlockElements hook above. This hook is run AFTER the ordered and numbered lists logic is applied.
The return value of this hook should have the following structure:
{ preHtml: String, postHtml: String, processedMarker: Boolean }
The preHtml and postHtml values will be added to the HTML display of the element, and if processedMarker is true, the engine won't try to process it any more.
Called from: src/static/js/domline.js
Things in context:
This hook is called for any line being processed by the formatting engine, unless the aceDomLineProcessLineAttributes hook from above returned true, in which case this hook is skipped.
The return value of this hook should have the following structure:
{ extraOpenTags: String, extraCloseTags: String, cls: String }
extraOpenTags and extraCloseTags will be added before and after the element in question, and cls will be the new class of the element going forward.
Called from: src/static/js/domline.js
Things in context:
This hook is for right after a node has been fully formatted and written to the page.
Called from: src/static/js/linestylefilter.js
Things in context:
This hook is called during the attribute processing procedure, and should be used to translate key, value pairs into valid HTML classes that can be inserted into the DOM.
The return value for this function should be a list of classes, which will then be parsed into a valid class string.
Called from: src/static/js/linestylefilter.js
Things in context: 1. Attributes - Object of Attributes
This hook is called when attributes are investigated on a line. It is useful if you want to add another attribute type or property type to a pad.
Example:
exports.aceAttribClasses = function(hook_name, attr, cb){
attr.sub = 'tag:sub';
cb(attr);
}
Called from: src/static/js/linestylefilter.js
Things in context:
This hook is called to apply custom regular expression filters to a set of styles. The one example available is the ep_linkify plugin, which adds internal links. They use it to find the telltale [[ ]]
syntax that signifies internal links, and finding that syntax, they add in the internalHref attribute to be later used by the aceCreateDomLine hook (documented above).
Called from: src/static/js/ace.js
Things in context: None
This hook is provided to allow custom CSS files to be loaded. The return value should be an array of resource urls or paths relative to the plugins directory.
Called from: src/static/js/ace.js
Things in context:
This hook is called during the creation of the editor HTML. The array should have lines of HTML added to it, giving the plugin author a chance to add in meta, script, link, and other tags that go into the
element of the editor HTML document.
Called from: src/static/js/ace2_inner.js
Things in context:
This hook is made available to edit the edit events that might occur when changes are made. Currently you can change the editor information, some of the meanings of the edit, and so on. You can also make internal changes (internal to your plugin) that use the information provided by the edit event.
Called from: src/static/js/ace2_inner.js
Things in context: None
When aceEditEvent (documented above) finishes processing the event, it scrolls the viewport to make caret visible to the user, but if you don't want that behavior to happen you can use this hook to register which edit events should not scroll viewport. The return value of this hook should be a list of event names.
Example:
exports.aceRegisterNonScrollableEditEvents = function(){
return [ 'repaginate', 'updatePageCount' ];
}
Called from: src/static/js/ace2_inner.js
Things in context: None
The return value of this hook will add elements into the "lineMarkerAttribute" category, making the aceDomLineProcessLineAttributes hook (documented below) call for those elements.
Called from: src/static/js/ace2_inner.js
Things in context:
This hook is for inserting further information into the ace engine, for later use in formatting hooks.
Called from: src/static/js/pad.js
Things in context:
Called from: src/static/js/pad_editbar.js
Things in context:
Can be used to register custom actions to the toolbar.
Usage examples:
Called from: src/static/js/timeslider.js
There doesn't appear to be any example available of this particular hook being used, but it gets fired after the timeslider is all set up.
Called from: src/static/js/pad_userlist.js
Things in context:
This hook is called on the client side whenever a user joins or changes. This can be used to create notifications or an alternate user list.
Called from: src/static/js/chat.js
Things in context:
This hook is called on the client side whenever a chat message is received from the server. It can be used to create different notifications for chat messages.
Called from: src/static/js/contentcollector.js
Things in context:
This hook is called before the content of a node is collected by the usual methods. The cc object can be used to do a bunch of things that modify the content of the pad. See, for example, the heading1 plugin for etherpad original.
E.g. if you need to apply an attribute to newly inserted characters, call cc.doAttrib(state, "attributeName") which results in an attribute attributeName=true.
If you want to specify also a value, call cc.doAttrib(state, "attributeName::value") which results in an attribute attributeName=value.
Called from: src/static/js/contentcollector.js
Things in context:
This hook is called before the content of an image node is collected by the usual methods. The cc object can be used to do a bunch of things that modify the content of the pad.
Example:
exports.collectContentImage = function(name, context){
context.state.lineAttributes.img = context.node.outerHTML;
}
Called from: src/static/js/contentcollector.js
Things in context:
This hook is called after the content of a node is collected by the usual methods. The cc object can be used to do a bunch of things that modify the content of the pad. See, for example, the heading1 plugin for etherpad original.
name
#Called from: src/static/js/collab_client.js
Things in context:
This hook gets called every time the client receives a message of type name
. This can most notably be used with the new HTTP API call, "sendClientsMessage", which sends a custom message type to all clients connected to a pad. You can also use this to handle existing types.
collab_client.js
has a pretty extensive list of message types, if you want to take a look.
Called from: src/static/js/ace2_inner.js
Things in context:
This hook is provided to allow a plugin to turn DOM node selection into [line,char] selection. The return value should be an array of [line,char]
Called from: src/static/js/ace2_inner.js
Things in context:
This hook is provided to allow a plugin to handle key events. The return value should be true if you have handled the event.
Called from: src/static/js/contentcollector.js
Things in context:
This hook allows you to validate/manipulate the text before it's sent to the server side. The return value should be the validated/manipulated text.
Called from: src/static/js/contentcollector.js
Things in context:
This hook is provided to allow whether the br tag should induce a new magic domline or not. The return value should be either true(break the line) or false.
Called from: src/static/js/linestylefilter.js
Things in context:
This hook is provided to allow whether a given line should be deliniated with multiple authors. Multiple authors in one line cause the creation of magic span lines. This might not suit you and now you can disable it and handle your own deliniation. The return value should be either true(disable) or false.
Called from: src/static/js/ace2_inner.js
Things in context:
This hook is provided to allow author highlight style to be modified. Registered hooks should return 1 if the plugin handles highlighting. If no plugin returns 1, the core will use the default background-based highlighting.
Called from: src/static/js/ace2_inner.js
Things in context:
This hook allows a plugin to react to a cursor or selection change, perhaps to update a UI element based on the style at the cursor location.
These hooks are called on server-side.
Called from: src/node/server.js
Things in context:
Use this hook to receive the global settings in your plugin.
Called from: src/static/js/pluginfw/installer.js
Things in context:
If this hook returns an error, the callback to the uninstall function gets an error as well. This mostly seems useful for handling additional features added in based on the installation of other plugins, which is pretty cool!
Called from: src/static/js/pluginfw/installer.js
Things in context:
If this hook returns an error, the callback to the install function gets an error, too. This seems useful for adding in features when a particular plugin is installed.
<plugin name>
#Called from: src/static/js/pluginfw/plugins.js
Things in context: None
This function is called after a specific plugin is initialized. This would probably be more useful than the previous two functions if you only wanted to add in features to one specific plugin.
Called from: src/node/hooks/express.js
Things in context:
This is a helpful hook for changing the behavior and configuration of the application. It's called right after the application gets configured.
Called from: src/node/hooks/express.js
Things in context:
This hook gets called after the application object has been created, but before it starts listening. This is similar to the expressConfigure hook, but it's not guaranteed that the application object will have all relevant configuration variables.
<name>
#Called from: src/node/eejs/index.js
Things in context:
This hook gets called upon the rendering of an ejs template block. For any specific kind of block, you can change how that block gets rendered by modifying the content object passed in.
Available blocks in pad.html
are:
htmlHead
- after
and immediately before the title tagstyles
- the style <link>
sbody
- the contents of the body tageditbarMenuLeft
- the left tool bar (consider using the toolbar controller instead of manually adding html here)editbarMenuRight
- right tool barafterEditbar
- allows you to add stuff immediately after the toolbaruserlist
- the contents of the userlist dropdownloading
- the initial loading messagemySettings
- the left column of the settings dropdown ("My view"); intended for adding checkboxes onlymySettings.dropdowns
- add your dropdown settings hereglobalSettings
- the right column of the settings dropdown ("Global view")importColumn
- import formexportColumn
- export formmodals
- Contains all connectivity messagesembedPopup
- the embed dropdownscripts
- Add your script tags here, if you really have to (consider use client-side hooks instead)timeslider.html
blocks:
timesliderStyles
timesliderScripts
timesliderBody
timesliderTop
timesliderEditbarRight
modals
index.html
blocks:
indexWrapper
- contains the form for creating new pads
Called from: src/node/hooks/express/specialpages.js
Things in context:
Here you can add custom toolbar items that will be available in the toolbar config in settings.json
. For more about the toolbar controller see the API section.
Usage examples:
Called from: src/node/db/Pad.js
Things in context:
This hook gets called when a new pad was created.
Called from: src/node/db/Pad.js
Things in context:
This hook gets called when an pad was loaded. If a new pad was created and loaded this event will be emitted too.
Called from: src/node/db/Pad.js
Things in context:
This hook gets called when an existing pad was updated.
Called from: src/node/db/Pad.js
Things in context:
This hook gets called when an existing pad was copied.
Usage examples:
Called from: src/node/db/Pad.js
Things in context:
This hook gets called when an existing pad was removed/deleted.
Usage examples:
Called from: src/node/hooks/express/socketio.js
Things in context:
I have no idea what this is useful for, someone else will have to add this description.
Called from: src/node/hooks/express/webaccess.js
Things in context:
This is useful for modifying the way authentication is done, especially for specific paths.
Called from: src/node/hooks/express/webaccess.js
Things in context:
This is useful for modifying the way authentication is done.
Called from: src/node/hooks/express/webaccess.js
Things in context:
This is useful for modifying the way authentication is done.
Called from: src/node/handler/PadMessageHandler.js
Things in context:
This hook will be called once a message arrive. If a plugin calls callback(null)
the message will be dropped. However it is not possible to modify the message.
Plugins may also decide to implement custom behavior once a message arrives.
WARNING: handleMessage will be called, even if the client is not authorized to send this message. It's up to the plugin to check permissions.
Example:
function handleMessage ( hook, context, callback ) {
if ( context.message.type == 'USERINFO_UPDATE' ) {
// If the message type is USERINFO_UPDATE, drop the message
callback(null);
}else{
callback();
}
};
Called from: src/node/handler/PadMessageHandler.js
Things in context:
This hook will be called once a message arrives. If a plugin calls callback(true)
the message will be allowed to be processed. This is especially useful if you want read only pad visitors to update pad contents for whatever reason.
WARNING: handleMessageSecurity will be called, even if the client is not authorized to send this message. It's up to the plugin to check permissions.
Example:
function handleMessageSecurity ( hook, context, callback ) {
if ( context.message.boomerang == 'hipster' ) {
// If the message boomer is hipster, allow the request
callback(true);
}else{
callback();
}
};
Called from: src/node/handler/PadMessageHandler.js
Things in context:
clientVars
built by the coreThis hook will be called once a client connects and the clientVars
are being sent. Plugins can use this hook to give the client a initial configuriation, like the tracking-id of an external analytics-tool that is used on the client-side. You can also overwrite values from the original clientVars
.
Example:
exports.clientVars = function(hook, context, callback)
{
// tell the client which year we are in
return callback({ "currentYear": new Date().getFullYear() });
};
This can be accessed on the client-side using clientVars.currentYear
.
Called from: src/node/utils/ExportHtml.js
Things in context:
This hook will allow a plug-in developer to re-write each line when exporting to HTML.
Example:
var Changeset = require("ep_etherpad-lite/static/js/Changeset");
exports.getLineHTMLForExport = function (hook, context) {
var header = _analyzeLine(context.attribLine, context.apool);
if (header) {
return "<" + header + ">" + context.lineContent + "</" + header + ">";
}
}
function _analyzeLine(alineAttrs, apool) {
var header = null;
if (alineAttrs) {
var opIter = Changeset.opIterator(alineAttrs);
if (opIter.hasNext()) {
var op = opIter.next();
header = Changeset.opAttributeValue(op, 'heading', apool);
}
}
return header;
}
Called from: src/node/utils/ExportHtml.js
Things in context:
This hook will allow a plug-in developer to append Styles to the Exported HTML.
Example:
exports.stylesForExport = function(hook, padId, cb){
cb("body{font-size:13.37em !important}");
}
Called from: src/static/js/linestylefilter.js
Things in context: 1. Attributes - Object of Attributes
This hook is called when attributes are investigated on a line. It is useful if you want to add another attribute type or property type to a pad.
Example:
exports.aceAttribClasses = function(hook_name, attr, cb){
attr.sub = 'tag:sub';
cb(attr);
}
Called from src/node/handler/ExportHandler.js
Things in context:
This hook will allow a plug-in developer to modify the file name of an exported pad. This is useful if you want to export a pad under another name and/or hide the padId under export. Note that the doctype or file extension cannot be modified for security reasons.
Example:
exports.exportFileName = function(hook, padId, callback){
callback("newFileName"+padId);
}
Called from src/node/utils/ExportHtml.js
Things in context:
This hook will allow a plug-in developer to include more properties and attributes to support during HTML Export. If tags are stored as ['color', 'red']
on the attribute pool, use exportHtmlAdditionalTagsWithData
instead. An Array should be returned.
Example:
// Add the props to be supported in export
exports.exportHtmlAdditionalTags = function(hook, pad, cb){
var padId = pad.id;
cb(["massive","jugs"]);
};
Called from src/node/utils/ExportHtml.js
Things in context:
Identical to exportHtmlAdditionalTags
, but for tags that are stored with an specific value (not simply true
) on the attribute pool. For example ['color', 'red']
, instead of ['bold', true]
. This hook will allow a plug-in developer to include more properties and attributes to support during HTML Export. An Array of arrays should be returned. The exported HTML will contain tags like
for the content where attributes are ['color', 'red']
.
Example:
// Add the props to be supported in export
exports.exportHtmlAdditionalTagsWithData = function(hook, pad, cb){
var padId = pad.id;
cb([["color", "red"], ["color", "blue"]]);
};
Called from src/node/handler/PadMessageHandler.js
This in context:
This hook gets called when an author leaves a pad. This is useful if you want to perform certain actions after a pad has been edited
Example:
exports.userLeave = function(hook, session, callback) {
console.log('%s left pad %s', session.author, session.padId);
};
Called from src/node/handler/PadMessageHandler.js
This in context:
This hook gets called when handling a CLIENT_READY which is the first message from the client to the server.
Example:
exports.clientReady = function(hook, message) {
console.log('Client has entered the pad' + message.padId);
};
This function replaces a range (from start
to end
) with text
.
Returns the rep
object.
Sets an attribute on current range. Example: `call.editorInfo.ace_setAttributeOnSelection("turkey::balls", true); // turkey is the attribute here, balls is the value Notes: to remove the attribute pass enabled as false
Returns a boolean if an attribute exists on a selected range.
prevChar value should be true if you want to get the previous Character attribute instead of the current selection for example
if the caret is at position 0,1 (after first character) it's probable you want the attributes on the character at 0,0
The attribute should be the string name of the attribute applied to the selection IE subscript
Example usage: Apply the activeButton Class to a button if an attribute is on a highlighted/selected caret position or range.
Example var isItThere = documentAttributeManager.getAttributeOnSelection("turkey::balls", true);
See the ep_subscript plugin for an example of this function in action. Notes: Does not work on first or last character of a line. Suffers from a race condition if called with aceEditEvent.
Returns an info object about the author. Object key = author_id and info includes author's bg color value. Use to define your own authorship.
This function replaces a range (from [x1,y1] to [x2,y2]) with newText
.
This function replaces a range (from y1 to y2) with newText
.
If you delete a line, calling this method will fix the line numbering.
Forces a return key at the current caret position.
Returns true if your passed element is registered as a block element
Returns the line's html list type.
Returns X position of the caret.
Returns Y position of the caret.
Returns the Y offset starting from [x=0,y=0]
"Z:z>1|2=m=b*0|1+1$\n"
This is a Changeset. Its just a string and its very difficult to read in this form. But the Changeset Library gives us some tools to read it.
A changeset describes the diff between two revisions of the document. The Browser sends changesets to the server and the server sends them to the clients to update them. This Changesets gets also saved into the history of a pad. Which allows us to go back to every revision from the past.
changeset
StringThis functions returns an object representaion of the changeset, similar to this:
{ oldLen: 35, newLen: 36, ops: '|2=m=b*0|1+1', charBank: '\n' }
oldLen
{Number} the original length of the document.newLen
{Number} the length of the document after the changeset is applied.ops
{String} the actual changes, introduced by this changeset.charBank
{String} All characters that are added by this changeset.ops
String The operators, returned by Changeset.unpack()
Returns an operator iterator. This iterator allows us to iterate over all operators that are in the changeset.
You can iterate with an opIterator using its next()
and hasNext()
methods. Next returns the next()
operator object and hasNext()
indicates, whether there are any operators left.
There are 3 types of operators: +
,-
and =
. These operators describe different changes to the document, beginning with the first character of the document. A =
operator doesn't change the text, but it may add or remove text attributes. A -
operator removes text. And a +
Operator adds text and optionally adds some attributes to it.
opcode
{String} the operator typechars
{Number} the length of the text changed by this operator.lines
{Number} the number of lines changed by this operator.attribs
{attribs} attributes set on this text.{ opcode: '+',
chars: 1,
lines: 1,
attribs: '*0' }
> var AttributePoolFactory = require("./utils/AttributePoolFactory");
> var apool = AttributePoolFactory.createAttributePool();
> console.log(apool)
{ numToAttrib: {},
attribToNum: {},
nextNum: 0,
putAttrib: [Function],
getAttrib: [Function],
getAttribKey: [Function],
getAttribValue: [Function],
eachAttrib: [Function],
toJsonable: [Function],
fromJsonable: [Function] }
This creates an empty apool. A apool saves which attributes were used during the history of a pad. There is one apool for each pad. It only saves the attributes that were really used, it doesn't save unused attributes. Lets fill this apool with some values
> apool.fromJsonable({"numToAttrib":{"0":["author","a.kVnWeomPADAT2pn9"],"1":["bold","true"],"2":["italic","true"]},"nextNum":3});
> console.log(apool)
{ numToAttrib:
{ '0': [ 'author', 'a.kVnWeomPADAT2pn9' ],
'1': [ 'bold', 'true' ],
'2': [ 'italic', 'true' ] },
attribToNum:
{ 'author,a.kVnWeomPADAT2pn9': 0,
'bold,true': 1,
'italic,true': 2 },
nextNum: 3,
putAttrib: [Function],
getAttrib: [Function],
getAttribKey: [Function],
getAttribValue: [Function],
eachAttrib: [Function],
toJsonable: [Function],
fromJsonable: [Function] }
We used the fromJsonable function to fill the empty apool with values. the fromJsonable and toJsonable functions are used to serialize and deserialize an apool. You can see that it stores the relation between numbers and attributes. So for example the attribute 1 is the attribute bold and vise versa. A attribute is always a key value pair. For stuff like bold and italic its just 'italic':'true'. For authors its author:$AUTHORID. So a character can be bold and italic. But it can't belong to multiple authors
> apool.getAttrib(1)
[ 'bold', 'true' ]
Simple example of how to get the key value pair for the attribute 1
> var atext = {"text":"bold text\nitalic text\nnormal text\n\n","attribs":"*0*1+9*0|1+1*0*1*2+b|1+1*0+b|2+2"};
> console.log(atext)
{ text: 'bold text\nitalic text\nnormal text\n\n',
attribs: '*0*1+9*0|1+1*0*1*2+b|1+1*0+b|2+2' }
This is an atext. An atext has two parts: text and attribs. The text is just the text of the pad as a string. We will look closer at the attribs at the next steps
> var opiterator = Changeset.opIterator(atext.attribs)
> console.log(opiterator)
{ next: [Function: next],
hasNext: [Function: hasNext],
lastIndex: [Function: lastIndex] }
> opiterator.next()
{ opcode: '+',
chars: 9,
lines: 0,
attribs: '*0*1' }
> opiterator.next()
{ opcode: '+',
chars: 1,
lines: 1,
attribs: '*0' }
> opiterator.next()
{ opcode: '+',
chars: 11,
lines: 0,
attribs: '*0*1*2' }
> opiterator.next()
{ opcode: '+',
chars: 1,
lines: 1,
attribs: '' }
> opiterator.next()
{ opcode: '+',
chars: 11,
lines: 0,
attribs: '*0' }
> opiterator.next()
{ opcode: '+',
chars: 2,
lines: 2,
attribs: '' }
The attribs are again a bunch of operators like .ops in the changeset was. But these operators are only + operators. They describe which part of the text has which attributes
For more information see /doc/easysync/easysync-notes.txt in the source.
require("ep_etherpad-lite/static/js/plugingfw/plugins")
require("ep_etherpad-lite/static/js/plugingfw/plugins").update()
will use npm to list all installed modules and read their ep.json files, registering the contained hooks.
A hook registration is a pairs of a hook name and a function reference (filename for require() plus function name)
require("ep_etherpad-lite/static/js/plugingfw/hooks").callAll("hook_name", {argname:value})
will call all hook functions registered for hook_name
with {argname:value}
.
?
src/node/utils/toolbar.js
opts
command
- this command fill be fired on the editbar on clicklocalizationId
- will be set as data-l10-id
class
- here you can add additional classes to the buttonReturns: {Button}
Example:
var orderedlist = toolbar.button({
command: "insertorderedlist",
localizationId: "pad.toolbar.ol.title",
class: "buttonicon buttonicon-insertorderedlist"
})
You can also create buttons with text:
var myButton = toolbar.button({
command: "myButton",
localizationId: "myPlugin.toolbar.myButton",
class: "buttontext"
})
opts
id
- id of the menu itemselectId
- id of the select elementcommand
- this command fill be fired on the editbar on changeReturns: {SelectButton}
data-l10n-id
)Shows the dropdown div.popup
whose id
equals dropdown
.
Register a handler for a specific command. Commands are fired if the corresponding button is clicked or the corresponding select is changed.
Creates an ace callstack and calls the callback with an ace instance (and a toolbar item, if applicable): callback(cmd, ace, item)
.
Example:
toolbar.registerAceCommand("insertorderedlist", function (cmd, ace) {
ace.ace_doInsertOrderedList();
});
Ties a div.popup
where id
equals dropdown
to a command
fired by clicking a button.
Triggers a command (optionally with some internal representation of the toolbar item that triggered it).
Etherpad allows you to extend its functionality with plugins. A plugin registers hooks (functions) for certain events (thus certain features) in Etherpad-lite to execute its own functionality based on these events.
Publicly available plugins can be found in the npm registry (see http://npmjs.org). Etherpad-lite's naming convention for plugins is to prefix your plugins with ep_
. So, e.g. it's ep_flubberworms
. Thus you can install plugins from npm, using npm install ep_flubberworm
in etherpad-lite's root directory.
You can also browse to http://yourEtherpadInstan.ce/admin/plugins
, which will list all installed plugins and those available on npm. It even provides functionality to search through all available plugins.
A basic plugin usually has the following folder structure:
ep_<plugin>/
| static/
| templates/
| locales/
+ ep.json
+ package.json
If your plugin includes client-side hooks, put them in static/js/
. If you're adding in CSS or image files, you should put those files in static/css/
and static/image/
, respectively, and templates go into templates/
. Translations go into locales/
A Standard directory structure like this makes it easier to navigate through your code. That said, do note, that this is not actually required to make your plugin run. If you want to make use of our i18n system, you need to put your translations into locales/
, though, in order to have them intergated. (See "Localization" for more info on how to localize your plugin)
Your plugin definition goes into ep.json
. In this file you register your hooks, indicate the parts of your plugin and the order of execution. (A documentation of all available events to hook into can be found in chapter hooks.)
A hook registration is a pairs of a hook name and a function reference (filename to require() + exported function name)
{
"parts": [
{
"name": "nameThisPartHoweverYouWant",
"hooks": {
"authenticate" : "ep_<plugin>/<file>:FUNCTIONNAME1",
"expressCreateServer": "ep_<plugin>/<file>:FUNCTIONNAME2"
},
"client_hooks": {
"acePopulateDOMLine": "ep_plugin/<file>:FUNCTIONNAME3"
}
}
]
}
Etherpad-lite will expect the part of the hook definition before the colon to be a javascript file and will try to require it. The part after the colon is expected to be a valid function identifier of that module. So, you have to export your hooks, using module.exports
and register it in ep.json
as ep_<plugin>/path/to/<file>:FUNCTIONNAME
.
You can omit the FUNCTIONNAME
part, if the exported function has got the same name as the hook. So "authorize" : "ep_flubberworm/foo"
will call the function exports.authorize
in ep_flubberworm/foo.js
There are server hooks, which will be executed on the server (e.g. expressCreateServer
), and there are client hooks, which are executed on the client (e.g. acePopulateDomLine
). Be sure to not make assumptions about the environment your code is running in, e.g. don't try to access process
, if you know your code will be run on the client, and likewise, don't try to access window
on the server...
As your plugins become more and more complex, you will find yourself in the need to manage dependencies between plugins. E.g. you want the hooks of a certain plugin to be executed before (or after) yours. You can also manage these dependencies in your plugin definition file ep.json
:
{
"parts": [
{
"name": "onepart",
"pre": [],
"post": ["ep_onemoreplugin/partone"]
"hooks": {
"storeBar": "ep_monospace/plugin:storeBar",
"getFoo": "ep_monospace/plugin:getFoo",
}
},
{
"name": "otherpart",
"pre": ["ep_my_example/somepart", "ep_otherplugin/main"],
"post": [],
"hooks": {
"someEvent": "ep_my_example/otherpart:someEvent",
"another": "ep_my_example/otherpart:another"
}
}
]
}
Usually a plugin will add only one functionality at a time, so it will probably only use one part
definition to register its hooks. However, sometimes you have to put different (unrelated) functionalities into one plugin. For this you will want use parts, so other plugins can depend on them.
The "pre"
and "post"
definitions, affect the order in which parts of a plugin are executed. This ensures that plugins and their hooks are executed in the correct order.
"pre"
lists parts that must be executed before the defining part. "post"
lists parts that must be executed after the defining part.
You can, on a basic level, think of this as double-ended dependency listing. If you have a dependency on another plugin, you can make sure it loads before yours by putting it in "pre"
. If you are setting up things that might need to be used by a plugin later, you can ensure proper order by putting it in "post"
.
Note that it would be far more sane to use "pre"
in almost any case, but if you want to change config variables for another plugin, or maybe modify its environment, "post"
could definitely be useful.
Also, note that dependencies should also be listed in your package.json, so they can be npm install
'd automagically when your plugin gets installed.
Your plugin must also contain a package definition file, called package.json, in the project root - this file contains various metadata relevant to your plugin, such as the name and version number, author, project hompage, contributors, a short description, etc. If you publish your plugin on npm, these metadata are used for package search etc., but it's necessary for Etherpad-lite plugins, even if you don't publish your plugin.
{
"name": "ep_PLUGINNAME",
"version": "0.0.1",
"description": "DESCRIPTION",
"author": "USERNAME (REAL NAME<EMAIL_ADDRESS>"contributors": [],
"dependencies": {"MODULE": "0.3.20"},
"engines": { "node": ">= 0.6.0"}
}
If your plugin adds or modifies the front end HTML (e.g. adding buttons or changing their functions), you should put the necessary HTML code for such operations in templates/
, in files of type ".ejs", since Etherpad uses EJS for HTML templating. See the following link for more information about EJS: https://github.com/visionmedia/ejs.
Etherpad allows you to easily create front-end tests for plugins.
%your_plugin%/static/tests/frontend/specs
Put your spec file in here (Example spec files are visible in %etherpad_root_folder%/frontend/tests/specs)
Visit http://yourserver.com/frontend/tests your front-end tests will run.
A list of all existing groups (a JSON object with groupIDs as keys and 1
as values).
Contains all information about pads
Saves a revision $REVNUM of pad $PADID
Saves a chat entry with num $CHATNUM of pad $PADID
Translates a padID to a readonlyID
Translates a readonlyID to a padID
Translates a token to an authorID
Information about an author
Maps an external application identifier to an internal group
Maps an external application identifier to an internal author
a group of pads
saves the sessions of an author


ESIEE Paris
2016/2017
- Digital Communication - Lecture TD TP graduate level
Polytech Paris-Sud
2015/2016
- Introduction to Algorithms and Coding in C/C++ - TD TP undergraduate level
- Signal Processing and Networking - TD TP undergraduate level
- Data Bases - TD undergraduate level
2014/2015
- Introduction to Algorithms and Coding in C/C++ - TD undergraduate level
- Data Bases - TD undergraduate level


{% extends 'all/base.html' %} {% load bootstrap3 %} {% load static %} {% block content %} {{block.super}}
My Categories: potrait, landscape, wildlife, automotive
Title:
Description:
Date Published:
Taken In:


http://www.susangranger.com/
Susan Granger's review of "BEAUTIFUL" (Destination Films)
Mark Twain once said, "A soiled baby with a neglected nose cannot be conscientiously regarded as a thing of beauty." As a corollary, this clumsy satire forces audiences to spend two hours with Mona Hibbard, a vain, self-centered, thoroughly disagreeable protagonist, played by Minnie Driver, in her grating quest for the Miss America-like beauty pageant crown. Mona was born in a shack in Naperville, Illinois, to white-trash parents who apparently tolerated her passion for entering beauty contests while fostering her low self-esteem. Now the mother of an illegitimate daughter, she passes off the little girl (Hallie Kate Eisenberg, instantly recognizable from Pepsi TV commercials) as the daughter of her best-friend/ room-mate (Joey Lauren Adams) - which becomes a problem when the maternal care-giver implausibly winds up in jail. And we're supposed to believe that the precocious child doesn't know who her real mother is! Jon Bernstein's manipulative, cliche-filled screenplay sinks below soap-opera, as Mona's secret could be exposed by an inquiring TV reporter (Leslie Stefanson) whose own ambitions were thwarted by Mona several years earlier in an incident involving dumping industrial-strength adhesive on her flaming, twirling baton. Actress Sally Field makes her directorial debut with this film; mercifully, she can never sink lower. Nor can Kathleen Turner, inexcusably chewing up the scenery as Mona's pageant mentor. There is one funny moment, though, when Mona sings "The Wind Beneath My Wings" to a pregnant woman about to give birth in a supermarket. On the Granger Movie Gauge of 1 to 10, "Beautiful" barely manages a shallow 2. If you're intrigued by beauty contests, rent Michael Ritchie's satirical "Smile" or the more recent "Drop Dead Gorgeous."
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


regarding breadth: why does it include some things and not others?
who said average commute should be in there?
what about when folks left for work?
what about the commuting pattern for women vets?
can they explain the differences between 1 and 5 year products?
do they know what ACS is?
do they understand what we mean by 'unemployed'?
what're they doing with it?
what do they need it for?
what brought them to the table in the first place?
| User cluster | Map needs/preferences | Table needs/preferences |
|---|---|---|
| Green | Likes the option for interactive maps, but still want source data/developer resources page | Not interested in tables |
| Lime | Map is a nice to have, but not what they’re looking for; may explore a map if easy to use | Uses tables, downloads and removes extraneous info |
| Yellow | Maps with downloadable shapefiles would be useful | Uses tables, downloads and removes extraneous info. Needs customizable tables |
| Orange | No strong need for maps | Needs customizable tables |
| Blue | Likes ability to view color coded map with their boundary of interest outlined, along side raw number, with comparison to similar places | Not interested in tables, but may contain the answer MOE, median, mean, terms like “imputed” not helpful Will copy down info needed from tables manually |
But what about the fundamental question:
Nope
CEDCAP


Migrating from springdoc-openapi v1
All the modules have been renamed.
springdoc-openapi-starter-common
integrates many spring modules support in order to hide the maximum of complexity.
It allows the support out of the box for Actuator
/ Spring Cloud Function
/ Spring Data Rest
/ Spring Native
/ Spring Hateoas
/ Spring Securtiy
/ Kotlin
/ Javadoc
.
The following table describes the main modules changes:
| springdoc-openapi-v1 | springdoc-openapi-v2 | Description |
|---|---|---|
|
|
Includes foundation |
|
|
For Spring Data Rest support |
|
|
For Groovy support |
|
|
For Spring Hateoas support |
|
|
For Javadoc support |
|
|
For Kotlin support |
|
|
For Spring Security support |
|
|
For Spring WebMvc support |
|
|
For Spring WebFlux support |
|
|
For using the Swagger-UI in a Spring WebMvc context |
|
|
For using the Swagger-UI in a Spring WebFlux context |
| classes/annotations changes |
| springdoc-openapi-v1 | springdoc-openapi-v2 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
| Migration tips |
The following modules are not anymore needed and can be removed:
-
springdoc-openapi-javadoc
-
springdoc-openapi-kotlin
-
springdoc-openapi-data-rest
-
springdoc-openapi-security
-
springdoc-openapi-webmvc-core
-
springdoc-openapi-webflux-core
-
springdoc-openapi-hateoas
-
springdoc-openapi-groovy
In addition:
-
Replace
springdoc-openapi-ui
byspringdoc-openapi-starter-webmvc-ui
-
Replace
springdoc-openapi-webflux-ui
byspringdoc-openapi-starter-webflux-ui


Matthew
J. Collins is a senior systems programmer with
the Advanced Computing and
Information Systems lab at the University of Florida. His main
project is managing the hardware infrastructure and developer
outreach for iDigBio, a
national effort to digitize natural history collections in the
US. In his spare time he advises
the Data Science and
Informatics student organization.


| Top |
A GtkPrintContext encapsulates context information that is required when drawing pages for printing, such as the cairo context and important parameters like page size and resolution. It also lets you easily create PangoLayout and PangoContext objects that match the font metrics of the cairo surface.
GtkPrintContext objects gets passed to the “begin-print”, “end-print”, “request-page-setup” and “draw-page” signals on the GtkPrintOperation.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
static void draw_page (GtkPrintOperation *operation, GtkPrintContext *context, int page_nr) { cairo_t *cr; PangoLayout *layout; PangoFontDescription *desc; cr = gtk_print_context_get_cairo_context (context); // Draw a red rectangle, as wide as the paper (inside the margins) cairo_set_source_rgb (cr, 1.0, 0, 0); cairo_rectangle (cr, 0, 0, gtk_print_context_get_width (context), 50); cairo_fill (cr); // Draw some lines cairo_move_to (cr, 20, 10); cairo_line_to (cr, 40, 20); cairo_arc (cr, 60, 60, 20, 0, M_PI); cairo_line_to (cr, 80, 20); cairo_set_source_rgb (cr, 0, 0, 0); cairo_set_line_width (cr, 5); cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); cairo_stroke (cr); // Draw some text layout = gtk_print_context_create_layout (context); pango_layout_set_text (layout, "Hello World! Printing is easy", -1); desc = pango_font_description_from_string ("sans 28"); pango_layout_set_font_description (layout, desc); pango_font_description_free (desc); cairo_move_to (cr, 30, 20); pango_cairo_layout_path (cr, layout); // Font Outline cairo_set_source_rgb (cr, 0.93, 1.0, 0.47); cairo_set_line_width (cr, 0.5); cairo_stroke_preserve (cr); // Font Fill cairo_set_source_rgb (cr, 0, 0.0, 1.0); cairo_fill (cr); g_object_unref (layout); } |
Printing support was added in GTK+ 2.10.
cairo_t *
gtk_print_context_get_cairo_context (GtkPrintContext *context
);
Obtains the cairo context that is associated with the GtkPrintContext.
Since: 2.10
void gtk_print_context_set_cairo_context (GtkPrintContext *context
,cairo_t *cr
,double dpi_x
,double dpi_y
);
Sets a new cairo context on a print context.
This function is intended to be used when implementing an internal print preview, it is not needed for printing, since GTK+ itself creates a suitable cairo context in that case.
context |
||
cr |
the cairo context |
|
dpi_x |
the horizontal resolution to use with |
|
dpi_y |
the vertical resolution to use with |
Since: 2.10
GtkPageSetup *
gtk_print_context_get_page_setup (GtkPrintContext *context
);
Obtains the GtkPageSetup that determines the page dimensions of the GtkPrintContext.
Since: 2.10
gdouble
gtk_print_context_get_width (GtkPrintContext *context
);
Obtains the width of the GtkPrintContext, in pixels.
Since: 2.10
gdouble
gtk_print_context_get_height (GtkPrintContext *context
);
Obtains the height of the GtkPrintContext, in pixels.
Since: 2.10
gdouble
gtk_print_context_get_dpi_x (GtkPrintContext *context
);
Obtains the horizontal resolution of the GtkPrintContext, in dots per inch.
Since: 2.10
gdouble
gtk_print_context_get_dpi_y (GtkPrintContext *context
);
Obtains the vertical resolution of the GtkPrintContext, in dots per inch.
Since: 2.10
PangoFontMap *
gtk_print_context_get_pango_fontmap (GtkPrintContext *context
);
Returns a PangoFontMap that is suitable for use with the GtkPrintContext.
Since: 2.10
PangoContext *
gtk_print_context_create_pango_context
(GtkPrintContext *context
);
Creates a new PangoContext that can be used with the GtkPrintContext.
Since: 2.10
PangoLayout *
gtk_print_context_create_pango_layout (GtkPrintContext *context
);
Creates a new PangoLayout that is suitable for use with the GtkPrintContext.
Since: 2.10
gboolean gtk_print_context_get_hard_margins (GtkPrintContext *context
,gdouble *top
,gdouble *bottom
,gdouble *left
,gdouble *right
);
Obtains the hardware printer margins of the GtkPrintContext, in units.
context |
||
top |
top hardware printer margin. |
[out] |
bottom |
bottom hardware printer margin. |
[out] |
left |
left hardware printer margin. |
[out] |
right |
right hardware printer margin. |
[out] |
Since: 2.20


NEWS.md
As of January 2019:
snow
and data.table
packages to suggests to quell re-occurring warnings and errors on CRAN builds.nSL
option for fitting and averaging multiple super learners as part of the estimation procedure.adapt_g
option for outcome-adaptive propensity score fitting.As of August 2019:
As of July 2019:
plyr
package.As of December 18, 2018:
returnModels
option when users input nuisance parameters.future
parallelization calls for easier debugging.As of July 2, 2018:
As of February 5, 2018:
foreach
parallelization with future
.drtmle()
fit for power users.As of December 11, 2017:


Easily create budgets, and see our suggestions based on your spending.
Track your bills like never before. Get alerts when it's time to pay so you never miss one.
Find out yours for free and get tips to help improve it, no credit card required.


Mutt-1.13.4
Introduction to Mutt
The Mutt package contains a Mail
User Agent. This is useful for reading, writing, replying to,
saving, and deleting your email.
This package is known to build and work properly using an LFS-9.1
platform.
Package Information
Mutt Dependencies
Optional
Aspell-0.60.8, Cyrus
SASL-2.1.27, GDB-9.1, GnuPG-2.2.19, GnuTLS-3.6.12,
GPGME-1.13.1, libidn-1.35,
MIT Kerberos V5-1.18, an MTA (that provides
a sendmail command),
slang-2.3.2, SQLite-3.31.1,
libgssapi,
Mixmaster, QDBM or Tokyo Cabinet
Optional (To Regenerate HTML Documentation)
libxslt-1.1.34 and either Lynx-2.8.9rel.1,
W3m, or
ELinks
Optional (To Generate PDF Manual)
docbook-dsssl-1.79, OpenJade-1.3.2,
and texlive-20190410 (or install-tl-unx with pdfjadetex installed)
User Notes: http://wiki.linuxfromscratch.org/blfs/wiki/mutt
Installation of Mutt
Mutt requires a group named
mail
. You can add this group, if it
does not exist, with this command:
groupadd -g 34 mail
If you did not install an MTA, you need to
modify the ownership of /var/mail
with this command:
chgrp -v mail /var/mail
Mutt will rebuild the html
documentation if libxslt is
present, then use that to update the text manual - even if none of
the specified browsers are present. That will create an empty text
file, so we will save the shipped file.
Install Mutt by running the
following commands:
cp -v doc/manual.txt{,.shipped} &&
./configure --prefix=/usr \
--sysconfdir=/etc \
--with-docdir=/usr/share/doc/mutt-1.13.4 \
--with-ssl \
--enable-external-dotlock \
--enable-pop \
--enable-imap \
--enable-hcache \
--enable-sidebar &&
make
To generate the PDF manual with texlive-20190410, run the following
command:
make -C doc manual.pdf
This package does not come with a test suite.
Now, as the root
user:
make install &&
test -s doc/manual.txt ||
install -v -m644 doc/manual.txt.shipped \
/usr/share/doc/mutt-1.13.4/manual.txt
If you generated the PDF manual, install it by issuing the
following command as the root
user:
install -v -m644 doc/manual.pdf \
/usr/share/doc/mutt-1.13.4
Note
If you used a DESTDIR method to only install to a temporary
location as a regular user (as part of a package menagement
process), you will need to run the following as the root
user after completing the real install:
chown root:mail /usr/bin/mutt_dotlock &&
chmod -v 2755 /usr/bin/mutt_dotlock
An info file is now installed, so you will also need to recreate
the /usr/share/info/dir
as
described when Texinfo was
installed in LFS.
Command Explanations
--enable-external-dotlock
:
In some circumstances the mutt-dotlock program is not created. This
switch ensures it is always created.
--enable-pop
: This switch
enables POP3 support.
--enable-imap
: This switch
enables IMAP support.
--enable-hcache
: This
switch enables header caching.
--enable-sidebar
: This
switch enables support for the sidebar (a list of mailboxes). It is
off by default, but can be turned on by :set sidebar_visible in mutt (and
off again with ':unset'), or it can be enabled in ~/.muttrc
.
--with-ssl
: This parameter
adds SSL/TLS support from openssl in POP3/IMAP/SMTP.
--enable-autocrypt --with-sqlite3
:
These two switches add support for passive protection against data
collection, using gnupg and gpgme (gpgme is enabled by autocrypt).
See The Manual
--enable-gpgme
: This switch enables GPG
support through the GPGME package. Use this switch if you want GPG
support in Mutt.
--enable-smtp
: This switch enables SMTP
relay support.
--with-idn2
: Use this parameter if both
libidn and libidn2 have been installed, and you wish to use libidn2
here.
--with-sasl
: This parameter adds
authentication support from Cyrus
SASL-2.1.27 in POP3/IMAP/SMTP if they are enabled. Depending on
the server configuration, this may not be needed for POP3 or IMAP.
However, it is needed for SMTP authentication.
test -s doc/manual.txt || install -v
-m644 doc/manual.txt.shipped ...: if the text
manual is now empty (libxslt is
installed, but without any of the specified text browsers), install
the saved copy after running
'make install' (which would itself empty
manual.txt if the shipped file had already been copied
back).
Configuring Mutt
Config Files
/etc/Muttrc
, ~/.muttrc
, /etc/mime.types
, ~/.mime.types
Configuration Information
No changes in these files are necessary to begin using
Mutt. When you are ready to make
changes, the man page for muttrc
is
a good starting place.
In order to utilize GnuPG, use
the following command:
cat /usr/share/doc/mutt-1.13.4/samples/gpg.rc >> ~/.muttrc
Contents
Installed Programs:
flea, mutt, mutt_dotlock, muttbug,
pgpewrap, pgpring, and smime_keys
Installed Libraries:
None
Installed Directories:
/usr/share/doc/mutt-1.13.4
Short Descriptions
|
flea
|
is a script showing where to report bugs.
|
|
mutt
|
is a Mail User Agent (MUA) which enables you to read,
write and delete your email.
|
|
mutt_dotlock
|
implements the mail spool file lock.
|
|
muttbug
|
is a script identical to flea.
|
|
pgpewrap
|
prepares a command line for the GnuPG-2.2.19 utilities.
|
|
pgpring
|
is a key ring dumper for PGP. It is not needed for
GnuPG-2.2.19.
|
|
smime_keys
|
manages a keystore for S/MIME certificates.
|
Last updated on 2020-02-17 15:32:53 -0800


--- layout: default ---
Computational Methods and Resources for Studying Religion in Culture
The REL Digital Lab is a collaborative space for digital humanities work in the Department of Religious Studies.
Located in Presidents Hall 200-A, the RELdl provides computing resources and project planning support for the department’s teaching and research contributions to the digital humanities initiatives in the College of Arts and Sciences at the University of Alabama.
Visit our Resources page for more information.
Explore the digital scholarship of the REL faculty.
Resources available for supporting digital scholarship in the study of religion.
Learn new skills and introduce students to digital methods for the humanities.


Please draw this part of a monster in progress that has been assigned to you. Hit 'Save' when you're done and see a random monster, collaboratively created by you and other artists around the world!


A friend of ours gave us 100 mg of 5-MeO-DiPT last year, and we had been waiting for the right time to present itself to indulge. At the urging of friend B, we set a date, and had our journey last night. My sig oth (D) and I are in our 40s and have had lots of psychedelics experience but mostly in our early and mid 20s (a little E in the past 3 years but not much). Our friend B is in her mid-30s and has had a lot of off-and-on experience as well. Bís friend D2 joined us, young but savvy with multiple E experiences, mostly in rave settings.
I read lots of accounts to get a feeling for the possibilities. The most valuable information (and A LOT was of value, I must say) was that nausea and other GI difficulties can arise if you donít fast or eat lightly the day of. So D and I had a little good oatmeal in the morning, I had a banana for lunch (he had nothing) and no dinner. B and D2 had light meals. I also got a good feeling for what the right dosage would be for us after reading reports.
D and I live in a really fun apartment, with many colors and playful things everywhere. We all decided this would be the best setting. We got loads of unscented votives, flowers, colorful cloths, 4 cartons of Whip-Its, and D superbly crafted an iTunes playlist; we also laid in some tasty snacks, as I had read that food on Foxy actually tastes quite good and is very enjoyable. We were all relaxed and smiley, with no real agenda except to have fun and find out what Foxy is about.
We prepared the doses (12.5 mg each) by dissolving the 100 mg into water and dividing into 8 parts. We slammed it at about 8:30 PM; it was unpleasant tasting but only lasted for a minute or so, no biggie at all. I had a brass chime for us to ring when we started feeling the drug come on. I dinged at 8:54, everyone else closely after.
As reported, we did feel some slight nausea, so we cracked open a bottle of good champagne and let the bubbles do their work. It was fun to watch the bubbles, and roundness became the theme of the evening. We started right away to enhance our physical sensations with N2O, and found throughout the experience that it is a wonderful complement to Foxy, intensifying aural and visual effects considerably. We started a nice slow peak at about 9:30; there was lots of laughter involved. We once almost started a serious conversation, but gave it up quickly. Foxy is not that drug.
We decided to gently bump at 10:25 PM, and downed 6.25 mg (dissolved in water again). We figured we would not become any more nauseous or uncomfortable w/ the bump, and indeed we did not; the initial effects had lessened but never really went away until the trip was over and done. After the bump, things started picking up and we had a terrific desire to dance and move. D put on a Bangra mix that was just the thing, beautifully complex ecstatic Middle-Eastern dance music. We spun and sweated, and D2 raver danced beautifully with lights, and it was just grand. We drifted and laughed for the next couple hours, broke out the food at about midnight and totally enjoyed every bite (we had lots of fruits, limes, pita chips and hummus, and olives).
The rest of the night passed in a lovely, inwardly outward way. We enjoyed music very, very much (Aphex Twin Selected Ambient Works Volume 2 was the highlight of the mix, scientifically designed for just this type of experience). Candles made for nice movement of the walls and ceiling. The visual effects from Foxy seemed to occur mostly on my eye-screen, and in accompaniment to music, as opposed to hallucinatory effects. The eyes-open experience was swimmy and gloopy, and absolutely connected to the increased light-gathering capabilities of our visual machinery. Very pleasant but not intense.
Outside of the easily-overlooked physical discomfort at this dosage, our Foxy night was just splendid. D and I felt very connected through the experience, but without the need to be touchy and couply. We ended the night becalmed but needing to connect physically, and it was indeed just the thing. We slept a bit, maybe 2 hours, and woke refreshed and not at all hung-over or crispy: Iíd like to emphasize what a delight it is not to lose a day after having drug-fun, as often happens (to D and I anyway) after a night of speed or E. We bounded out of bed, famished, went to breakfast, and are having a productive day. We are interested in trying this fine chemical again!
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


WITNESS LIST State Affairs Committee April 28, 2003-2:00P HB 2028 For: Zucker, Dr. Charles (Texas Faculty Association) Registering, but not testifying: For: Bacon, Tim (Texas State Teachers Association) Levy, Rick (Texas AFL-CIO) HB 2444 On: Fernandez, Jr., Ramon (Railroad Commission of Texas) Trevino, Rebecca (Railroad Commission) Registering, but not testifying: On: Ross, Charles (Railroad Commission of Texas) HB 2562 On: Allday, Martin (The Texas State Cemetery) HB 3188 For: Borel, Dennis (Coalition of Texans with Disabilities) Registering, but not testifying: For: Castillo, Yvonne (Texas Society of Architects) Levy, Rick (Texas AFL-CIO) SB 174 Registering, but not testifying: On: Owens, Debra (Texas Dept. of Health, Bureau of Vital Statistics) SB 1015 Registering, but not testifying: For: Noll, Chuck (Harris County District Attorney's Office) Rolater, John (Dallas County District Attorney's Office - Bill Hill, District Attorney) SB 1059 For: Chatron, Michael (Texas Building Branch - AGC) Cunningham, William (Special Situations Funds) Smith, Tom "Smitty" (Public Citizen) Registering, but not testifying: For: Metzger, Luke (Texas Public Interest Research Group (TexPIRG)) On: Harrison, Tom (Texas County and District Retirement System) McCabe, Martha (State Auditor's Office) Pettigrew, Karen (Office of the Attorney General) Romo, Joel (Texas Municipal Retirement System) SB 1331 For: Stagner, Steve (Texas Council of Engineering Companies) SJR 43 On: Bass, James (Texas Department of Transportation) Registering, but not testifying: Against: Gerstenschlager, MerryLynn (Self and Texas Eagle Forum) On: Behrens, Michael (Texas Department of Transportation) Jackson, Bob (Texas Department of Transportation)


Kaomoji App requires that each user in a team to individually "add" it for it to work properly for that user. If your team only allows admins to add Slack Apps, then an admin must perform the following steps to allow you to add Kaomoji App.
Then, have Melissa navigate to your team's App Management page, and click the Approve button for Kaomoji App, to move it from the Restricted Apps section to the Approved Apps section:


How to withdraw funds to the wallet?
Click on Withdraw button
Type amount of coins you would like to withdraw (leave the field blank if you want to withdraw all balance)
Insert your wallet address
Press on Withdraw button
You will see your transacrion in Withdrawal section


Example executing a repository-managed `R script`
Populate
/examples/config.json
with the proper values before running.
Open the browser's debug window to view print logs for this example.
View
documentation
for more information.


| The military have captured and imprisoned a supernatural entity. And now it wants to play. | |
| Genres: | Horror |
| Director: | Dan Turner |
| Writer: | Jason Arnopp, Dan Turner |
Cast: | Hayley Sands - Katherine Flynn Major Anthony Lester - Grant Masters Justin Rourke - Patrick Flynn Lieutenant Groves - Grahame Fox Salim Hassan - Munir Khairdin Brandon Faber - Martin Delaney Karl Matthews - James Capel Lance Corporal Rogers - Anthony Mark Streeter Dan Randall - Frankie Fitzgerald Minister Duncan McGillis - Andrew Hall Andy Duggan - Jordan Pitt Jones - Marlon Williams |


--- ---
I am a PhD Candidate in the School of Computing at Clemson University. A member of the PERSIST Research Lab, where I build and deploy new low-power wireless protocols, on-device ML models, software and hardware technologies that enable embedded networked sensor systems to operate for decades without maintenance.
My research lies at the intersection of embedded networked sensor systems, intermittent computing, and embedded machine learning. It explores new low-power wireless network solutions that are resilient to frequent and erratic power failures; common in emerging batteryless systems that operate entirely on harvested energy. My research interests span the following areas:
Ph.D. Computer Science
Clemson University, Clemson, SC, USA. 2023M.S. Computer Science
Clemson University, Clemson, SC, USA. 2019B.Sc. Computer Engineering
Obafemi Awolowo University, Ile-Ife, Nigeria. 2014(08/2021)  Received the Tapia 2021 Scholarship.
(03/2020)  Attended the Computing Research Association (CRA) Grad Cohort Workshop in Austin, March 2020.
(09/2019)  Awarded the 2019 ACM-UPE Academic Achievement Award.
(08/2019)  Presented a session on “tips for doing great research” at the National Society of Blacks in Computing (NSBC) Conference 2019, Atlanta.
(03/2019)  I was selected to participate in the Computing Research Association (CRA) Grad Cohort Workshop in Hawaii, March 2019.
(08/2018)  Visited Northwestern University, Evanston for the Cross-layer Computing Summer School: Circuits to System 2018 workshop.
(03/2018)  Attended the Computing Research Association Grad Cohort Workshop in San Diego, California.
This project leverages TensorFlow Lite to create optimized linear and DNN models for realtime inferencing on Raspberry Pi and On-board Unit (OBU) of Connected Autonomous Vehicles.
This is a wearable device prototype that inform users about their UV exposure rate. One device senses UV radiation and the other displays the UV radiation levels. The display device shows the UV index.


| 56 different keyphrases | Search | Percent |
| connor davidson resilience scale | 11 | 12 % |
| cd-risc | 5 | 5.4 % |
| connor-davidson resilience scale | 4 | 4.3 % |
| 10-item cd-risc | 3 | 3.2 % |
| connor davidson resilience scale cd risc | 3 | 3.2 % |
| resilience scales | 3 | 3.2 % |
| cd risc | 3 | 3.2 % |
| cd-risc -10 | 2 | 2.1 % |
| cd-risc measure | 2 | 2.1 % |
| the connor davidson resilience scale | 2 | 2.1 % |
| the connor-davidson resilience scale connor & davidson 2003 | 2 | 2.1 % |
| connor davidson | 2 | 2.1 % |
| resilience scale | 2 | 2.1 % |
| connor davidson resilience scale free download | 2 | 2.1 % |
| connor davidson resilience scale pdf | 2 | 2.1 % |
| connor david sonresilience scale | 2 | 2.1 % |
| resilience scale with reliability validity and full intro | 2 | 2.1 % |
| the resiliece scale | 1 | 1 % |
| connor-davidson resilience scale cd-risc pdf | 1 | 1 % |
| resilience scale for adults | 1 | 1 % |
| davidson resilience scale age range | 1 | 1 % |
| conner davidson resiliency masure | 1 | 1 % |
| conner y davidson | 1 | 1 % |
| resilience measurement scales | 1 | 1 % |
| the connor¨cdavidson resilience scale cd-risc | 1 | 1 % |
| hk014 | 1 | 1 % |
| connor davidson resilience indigenous effect size | 1 | 1 % |
| cd-risc resilience scoring | 1 | 1 % |
| measuring resilience use of the connor-davidson resilience scale for people with spinal cord injuries | 1 | 1 % |
| conner davidson resilience scale | 1 | 1 % |
| how to purchase brief resielce sca;e | 1 | 1 % |
| conner-davidson resilience scale cdrs 2003 | 1 | 1 % |
| connor â€“ davidson resilience scale cd-risc | 1 | 1 % |
| connor km davidson jrt. depression and anxiety 2003; 18 71-82 | 1 | 1 % |
| cd resilience scale with full items and intro | 1 | 1 % |
| the connor davidson resilience scale - free | 1 | 1 % |
| copyright connor davidson resilience scale | 1 | 1 % |
| the scores on the connor davidson-resilience scale cd-risc . what does that mean? | 1 | 1 % |
| cd-risc.com | 1 | 1 % |
| connor k.m. & davidson j.r.t. 2003 . development of a new resilience scale the connor-davidson resilience scale | 1 | 1 % |
| cd-risc-25 scale | 1 | 1 % |
| connor davidson 25 item resilience scale free download with intro | 1 | 1 % |
| breast cancer 2011; 11 364-368 and epub august 11. | 1 | 1 % |
| connor-davidson | 1 | 1 % |
| cd-risc-resiliency scale | 1 | 1 % |
| connor davidson resilience scale 10 item | 1 | 1 % |
| c-d resilience scale | 1 | 1 % |
| loprinzi ce prasad k schroeder ds sood a. stress management and resilience training smart program to decrease stress and enhance resilience among breast cancer survivors a pilot randomized clinical trial. clin breast cancer 2011; 11 364-368 and epub august 11. | 1 | 1 % |
| cd-risc-10 description | 1 | 1 % |
| resilience davidson connors | 1 | 1 % |
| the connor-davidson resilience scale | 1 | 1 % |
| connor-davidson resilience scale 2003 | 1 | 1 % |
| resilience scale for victims | 1 | 1 % |
| relibility and validiyty of brief resilicnce scale bysmith | 1 | 1 % |
| the connor davidson-resilience scale cd-risc . | 1 | 1 % |
| connor-davidson resilience scale cdrs 2003 | 1 | 1 % |


|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
public interface IncrementalSAXSource
IncrementalSAXSource is an API that delivers a small number of SAX events each time a request is made from a "controller" coroutine. See IncrementalSAXFilter and IncrementalSAXFilter_Xerces for examples. Note that interaction is via the deliverMoreNodes method, and therefore coroutine support is not exposed here.
| Method Summary | |
|---|---|
java.lang.Object |
deliverMoreNodes(boolean parsemore)
deliverMoreNodes() is a simple API which tells the thread in which the IncrementalSAXSource is running to deliver more events (true), or stop delivering events and close out its input (false). |
void |
setContentHandler(org.xml.sax.ContentHandler handler)
Register a SAX-style content handler for us to output to |
void |
setDTDHandler(org.xml.sax.DTDHandler handler)
Register a SAX-style DTD handler for us to output to |
void |
setLexicalHandler(org.xml.sax.ext.LexicalHandler handler)
Register a SAX-style lexical handler for us to output to |
void |
startParse(org.xml.sax.InputSource source)
Launch an XMLReader's parsing operation, feeding events to this IncrementalSAXSource. |
| Method Detail |
|---|
void setContentHandler(org.xml.sax.ContentHandler handler)
void setLexicalHandler(org.xml.sax.ext.LexicalHandler handler)
void setDTDHandler(org.xml.sax.DTDHandler handler)
java.lang.Object deliverMoreNodes(boolean parsemore)
parsemore
- If true, tells the incremental SAX stream to deliver
another chunk of events. If false, finishes out the stream.
void startParse(org.xml.sax.InputSource source) throws org.xml.sax.SAXException
org.xml.sax.SAXException
- is parse thread is already in progress
or parsing can not be started.
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


Soldier Plenos:
Here it is. It's not much, but I hope it brings you luck.
And I pray that you have better luck hunting
Dius, the Lion of Destruction
.


Appropriate for all contemporary undergraduate database management courses. Database Processing reflects a new teaching method that gets students straight to the point with its thorough and modern presentation of all the key database processing fundamentals.
Adopters
- Piedmont College
- Dallas Baptist University
- Saint Cloud State University
The Basics of Web Design: HTML5 and CSS3, Third Edition takes a unique approach to prepare students to design web pages that work today in addition to being ready to take advantage of HTML5 coding techniques of the future.
Adopters
- University of West Georgia
- Wake Forest University
- Towson University
- Edge Hill University
The Economic Way of Thinking goes beyond explaining the basic principles of micro- and macroeconomic analysis by showing students a method of reasoning that teaches them how to apply these principles as tools.
Adopters
- Rhode Island College
- Jackson State University
- Eastern Michigan University
- Mount Royl University
- University of Saskatchewan
The goal of this text is to introduce a general problem-solving approach for the beginning engineering student. Thus, Introduction to Engineering Analysis focuses on how to solve (any) kind of engineering analytical problem in a logical and systematic way.
Adopters
- Hillsdale College
- University of Alabama in Huntsville
- Georgia Southern University
- Edge Hill University
Tony Gaddis’s accessible, step-by-step presentation helps beginning students understand the important details necessary to become skilled programmers. His approach is gradual and highly accessible, ensuring that students understand the logic behind developing high-quality programs.
Adopters
- Coastal Carolina University
- University of Dayton
- Bowling Green State University


Hi guys,
i am wondering about which countries have a standard electric meter with a pulsing led.
In Italy it's a standard, and the led pulse 1 time every 1 Wh that is passing through the counter. In fact, you could find "Ra=1000 Imp/Kwh" written on it.
Also, in Italy if you have a solar plant, you have 2 electric meters, 1 for the electricity production and 1 for the electricity exchange. Is this the same also in other countries?
Thanks to anybody is going to see his/her electricity counter!!!
| Country | Led 1Imp/1Wh | # counters |
| Italy | Yes | 1 production 1 exchange |
| Finland | Yes but unaccessible | only consumption |
| UK | Yes, but not always 1 Imp / 1Wh | 1 production (50% if not measured) 1 exchange |
| Spain | Yes | 1 for both, weird rules |
| USA | depends by power utility, most disc | 1 for both |
| Romania | Yes on some meter (500 Imp/ 1kWh) | |
Re: Which countries have an eletric meter with a pulsing led ?
In Finland its mainly remote meter reading meters where signal is transmitted over GSM to electricity companies. Most of the meters can only read consumption not production. Other thing to mention is the fact that due to the popularity of electric heating all modern houses have 3phase grid connection and 3phase meters installed.
Some grid companies have installed meters that use mesh networks that operate at 868Mhz - that could be interesting to start debugging. All modern meters have a pulsing led, anyhow that may not be accessible to end user. E.g. in my house the meter is inside a sealed plastic housing where distance from plexiglass to meter led is around 5cm making remote reading impossible.
According to the law electricity companies must start buying electricity from small production , but very few does that. Current rate is around 3c/kwh where end user pays around 12c/kwh including network charges. Not really a business case to sell production, therefore hot water heating with DC only PV coupling is somewhat popular.
As 90% of meters have been changed during past couple of years to remote reading meters is very unlikely that meters that can detect production.
The good news is that due to the colder climate our production capability is at par with central europe because of PV panel production being so sensitive to outdoor temperature.
Re: Which countries have an eletric meter with a pulsing led ?
In the UK we have the best deal, one meter for overall consumption and a generation meter we are paid by the government to generate power and the power company assumes 50% is fed back to the grid thats why its beneficial to use as much of the solar power that we can as we are paid anyway, if you have a solar array above a certain size the you have to have an export meter to show whats actually going back into the grid.
Re: Which countries have an eletric meter with a pulsing led ?
Hi,
so you have a production power meter only over a certain size otherwise the producted energy is just guessed by the power company?
Do you know how much is this size?
Do you have a pulsing led on your consumption counter?
Thanks
Re: Which countries have an eletric meter with a pulsing led ?
All UK domestic meters have some high resolution indicators fitted. Older disc types have a mark on the circumference and newer ones have a pulsing LED usually, but not always, 1000 flashes per kWh.
All UK PV has a generation meter. Owners are paid for every kWh they generate at a contractual rate. In addition, if an export meter is not fitted, it is assumed 50% is exported and a very small premium is paid. If an export meter is fitted then this figure is used instead for the extra payment.
hth
Bob
Re: Which countries have an eletric meter with a pulsing led ?
The Spanish the most crazy.
currently the new digital meters are programmed as default to add the energy imported to exported, the Solar production not only give away the electric company but i will also pay for it. as consumed.
Besides that now arises the Spanish Minister put a flat tax on installed solar power.
for this reason all those have solar cells on the roof raised the removal
Of course the new digital meters installed by the electric "LOBBY" have a pulsing led on it, 1000 pulse KW/H.
Spanish is different.
Re: Which countries have an eletric meter with a pulsing led ?
In Aus (or at least the part I live in, it varies from state to state) there is one meter, but it has 2 registers: import and export. At any instant, the meter will only be counting into one register, depending on the instantaneous power direction. The LED flashes at 1 flash / WH, but only on the import register. So on a typical sunny day where your production exceeds your consumption all day long, the LED will stop flashing when the sun comes up and resume flashing when the sun goes down.
What the power company does with those two register values depends on which scheme you're on. In my case, there is a strong incentive to export (about a 2:1 price difference), so I actually need the opposite of PV-Dump. Delaying running as much stuff as possible until after the sun has gone down is best for me (but not necessarily best for the grids peak demand).
Re: Which countries have an eletric meter with a pulsing led ?
In the USA, the meters vary widely based on the local power utility. Most utilize the basic spinning disc meter that is not electronic. Some areas may have smart meters that pulse. I have an electronic meter due to my PV install, but it does not appears to flash any LED during consumption. The display flashes two kWh numbers, one for consumption and one for export. New York State is a net-metering state, requiring the utility to purchase all exported power at market rates, so I only pay for the difference between the two.
Dan
Re: Which countries have an eletric meter with a pulsing led ?
I've been in Romania where i found an electric meter with a flashing led.. (But most of them have the rotating disc...)


---
layout: post
title: Query cache in Rails
tags:
- ruby
- Technology
status: publish
type: post
published: true
meta:
_edit_last: '1'
_su_rich_snippet_type: none
dsq_thread_id: '241192562'
---
By default Rails do Query cache. Whenever it execute find
it enables the query cache.
You can enable manually by wrapping up in cache
block.
Post.cache do puts Post.first puts Post.first puts Post.first endYour development.log looks like:
Post Load (1.0ms) SELECT * FROM posts LIMIT 1 CACHE (0.0ms) SELECT * FROM posts LIMIT 1 CACHE (0.0ms) SELECT * FROM posts LIMIT 1


100% original items are available at company
Retuen within 30 days of recieving your order.
Get free delivrey for every order on more than price
Pay Online through multiple payment option (card/Net banking)
Privacy policy
Terms of Use
Return Policcy
Discount Coupons
About Us
Contact Us
Career
Affiliate
Facebook
Youtube
Linkedin
Twitter
Made withby Dounia el abbassi salma msalha


Bayelsa: Yenegoa residents say ‘we are ready’ for election
by The Eagle OnlineBarely 24 hours to the Bayelsa governorship election, some residents of Yenagoa have expressed readiness to cast votes for their preferred candidates on Saturday.
Some of the residents who spoke to News Agency of Nigeria at Ekeki Park and Fire Service Jetty in Yenagoa on Friday said they were travelling to their various voting locations.
One of them, Douye Famous, a taxi driver, said he was travelling to Tumgbo town, Sagbama Local Government Area to exercise his franchise.
Famous said his only worry was the heightening tension in some parts of the state, saying “I am praying that we will have a secure environment to participate’’.
He said: “I am leaving Yenagoa for Sagbama, I must make sure that I am at my place of registration to vote for the party of my choice.’’
Another resident, Ebi Seifaa, a civil servant said he was travelling to Kolokuma Opokuma for the election.
“As you can see, I am ready to travel to my village for the election; I am emotionally and physically ready to cast my vote.
“INEC has told us that they were ready to conduct the election, as a responsible citizen, I am also ready to do my part,’’ he said.
Speaking to NAN at the Fire Service Jetty, Inatimi Walter, a businessman, expressed optimism that the election would be hitch-free.
He said that assurances from security agencies had rekindled hopes in the people that the election would be without crisis.
Walter, an indigene of Akassa in Brass Local Government Area, said that he was travelling through water to ensure that he voted during the election.
“I will travel for a minimum of two hours on water before getting to my village; I am leaving earlier so that I will be home on time,’’ he said.
NAN reports that already, the Independent National Electoral Commission has begun the distribution of sensitive materials to the Registration Area Centres.
Previous Post
Kogi Election: Fulfil your promise to PWDs, group tells INEC


Think about the human anatomy. Our skeleton gives us our shape. Without our skeleton, all we are is
mush:
CSS on the other hand gives HTML its features. Without any features we would just be walking
skeletons... Harry (above) wouldn't have any features, any eyeballs... nothing.
So that's the difference.  No one wants
to look at a plain
white page on the internet with some words packed onto it.
In plain english, the two might seem the same. After all, they both hold data in a list like fashion.
Here's how they differ. If you want to access information from an array, the first item starts at the
zeroeth index, which means that item 1 is list item 0. Let's say we have a shopping list. To access
the first item on
the shopping list, you would type shoppingList[0].
For an object such as "Toy", it might hold a list of features for the toy, e.g. arms, legs, eyes, etc.
Each feature, for example, "arm" might hold a value representing the number of arms the toy
has, for example 8. In order for us to access the toy's arm feature to figure out how many arms
the toy has, we would use the command "toy.arms" and this would print 8.
In the simplest term, they repeat actions for you. For example, If you want to add two numbers
together you just add them, like 5 + 3. What if you needed to add 5 pairs of numbers?
20 pairs? 100 pairs? This is where functions come in. For this example we can define a certain
number, "a" and the other number "b". All you need to do is tell the function to add
a and btogether!
Control flow is just a matter of conditions. Let's think about laundry, or any
daily task you carry
out.
The first condition you want to check is "Do I have dirty clothes".
If the answer is yes (or "true" in programming)
then you need to do laundry.
Or else, you don't.
Another condition you might want to check is "is the weather sunny".If that question
evaluates
to true then
you can hang the washing outside, or else you hang it inside.
The DOM is an acronym, which stands for Document Object Model.
In order for us
to manipulate the
HTML in terms of giving it design using CSS, or giving it functionality using
JavaScript
, we need access to each part of the HTML. We want access to each header,
paragraph, image, and so on.
The DOM was created so that we could do that. The way to picture the DOM is like
a tree:
How this helps us is by typing in certain commands, we can gain access to each part of the
document, giving us
a lot of flexibility and enabling us to design each intricate part of the
web page. An example of
how we might interact with the DOM in terms of CSS is by typing
"p" to gain access to all paragraphs in the document
and making its "color" red.