text:
If you haven't already installed Tailor, you should will need to install it, as well as its dependencies:
- Download the latest version of Xcode from the App Store.
- Download and install the latest version of Tailor from this website.
Create the App
- Go to New -> Project in Xcode
- Go to "Application" under "OS X"
- Select "Tailor Application" and click "Next"
- Put in "Haberdashery" as the Product Name, and click "Next"
- Select a folder for your project, and click "Create".
Xcode will create a project with the basic structure of a Tailor app. There are
still some things that we have to add before it's ready to build. Click on
"Haberdashery" at the top of the file browser, then go to "File" ->
"Add files to Haberdashery...". Go to the folder "/Library/Frameworks", and add
"Tailor.framework" and "TailorSqlite.framework". As a sanity check, hit
⌘R to run your server. The console in Xcode will prompt you for a command.
Type "server" and hit enter, and your server should start. Open your web
browser and navigate to
localhost:8080; you should see a page that says
"File Not Found".
There are a few changes that you'll need to make before you can add any real pages. The application will print out some instructions when it starts with these steps:
First, you need to set up an encryption key for your session. All of the session data is stored in a single cookie, which is encrypted with AES to prevent snooping or forgeries. The encryption key is provided in the sessionEncryptionKey value in HaberdasheryConfiguration.swift. The logs should include a suggested value for this key.
Next, you'll need to remove some placeholder files that the template adds to create folders. The logs will tell you which files to remove.
Finally, you should remove the log statements in
main.swift that gave you
these instructions.
Building Your First Page
Now it's time to get your site to show something more interesting than an error page. Let's start off by adding a controller. You can find out more about controllers in the controller guide. The controller will be responsible for taking in requests, fetching information out of the database, running logic, and dispatching information to a template to render.
- Click on "controllers" in the file sidebar, then go to the menu and select File -> New -> "File..."
- Go to "Tailor" under "OS X", and select "Controller"
- Use "HatsController" as the name, and click "Create".
Each controller defines its own routes, inside of its
defineRoutes method.
You'll also need to update the
loadRoutes method in
HaberdasheryConfiguration.swift to add your controller methods en masse:
public func loadRoutes(inout routes: RouteSet) {
Your controller will have different methods for handling different kinds of
requests. These methods are called "actions". Create a method called
indexAction as follows:
func indexAction() {
var response = self.state.response
var template = IndexTemplate(controller: self)
response.responseCode = .Ok
Then, update the
defineRoutes method to declare this new action:
static func defineRoutes(routes: RouteSet) {
routes.withScope(path: "hats") {
routes.route(.Get(""), to: indexAction, name: "index")
This tells the routes that you want all of your controller routes to start with
hats, and that a GET request to
/hats/ should get routed to the
indexAction method. The
name parameter is used to refer to this route
when you create a link to it from another page.
This will throw a compiler error, because we haven't bothered to define the
IndexTemplate yet. Let's do that!
Go to File -> New -> Group and create a group called "views". Click the folder icon in the right-hand sidebar next to location, and create a new folder called "views" to hold the files for this group. Then create another group and folder inside of "views" called "hats".
Inside that "hats" group, create a new Swift file called "HatsIndexTemplate". Replace the contents of that file with the following:
import Tailor
extension HatsController {
struct IndexTemplate: TemplateType {
var state: TemplateState
init(controller: ControllerType) {
self.state = TemplateState(controller)
mutating func body() {
tag("html") {
tag("body") {
tag("h1") { text("Hats") }
tag("p") { text("A listing of hats will appear here soon")}
TemplateType protocol has lots of shorthands for defining tags, which you
can learn more about in the view guide. It requires that
you have a "state" variable, which contains several fields that are used in
generating your page's body. The two most important ones are
contents, which
holds the contents of the page's body, and
controller, which you use to
access the request parameters and other controller information. Though these
are stored in the
TemplateState, there are methods on the
protocol that allows you to access them directly.
Now you can run your server again and go to http://localhost:8080/hats in your browser. You should see a page with the message from the template.
Adding a Layout
Adding a layout will reduce the amount of boilerplate you have to add to your individual templates. Create a new Swift file in the views directory called "HaberdasheryLayout.swift", with the following contents:
import Tailor
struct HaberdasheryLayout: LayoutType {
var state: TemplateState
let template: TemplateType
init(controller: ControllerType, template: TemplateType) {
self.state = TemplateState(controller)
self.template = template
mutating func body() {
raw("<!DOCTYPE html>")
tag("html") {
tag("head") {
tag("link", ["rel": "stylesheet", "href": "//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"])
tag("link", ["rel": "stylesheet", "href": "//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css"])
tag("meta", ["charset": "UTF-8"])
tag("body") {
tag("div", ["class": "navbar navbar-default"]) {
tag("div", ["class": "navbar-header"]) {
tag("a", text: "Haberdashery", attributes: ["class": "navbar-brand"])
tag("div", ["class": "container"]) {
for key in ["success", "error"] {
if let message = controller.request.session.flash(key) {
tag("div", ["class": "alert alert-\(key)"]) {
tag("button", ["type": "button", "class": "close", "data-dismiss": "alert"]) { self.raw("×") }
tag("div", text: message)
tag("script", ["type": "text/javascript", "src": "//code.jquery.com/jquery-1.11.0.min.js"])
tag("script", ["type": "text/javascript", "src": "//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"])
extension ControllerType {
static var layout: LayoutType.Type { return HaberdasheryLayout.self }
This layout adds Bootstrap and jQuery, and then adds a basic Bootstrap template and renders your individual templates within it.
Next, go into the
HatsIndexTemplate and remove the
html and
body tags,
leaving just the
h1 and
p tags.
There's still a little more work to make the
index action use this new layout.
The implementation earlier shows how you would make a custom response, but there
are shorthands for most of the common response types. For an action that's
rendering a page from a template, you can pass the template right to
func indexAction() {
respondWith(IndexTemplate(controller: self))
That also wraps the HTML from the template in the layout that you've set on the controller.
Now restart your server and navigate to http://localhost:8080/hats. You should see the page with the new layout.
Building Your First Model
Lets build a model for representing hats. The first step is the create a table
in the database for them. You can do this with an alteration, which is a
one-time script that changes your configuration or database structure. Create
a folder called "alterations", and create a new file in that folder. Use the
"Alteration" file template, which will be in the Tailor section. Call the file
"CreateHatsAlteration". Update the
run method for your alteration with this:
static func run() {
"create table hats(",
"id integer primary key,",
"color varchar(255),",
"brim_size int(11)",
You should also replace the identifier to return the current date and time in a strictly numeric format. For instance, 201508181536, for 18 August 2015 at 15:36. Alterations will be run in order based on this identifier, so you'll want it to be strictly ordered by the date to make sure that they run in a consistent order.
Start your app again, and at the command prompt, type "run_alterations". It should run without complaint and create your new table.
Finally, create a new file in the models directory called "Hat", using the
Model template. Give it these contents:
import Tailor
struct Hat : Persistable {
/** The id for the record. */
let id: Int?
/** The hat's color. */
var color: String
/** The width of the hat's brim. */
var brimSize: Int
This method initializes a new hat.
:param: color The color of the hat
:param: brimSize The width of the hat's brim.
init(color: String, brimSize: Int) {
self.color = color
self.brimSize = brimSize
self.id = nil
This method initializes a record from a row in the database.
You should extract the fields that your record needs, and return nil if any
required fields are missing.
:param: databaseRow The row in the database.
required init(databaseRow: DatabaseRow) throws {
color = try databaseRow.read("color")
brimSize = try databaseRow.read("brim_size")
id = try databaseRow.read("id")
This method gets the columns that we will save in the database for a record.
You must add the mapping for your fields here.
func valuesToPersist() -> [String : DatabaseValueConvertible?] {
return ["color": color, "brim_size": brimSize]
/** The name of the table that holds posts. */
static var tableName: String { return "hats" }
/** A query for fetching hats. */
static let query = Query<Hat>()
There are four parts that every model will have, if it is persisted to the database. The first part defines the fields on the model. The second part is an initializer that sets the fields based on a row in the database. The third part gets a dictionary of values that we save on the record. The fourth part provides the name of the table that holds these records.
The initializer should throw an error if there is a missing field or a field
that is of the wrong type. In most of these methods that fetch records from the
database, these errors are caught and logged so that you do not have to litter
your code with exception handling for the rare case of a database that doesn't
match the structure of your models. The
DatabaseRow type provides a
method to help you with this. All you need to provide to this method is the name
of the column that you want to read. It infers the type from the field you are
storing the result in. It throws an error if the field is missing or of the
wrong type. If you try to store the results in an optional field, it will not
throw any errors for null values.
query method is optional, since there's a default one provided by the
Persistable protocol, but providing your own can make it cleaner to fetch
records in a type-safe way. The
Query type will be discussed more when we're
ready to fetch records.
Building Pages That Use Your Models
Now let's build some pages that work with these models. We'll start with a form
for adding a new hat. First, replace the
defineRoutes method in
HatsController with this:
static func defineRoutes(routes: RouteSet) {
routes.withScope(path: "hats") {
routes.route(.Get(""), to: indexAction, name: "index")
routes.route(.Get("new"), to: newAction, name: "new")
routes.route(.Post(""), to: createAction, name: "create")
and add a couple of new methods as placeholders for the new actions:
func newAction() {
func createAction() {
Check that everything compiles. Once all of that is working, we're ready to
build the form itself. Create a file in the
views/hats folder called
HatsFormTemplate with these contents:
import Tailor
extension HatsController {
struct FormTemplate: TemplateType {
var state: TemplateState
let hat: Hat
init(controller: ControllerType, hat: Hat) {
self.hat = hat
self.state = TemplateState(controller)
mutating func body() {
tag("h1", text: "New Hat")
let path = controller.pathFor(actionName: "create") ?? ""
tag("div", ["class": "row"]) {
tag("div", ["class": "col-md-6"]) {
form(path, type: Hat.self) { form in
form.input("color", hat.color)
form.input("brimSize", String(hat.brimSize))
form.input("submit", "Save", attributes: ["type": "submit", "class": "btn btn-primary"])
Like we did before, we're creating the new template under the
to signify that it's meant to be used for pages in that controller, and to make
it easier to invoke within that controller. This template shows a common
pattern: the template has an initializer that provides records that the template
will show. The controller is responsible for building or fetching the records
and giving them to the template. The template has access to the controller, so
it can access the request parameters and fetch records itself, but putting them
in an initializer provides better separation of concerns and makes the templates
easier to test in isolation.
This template also shows the
TemplateForm type, with provides some shorthands
for building a form and adding inputs.
Now that you have the template, you can hook it up with the controller actions.
newAction method in
HatsController should have these contents:
respondWith(FormTemplate(controller: self, hat: Hat(color: "", brimSize: 0)))
createAction method is a little more complicated:
let hat = Hat(
color: request.requestParameters["hat[color]"] ?? "",
brimSize: Int(request.requestParameters["hat[brimSize]"] ?? "") ?? 0
redirectTo(actionName: "index")
That initializer creates a hat record that hasn't been saved to the database.
save method saves a record, and returns a new copy of it that has
information that was changed in the process. For instance, that new copy will
have an
id set on it. A record can also have
createdAt and
timestamps that will be set when the record is created or saved. If the record
cannot be saved because of a database error, the method will return nil. In
this case, we're not making any use of that information, so we're just
discarding the result.
You can now run the app and use the form to create a hat, but you won't be able
to see it anywhere. Let's fix that by updating the index page. Replace the
contents of the
IndexTemplate with the following:
import Tailor
extension HatsController {
struct IndexTemplate: TemplateType {
var state: TemplateState
let hats: [Hat]
init(controller: ControllerType, hats: [Hat]) {
self.hats = hats
state = TemplateState(controller)
mutating func body() {
tag("h1") { text("Hats") }
link(actionName: "new",attributes: ["class": "btn btn-success"]) { text("New Hat") }
tag("table", ["class": "table"]) {
tag("tr") {
tag("th", text: "Color")
tag("th", text: "Brim Size")
for hat in hats {
tag("tr") {
tag("td", text: hat.color)
tag("td", text: String(hat.brimSize))
Now we need to update the
HatsController to provide the new information for
this template. Replace the contents of the
indexAction with the following:
respondWith(IndexTemplate(controller: self, hats: Hat.query.order("id", .OrderedDescending).all()))
This shows the
Query type, which allows you to build queries and fetch
records. The
query method from earlier builds an empty query, and then you can
chain together the parts of the query in a fluent interface. In this case, we're
just putting an order on it, but you can see more in the
model guide. You can now build and run the app, and add hats
to your heart's desire.
Polishing Up the Layout
The default form styles don't look good in our template, so let's apply the
Bootstrap form styles. We can do this with a custom input builder. Create a file
called "TemplateHelpers.swift" in your "views" folder, and add this extension
to the
TemplateType protocol:
import Tailor
extension TemplateType {
func buildBootstrapInput(form: TemplateForm, key: String, value: String, attributes: [String:String], errors: [ValidationError]) -> TemplateType {
var t = form.template
t.tag("div", ["class": "form-group"]) {
let attributes = merge(attributes, [
"class": "form-control",
"name": "\(form.name)[\(key)]",
"value": value
let label: String
if let type = form.modelType {
label = self.attributeName(type, key)
else {
label = ""
t.tag("label", text: label, attributes: ["class": "control-label"])
t.tag("input", attributes)
return t
Then we need to tell our form to use this method when adding inputs. In the
HatsFromTemplate file, replace the call
form(path, type: Hat.self) with
form(path, type: Hat.self, inputBuilder: buildBootstrapInput). With that
change, every time we call
form.input it will call this method to
generate the HTML for the input. We don't want to do this for the button,
though, so change the line
form.input("submit", "Save", attributes: ["type": "submit", "class": "btn btn-primary"])
form.template.tag("input", ["type": "submit", "class": "btn btn-primary", "value": "Save"]).
Now you can build and re-run your app and check out the new styles.
Adding Form Validations
We don't want people adding all kind of garbage data, so let's add some
checks on the data coming from our form. Replace the
createAction method with
the following:
func createAction() {
let hat = Hat(
color: request.requestParameters["hat[color]"] ?? "",
brimSize: request.requestParameters["hat[brimSize]"]?.toInt() ?? 0
let validation = Validation("hat")
.validate("brimSize", hat.brimSize, inBounds:1...100)
.validate(presenceOf: "color", hat.color)
if validation.valid {
redirectTo(actionName: "index")
else {
respondWith(FormTemplate(controller: self, hat: hat))
Validation class allows us to chain together different checks we want to
run on a record, and then collect the final results. In this case, it will check
that the hat's brim size is between 1 and 100, and that the hat's color is not
blank. If these conditions hold, it will save the hat and take us back to the
index page. If one of these checks fails, it will render the form again. You
can compile this and check the behavior.
It's not very user-friendly, though, because it doesn't show any errors to the
user. Let's add the errors to the form. First, we'll need a way to pass them
in to the form. Change the beginning of the
FormTemplate to read like this:
var state: TemplateState
let hat: Hat
let errors: [ValidationError]
init(controller: ControllerType, hat: Hat, errors: [ValidationError] = []) {
self.hat = hat
self.errors = errors
self.state = TemplateState(controller)
Next, update the line to render the form in
createAction to read
respondWith(FormTemplate(controller: self, hat: hat, errors: validation.errors))
Next, we need to make sure that the form builder knows about the errors. Change the call to initialize the form builder to read
form(path, type: Hat.self, inputBuilder: buildBootstrapInput, validationErrors: errors)
Now that the form knows the full list of errors, it will check them when we ask
it to build an input, and then give the input builder just the errors for the
field that we are adding. To show the errors, replace the
method with this version:
func buildBootstrapInput(form: TemplateForm, key: String, value: String, attributes: [String:String], errors: [ValidationError]) -> TemplateType {
var t = form.template
var inputClass = "form-group"
if !errors.isEmpty { inputClass += " has-error" }
t.tag("div", ["class": inputClass]) {
let attributes = merge(attributes, [
"class": "form-control",
"name": "\(form.name)[\(key)]",
"value": value
let label: String
if let type = form.modelType {
label = self.attributeName(type, key)
else {
label = ""
t.tag("label", text: label, attributes: ["class": "control-label"])
t.tag("input", attributes)
for error in errors {
t.tag("p", text: error.localize(self.controller.localization), attributes: ["class": "help-block"])
return t
You can now compile and run the app. When you try to add a hat with no color, you should now get an error message on the form.
Editing Records
Now let's add some pages for editing hats. Start out by adding these lines to
your controller, beneath the routes for the
new and
create actions:
routes.withScope(path: ":id") {
routes.route(.Get("edit"), to: editAction, name: "edit")
routes.route(.Post(""), to: updateAction, name: "update")
:id part of the route captures a part of the request path and stores it in
id request parameter.
Next, update the
IndexTemplate to add links to the edit page for each hat. The
body should now look like this:
tag("h1") { text("Hats") }
link(actionName: "new",attributes: ["class": "btn btn-success"]) { text("New Hat") }
tag("table", ["class": "table"]) {
tag("tr") {
tag("th", text: "Color")
tag("th", text: "Brim Size")
tag("td", text: "Actions")
for hat in hats {
tag("tr") {
tag("td", text: hat.color)
tag("td", text: String(hat.brimSize))
tag("td") {
link(actionName: "edit", parameters: ["id": String(hat.id ?? 0)]) { text("Edit") }
When generating the links, we have to deal with the scenario of a hat with no
id. We can either add a fallback for it or forcibly unwrap it by calling
hat.id!. The
id column is a primary key, and the hats in this table are
being retrieved from the database, so there is no way for it to be nil.
Forcibly unwrapping it should be safe. However, the
IndexTemplate cannot
guarantee this, and technically could be called with an unsaved hat in its hat
list. If we failed to unwrap it, it would crash the whole server, so it's best
to avoid forcible unwraps if at all possible. In this case, falling back to an
id of zero will just cause a 404 error later on, so it's the safer way to
handle that failure case.
The logic for updating a hat is going to be very similar to creating one, so
let's create a method that can handle either. Rename the
createAction method
createOrUpdateAction, like this:
func createOrUpdateAction(var hat: Hat) {
hat.color = request.requestParameters["hat[color]"] ?? ""
hat.brimSize = Int(request.requestParameters["hat[brimSize]"] ?? "") ?? 0
let validation = Validation("hat")
.validate("brimSize", hat.brimSize, inBounds:1...100)
.validate(presenceOf: "color", hat.color)
if validation.valid {
redirectTo(actionName: "index")
else {
respondWith(FormTemplate(controller: self, hat: hat, errors: validation.errors))
Add this method for safely fetching a hat from the request parameters:
var hat: Hat? {
if let id = Int(request.requestParameters["id"] ?? "") {
return Hat.query.find(id)
else {
return nil
And add these new action methods:
func createAction() {
self.createOrUpdateAction(Hat(color: "", brimSize: 0))
func editAction() {
guard let hat = self.hat else { render404(); return }
respondWith(FormTemplate(controller: self, hat: hat))
func updateAction() {
guard let hat = self.hat else { render404(); return }
To tie it together, we'll need to make the form connect to the update action
when editing an existing hat, or to connect to the create action when creating a
new hat. Open the
HatsController.FormTemplate and replace the line for setting
path variable with this:
let path: String
if hat.id == nil {
path = controller.pathFor(actionName: "create") ?? ""
else {
path = controller.pathFor(actionName: "update") ?? ""
Now you can recompile the app and go through the edit flows.
We don't want random people coming in and adding hats, so let's add some basic
authentication. Tailor provides a
UserType protocol to describe a model that
stores user accounts in the database and verifies passwords when someone wants
to log in. The
ControllerType protocol has some helper methods for signing in
and getting the signed in user.
The first step is adding a users table. Create a new alteration with these contents:
import Tailor
class CreateUsersAlteration : AlterationScript {
static let identifier: String = ""
static func run() {
"CREATE TABLE `users` (",
"id integer null primary key,",
"`email_address` varchar(255),",
"`encrypted_password` varchar(255)",
Make sure to fill in the identifier.
Build your app and run the
run_alterations task to create the table. This
table will have the basic fields that the
UserType protocol requires, but you
can add extra fields to your user type to add more functionality. For our
purposes here, the stock fields will do just fine.
Next, you'll need a User type that supports this protocol. Create a new file in the models folder called "User.swift" with these contents:
import Tailor
struct User: UserType{
let id: Int?
var emailAddress: String
var encryptedPassword: String
init(emailAddress: String, password: String) {
self.id = nil
self.emailAddress = emailAddress
self.encryptedPassword = PasswordHasher().encrypt(password)
init(databaseRow: DatabaseRow) throws {
self.id = try databaseRow.read("id")
self.emailAddress = try databaseRow.read("email_address")
self.encryptedPassword = try databaseRow.read("encrypted_password")
func valuesToPersist() -> [String:DatabaseValueConvertible?] {
return [
"email_address": emailAddress,
"encrypted_password": encryptedPassword
static let tableName = "users"
static let query = Query<User>()
You'll need to tell your app to use that type when fetching users by adding the
following to the
configure method in
userType = User.self
Next create a new file called
SessionsController with these contents:
import Tailor
struct SessionsController : ControllerType {
var state: ControllerState
static func defineRoutes(routes: RouteSet) {
routes.withScope(path: "sessions") {
routes.route(.Get("new"), to: newAction, name: "new")
routes.route(.Post(""), to: createAction, name: "create")
routes.route(.Get("destroy"), to: destroyAction, name: "destroy")
func newAction() {
func createAction() {
func destroyAction() {
Replace the line in the routes in
HaberdasheryConfiguration.swift that calls
addControllerRoutes with this:
routes.addControllerRoutes(SessionsController.self, HatsController.self)
We'll fill in the action methods one by one. Create a new folder in the views folder called "sessions", and add a file to it called SessionsNewTemplate. Give the file these contents:
import Tailor
extension SessionsController {
struct NewTemplate: TemplateType {
var state: TemplateState
init(controller: SessionsController) {
state = TemplateState(controller)
mutating func body() {
tag("h1", text: "Sign In")
let path = controller.pathFor(actionName: "create") ?? ""
tag("div", ["class": "row"]) {
tag("div", ["class": "col-md-6"]) {
form(path, type: User.self, inputBuilder: buildBootstrapInput) { form in
form.input("emailAddress", "")
form.input("password", "", attributes: ["type": "password"])
form.template.tag("input", ["type": "submit", "class": "btn btn-primary", "value": "Save"])
Then add this to the
newAction in
respondWith(NewTemplate(controller: self))
Let's check if we can pull up the form. Add this to the
in the
navbar section:
tag("ul", ["class": "nav navbar-nav"]) {
tag("li") {
link(SessionsController.self, actionName: "new") { text("Sign In") }
You should now be able to build and run the app. There should be a link in the
navbar to sign in, which should take you to the sign-in form. Now let's add the
logic for the
createAction method:
let emailAddress = request.requestParameters["user[emailAddress]"] ?? ""
let password = request.requestParameters["user[password]"] ?? ""
do {
let newSession = try signIn(emailAddress, password: password)
redirectTo(HatsController.self, actionName: "index", session: newSession)
catch {
respondWith(NewTemplate(controller: self))
To test this, we'll need to create a user. We can do this with a task. A task
is a script or job that can be run from the command line. Tailor provides a few
tasks, like starting the server and running alterations, but it can also be
helpful to define your own. Create a file in your project called
with these contents:
import Tailor
class ScratchTask: TaskType {
static func runTask() {
let user = User(emailAddress: "email@example.com", password: "monkey")
Now build and run your app, and type "scratch_task" at the prompt.
This will run the script and create your user. Once you run this script, you
should be able to sign in, but there won't be much of a visible effect. Let's
add a link for signing out. Replace the sign-in link by replacing the sign-in
link in
HaberdasheryLayout with this:
if controller.currentUser == nil {
link(controllerName: SessionsController.self, actionName: "new") { text("Sign In") }
else {
link(controllerName: SessionsController.self, actionName: "destroy") { text("Sign Out") }
Now after you sign in, you'll see a sign out link. Let's make that link work.
Add this to the
destroyAction in
let newSession = signOut()
redirectTo(HatsController.self, actionName: "index", session: newSession)
Now when you click the sign out link, it will sign you out and you'll see the sign in link again.
It would be nice to have more feedback for the users when they sign in and out.
We can do this with flash messages, which are one-time messages that are stored
in the session between requests. Change the redirect response in
to this:
var newSession = try signIn(emailAddress, password: password)
newSession.setFlash("success", "You are now signed in")
redirectTo(HatsController.self, actionName: "index", session: newSession)
And change the redirect response in
destroyAction to this:
var newSession = signOut()
newSession.setFlash("success", "You are now signed out")
redirectTo(HatsController.self, actionName: "index", session: newSession)
Now you'll get nice little pop-up messages when you sign in and out.
Now that we've got the authentication working, let's enforce some access rules.
We'll start by restricting access to the "New Hat" and "Edit" links to
signed-in users. Replace the body in
HatsController.IndexTemplate with:
tag("h1") { text("Hats") }
if controller.currentUser != nil {
link(actionName: "new",attributes: ["class": "btn btn-success"]) { text("New Hat") }
tag("table", ["class": "table"]) {
tag("tr") {
tag("th", text: "Color")
tag("th", text: "Brim Size")
tag("td", text: "Actions")
for hat in hats {
tag("tr") {
tag("td", text: hat.color)
tag("td", text: String(hat.brimSize))
tag("td") {
if controller.currentUser != nil {
link(actionName: "edit", parameters: ["id": String(hat.id ?? 0)]) { text("Edit") }
That's not enough, though, because they can still go directly to the URL for
editing hats. To prevent that, we'll need to add a check before the controller
actions to make sure that we have a user signed in. Rather than repeating this
code in every method that needs a user signed in, you can use a
filter. A
filter is a block of code that runs before and after a controller action. It
can check the request data and offer an alternative response without even
invoking the controller action, or provide some modification to the response
data after it comes out of the controller. One of the filters provided by the
framework is called
AuthenticationFilter. To add it to your routes, change
the logic in the
defineRoutes method in
HatsController to this:
static func defineRoutes(routes: RouteSet) {
routes.withScope(path: "hats") {
routes.route(.Get(""), to: indexAction, name: "index")
let path = routes.pathFor(SessionsController.self, actionName: "new") ?? ""
routes.withScope(filter: AuthenticationFilter(path)) {
routes.route(.Get("new"), to: newAction, name: "new")
routes.route(.Post(""), to: createAction, name: "create")
routes.withScope(path: ":id") {
routes.route(.Get("edit"), to: editAction, name: "edit")
routes.route(.Post(""), to: updateAction, name: "update")
Now if you try to access anything but the index page when not signed in, you will be redirected to the sign-in page.
Localizing your Site
You generally don't want to embed text directly into your site; instead, you should run it through a localization mechanism that will allow you to translate it for other languages and regions. Tailor assumes that text is localized by default. You can add a config file called "localization.plist" that holds mappings between localization keys and localized text. Tailor's convention is to have translation keys in lower case, with underscores to separate words and dots to separate segments of the key. In the plist file, you can have nested dictionaries for the segments, to give a more logical clustering of related keys.
Let's start by localizing some of the layout. Open up the layout template and replace the title "Haberdashery" with "haberdashery.haberdasherylayout.title". Then open up the localization plist file and go to the "en" dictionary. It should have been created with a default mapping when you created the project. Add a dictionary for "haberdashery", then for "haberdasherylayout", and create an entry in their mapping "title" to "Haberdashery". You can build and run the app now, and confirm that the title is being populated as you expect. You can do the same with the sign-in and sign-out labels, changing them to "haberdashery.haberdasherylayout.signin" and "haberdashery.haberdasherylayout.signout".
There's a convention for a shorthand for localization keys in views and
controllers. If you give a key starting with a dot, Tailor will fill in a prefix
based on the class name. For the
HatsController, it would be
"haberdashery.hatscontroller". For the
IndexTemplate in
HatsController, it
would be "haberdashery.hatscontroller.indextemplate". We're already using this
convention in the layout, so you can just shorten the keys in the template to
".title", ".signin", and ".sign_out".
You can now go in and make similar changes to the rest of the application. The
controllers will default to using English for their localization, but you can
change this by setting the
localization field on the controller.
There's plenty more things that Tailor can do, but that's all we're going to cover in this tutorial. If you want to learn more, you can check out the guides.


text:
Cannabis has a rich and full history which until only recently has been unencumbered by prohibition. Being the only plant to provide both fiber and medicine, cannabis has been in use for thousands of years. The Chinese were the first to document its medicinal properties in the year 2737 B.C., well after it had been established as fiber for making ropes and clothing. It has been proposed that cannabis was among, if not the first, plant grown by humankind as early as 8000 B.C., when the world transitioned from the final stages of the last ice age into an initial era of planned agriculture.
During the 16th Century B.C., ancient Greeks pioneered cannabis vaporization techniques. They discovered that by placing dried plants onto hot stones in enclosed steam rooms, the intoxicating and medicinal vapors could be released and inhaled. These techniques were similar to rituals found in cultures where people would meet around a fire, toss cannabis into the roaring flames, and sing and dance.
Although it is unknown exactly when cannabis arrived in Europe, unearthed artifacts have found the plant being in use as early as 500 B.C. and it's popularity in the region growing steadily from the 13th Century A.D. and onward. However its use in South Africa for medicinal and nutritional purposes far outdates European settlements. Pregnant women used to smoke cannabis before birth and it was also cooked into breads for nutritional fortification.
Cannabis is ranked fourth among most popular mind altering substances, trailing just behind caffeine, nicotine, and alcohol. The United Nations estimates that there are between 200 and 250 million cannabis users worldwide. The prohibition of cannabis within the United States has existed only within the past century, with the anti-cannabis campaigns being heavily funded by certain companies within the United States

subset: commoncrawl


text:
Blogs on travel tips
- Rochelle Rivera
- Shopaholic and Stylish Mommy of 3 with love for travel, food and life. I love to fill my life with little and large adventures.
- Everything Nice!
- A mom's musings on food, budget-friendly and family-friendly travels, shopping, fashion and all things nice!
- The Travel Archives
- See our personal travel archives to help you plan for that trip you've been wanting for so long.
- Happy Trip!
- Stories about food, travel, phototgraphy
- FAB by Carla
- Travel Tips, Travel Deals, Itinerary Guides
- Tarlaqueno Traveler
- Tarlaqueno Traveler narrates the adventures of an ordinary guy from Tarlac. While sharing his travel experiences, he hopes to be of help to others who want to explore places in the Philippines.
- Best of World Travel
- Best of World Travel is a travel blog that will show you the beauty of traveling the world. The blog will start her trip in a beautiful country call ed Philippines. Check out lots of Travel Tips and cheap itineraries!
- Weng Zaballa
- A personal blog of a full-time working mom who want to share random stories about everyday life, parenting, career, travel, and her hobbies like cooking, gardening, and DIY projects.
- The Lucky Traveler
- A travel memoir, hotel review, and travel tips blog.
- Travelocities
- a blog that encourages people to explore the world and discover new places


text:
what is the best way of getting around london and paris? are the hop on hop off bus okay or other ways can be more accessible?
Recent ActivityView all Europe activity »
- 1 Scilly Islands --Abbey Gardens --Tresco
- 2 train from Bucharest to Brasov
- 3 Towns or hikes along Lake Lucerne
- 4 How to leave Slovenia for US?
- 5 base for Andalucia
- 6 With Gratitude for a Glorious Solo Month in Greece
- 7 My bucket list first trip to Italy
- 8 Strasbourg! What to do, what to visit??
- 9 Windsor Castle
- 10 Flight from Athens to Santorini- is this enough time?
- 11 Do I Tip the Maid & How Much, Paris 3* Hotel?
- 12 Individual train tickets instead of passes
- 13 14 days in Italy. Advice needed
- 14 Ideas for 10 nights in France for 1st timer
- 15 Roadtrip: France, Belgium, Netherlands, Germany, Luxemburg
- 16 3 weeks italy itinerary
- 17 Oy, I need help with this mid Sept U.K. trip!
- 18 Tour Company reviews - European Graduation Trip
- 19 4 nights in Sardinia
- 20 Sabbioneta for day trip? ...or Verona?
- 21 help deciding between 2 itineraries!
- 22 Anthropology and Archeology for the Turkey Traveler
- 23 "Too Much Cows"
- 24 Matera tour guide wanted
- 25 Lisbon to San Sebastián to Madrid itinerary help!
Best Way To Get Around
Report Abuse
Use the metro, with which both cities are blessed and which in London is called the Underground or the Tube, and your feet, if only to get a feeling for where you are.
Report Abuse
For London transit information and maps its best to get familiar with this website: https://tfl.gov.uk/
I hate the hop on and hop off buses, especially in London. They get caught up in terrible traffic and just sit. Its more efficient and way cheaper to just figure out what you want to see and use the tube, buses or walk in some cases.
Report Abuse
The best way would be on horseback or scooter.
The cheapest way would be to walk.
The most convenient way would be a combination of The Tube, taxis, and your own two feet.
Report Abuse
In London, use the tube and bus. The HoHo is very expensive, and not convenient for getting around town.
Report Abuse
Essential tool for Paris subway (Metro), bus and streetcar travel: http://www.ratp.fr/en/ratp/c_21879/visiting-paris/
Its interactive functions will help you plan your routes. Buy a carnet of tickets (a package of 10 magnetic-strip paper tickets.) Push the ticket into a slot at the turnstile and keep it until you leave the system (there are spot checks.) No transfer between the Metro and bus lines but the regional trains, RER, are partly underground too and the ticket allows transfer with the Metro.
It is a good idea to get familiar with the RATP tool ahead of time so you will be comfortable when you arrive. Also useful: www.parisbytrain.com
Report Abuse
In London, if you use google maps for directions, public transport will appear with routes by tube and bus as well as walking and driving. You can follow the route on your smart phone as you go, including walking directions to and from the bus or tube stop. I found this extremely helpful. You should buy an oyster card at an underground station and load it with as much money as you expect to spend on transport. The buses do not accept cash, you must use a card.
In Paris, the metro routes appear on google maps, but not the bus routes. Still useful if you are not planning to use the bus.
In Paris, I ask for the free map with lines and streets (lignes et rues) from the information booth inside metro stations. I have always bought a carnet, or package of ten tickets, and bought more as needed, as described above.
There are taxis in both cities, and on my last trip I made use of Uber for the first time with excellent results.
Report Abuse
Here's a hint -- take the ££ and €€ you would have spent on the H-o-H-o buses and add that to your hotel budget. Believe me, if you can only afford £50-£60 per night in London, you can't afford the £25+ per person for the H-o-H-o. . . .
Report Abuse
I would use the metro and buses in Paris, also, if the goal really is just to get around, not to have an excursion. The bus takes a long time and sometimes waits in spots for a while. I took it once just for fun as it was a fine day and I liked the views in some areas, and I wasn't in a hurry, but it isn't really efficient if the main goal is to get around quickly. Of course it isn't always their fault, I presumed some spots they had to wait due to the schedule, or just were supposed to, but the traffic ios very bad in the real central area, so that slows them a lot. You could have walked just as quickly in some places (like around Opera, as I recall).
Report Abuse
Hi drmsms,
In Paris, I prefer using the busses. Yes, the metro might be faster, but it's not nearly as pleasant as the bus. The bus takes you through neighborhoods you might not otherwise visit (once I retraced my steps on foot to find a shop I had passed on the bus), and of course you always get views of beautiful Paris during the ride.
The metro usually involves a lot of steps and some walking, especially if you have to change lines.
Using the bus isn't as intuitive as the metro is, but it's not really difficult to learn. Just download the ratp app on your smart phone, and study the map of the bus lines. Figure out which lines are near your hotel and which lines pass the places you want to see. Then use the map of the bus line to see exactly where the bus stop is -- you can drill down on the map.
Have fun as you plan!
Report Abuse
in London the no 11 bus will take you from Victoria, along to Parliament Square, up Whitehall, round Trafalgar Square, along the Strand, round the Aldwych and past Temple Bar, along Fleet Street, up Ludgate Hill and past St Pauls - and beyond.
for the price of a one day travel pass you can hop on and off to your heart's content.
no need for an expensive HOHO bus.
Report Abuse
HoHo buses are tours - not transit. They are very expensive and don't run very often (you may wait 30 minutes for the next bus versus 5 minutes for a local bus or tube/Metro).
For shorter distances just walk - and get a feeling for the city - for longer distances around London use the tube and for Paris the Metro. there are stations everywhere, they're much faster and much less expensive.
Report Abuse
thank you guys for the feedback. very much appreciated.
janisj , I will try my best. money a bit tight and I am not targetting to stay in 5 4 star hotel. i hope you understand.
Report Abuse
>>I am not targetting to stay in 5 4 star hotel. i hope you understand.<<
Most Fodorites also don't stay in 4 and 5 star hotels. It is just that your budget - especially for London - is totally inadequate. You are not going to find a triple room for £50. And if you do it will not be a 4 star -- it won't be a 2 star, it won't even be a 1 star.
Report Abuse
ok thank you . much appreciated.
Report Abuse
See the post I just did on your other thread . . . I did a hotel search for your dates on londontown.com . . .
Report Abuse
You can use the Metro. It is one of the most convenient ways to get around the country. I'd also recommend having a road map of the city to have detailed insight about all the streets, hotels, and important places.
Report Abuse
Just adding what many others are saying:
Metro/Tube and buses are the way to go...with lots of walking.
London has many double-decker buses that make for great sightseeing while moving about the city. It's tube system is fantastic. Within the center of the city, you'll never have to wait more than 2 or 3 minutes for a train...unless there is a problem on the tracks.
Paris is a little more compact than London, so you'll probably walk more. The Metro system is also excellent.
You didn't say how many days in each city. Both have 7-day passes that can be worthwhile.
London - one-week "Travelcard: for zones 1 & 2 where nearly all major sights are costs £32.40 for 2016.
Paris - also has a 7-day "Passe Navigo Découverte" card, but it only goes from Mon-Sun...not any seven consecutive days. It costs 21.25€ and now (I think) includes zones 1-5...pretty much all of the sights.
Do the math based on your likely number of trips over the course of your visit--as well as the convenience of not having to buy/use individual tickets. We use metro/tube/buses a lot, so usually it's worth it for us if our stay is four days or more. Your "mileage" may vary.
Report Abuse
Another tip:
As long as you know at what tube/Metro stop your hotel is, it's pretty hard to get lost in the center of either city.
Bus stops generally have line maps posted. In London many also have "Spider Maps"...which show line maps radiating out form that stop for every line. You can also download all the spider maps near your hotel from the TFL website:
For instance, here's a list of the spider maps in the Westminster area:
The Paris RATP website has individual line maps to download...though you have to know the line number:
When all else fails, just jump on any bus and keep your eye out the window for a tube/Metro sign. In the city center, it won't be more than a few minutes' ride. Once inside the tube/Metro system, the posted maps will get you back to your hotel...or anywhere else you want to go.
There are also phone apps available with real-time info.
Report Abuse
The official (and free) RATP Visitor app is very good. The route finder feature works even when offline.
Sign in to comment.


text:
Originally Posted by blueberry
You Better Watch Out
You better not cry
MPP is telling Lies
MPP is Coming to town
They know when you've been smoking
They know when you awake
They're coming to steal your weed
So there won't be any wake and bake
They're pitching a bill
They're pitching it right
They're telling them lies
So the price of weed Will be out of site
MPP is coming to town
Originally Posted by blueberry
Any legislation that hurts any citizen or diminishes any rights will be viewed by history in its proper light. The governments job is not to limit freedom but to facilitate it. The difference between tyrants and patriots is , Patriots defend the people and their rights. Tyrants seek to gain power and impose their will. Tyrants should note that history deals harshly with those who put themselves above the people.
These bills are unfair. Though they do not criminalize personal grows for the moment, they in fact make it economically impossible for caregivers to survive. In fact in just a few months, if left unchecked, the legislature will further tighten regulations on personal grows. Michigan has a corrupt government that does not care for the wellbeing of its citizens(Please reference Flint Water). A Rep or Senator can be bought for just a few bucks. That is evident from the text of the new bills, which
Originally Posted by blueberry
Voters rejected a similar measure to MILegalize recently in Ohio. The reason, it would make a few people rich, while denying the people who built the industry, any compensation or future. No matter how yopu look at it the MIegalize is just another attempt by the former MACC to take over marijuana in Michigan. There are many reasons we as a community should reject this initiative, the main one being that its principles have been behind many of the raids and most of the restrictive legislation
Originally Posted by restlesslegs
Phytocannabinoids, their boiling points, and properties
?-9-tetrahydrocannabinol (THC)
Boiling point: 157*C / 314.6 degree Fahrenheit
Properties: Euphoriant, Analgesic, Antiinflammatory, Antioxidant, Antiemetic
cannabidiol (CBD)
Boiling point: 160-180*C / 320-356 degree Fahrenheit
Properties: Anxiolytic, Analgesic, Antipsychotic, Antiinflammatory, Antioxidant, Antispasmodic
Cannabinol (CBN)
Boiling point: 185*C


text:
Residential Volunteer Opportunities in Ireland.
South Dublin County Volunteer Centre
The Barretstown CAMP FUND LTD
Barretstown Castle
Ballymore Eustace
Co Kildare
telephone: (045) 864 115
facsimile: (045) 864 197
Barretstown provides a medically endorsed programme of arts, adventure and fun activities
for children serious illnesses. By facing new challenges in a supportive environment, these
children rediscover their self-esteem, improve their self- image and find new skills to help
cope with their illness - all adding up to 'serious fun'. Volunteers are needed for periods of
up to 12 days from spring to autumn to organise and participate in a range of activities anto-
day care.
Camphill Communities of Ireland
Camphill is an international movement working with children,adolescents and adults with
special needs. Camphill seeks to promote caring, life sharing communities where people of
all abilities choose to live, learn and work together, recognising the unique contribution made
by each person. Each community has its own distinctive purpose and character. Volunteers
who wish to get fully involved in the life of the community on a long-term basis are
encouraged to apply.
Camphill Community Ballybay
Robb Farm, Corraskea
Ballybay , Co Monaghan
telephone: (042) 974 8197
BALLYBAY: Founded in 1993, this is a small rural border community of adults. There are 3
main houses offering a warm home environment. Much of the work is land based and there
is also a weavery, candle workshop and bakery. It is well integrated into the local
Camphill Community Ballytobin
Co Kilkenny
telephone: (056) 7725114
facsimile: (056) 7725849
BALLYTOBIN: Established in 1979, this is a large and dynamic community whose main
focus is trying to meet the needs of special children. Included in the facilities are family-
centred houses, farm, garden, renewable energy centre, school, therapy buildings and
social/cultural hall.
The Bridge Camphill Community
Main Street
Co Kildare
telephone: (045) 481 597
BRIDGE: Founded in 1991 as a mid-size integrated urban community with 4 houses.
Working life is centred on a busy coffee and craft shop, market garden, fresh food outlet and
weaving workshop. Local support is good. Development plans for an associated rural
community are afoot.
Camphill Community Callan
The Granary
Bridge Street
Co Kilkenny
telephone: (056) 775 5880
CALLAN: From modest beginnings in 2001, this community is developing on 3 sites, both
urban and rural. One emphasises responses to the needs of adults with challenging
behaviour. The initiatives are strongly integrated with the community development efforts of
the town.
Carrick-on-Suir Camphill Community
Castle Street
Co Tipperary
telephone: (051) 645 080
CARRICK-ON-SUIR: Started in 1996 as a medium- sized urban community, offering a variety
of living and working opportunities to its adult members. Common work activities include
home care, life skills, farming, gardening, weaving, leather crafts, Cultural and recreational
life is shared closely with the local community.
Camphill Community Dingle
Co Kerry
telephone: (066) 9152841
DINGLE: Camphil Community Dingle is a small, rural community with adults with special needs. It is part of the Camphill communities of Ireland. It started at the end of September 04.
Camphill Village Community Duffcarrig
Co Wexford
telephone: (053) 9425911
DUFFCARRIG: Established in 1972 as a working community for adults with a variety of
emotional disturbances, mental and physical disabilities, living in 7 family-like households.
There is a laundry, craft workshops, bio-dynamic farm and garden and there are plans for a
tea and coffee house. In this large community there are an increasing number of older
Dunshane Camphill Community
Co Kildare
telephone: (045) 483 628
DUNSHANE: Established in 1995 as a centre for young adults, either living its 3 houses or
attending on a daily basis. A beautiful courtyard is at the heart of the cultural and therapeutic
life of the mid- sized community, which also has craft workshops and a small farm/garden.
Grangemockler Camphill Community
Temple Michael - Grangemockler
Co Tipperary
telephone: (051) 647 202
facsimile: (051) 647 253
GRANGEMOCKLER: Founded in 1988 and now a thriving community of some 50 people,
oriented around the land and the environment. There are 4 life sharing house communities
and several day places. The social and cultural life is modest and occasionally exhilarating.
Camphill Community Greenacres
1A Farmhill Park
Goatstown, Dublin 14
telephone: (01) 298 7618
GREENACRES: This is a small new community in an urban setting, focusing on integrating
the ecological, social, economic and spiritual aspects of life. The large house and garden
plays host to numerous courses and cultural activities and is also
used by members of other communities looking for a city break.
KCAT Art and Study Centre
Mill Lane
Co Kilkenny
telephone: (056) 7755115
KCAT: Kilkenny Collective for Arts Talent was founded in 1996 to facilitate the artistic
development of individuals with a range of disabilities. The centre aims to create an
environment in which artists and students from different backgrounds can work together as
creative equals.
Camphill Community Kyle
Co Kilkenny
telephone: (056) 7725737
KYLE: This is a medium sized community with 3 main houses and a small unit for a person in
care. There are a variety of workshops, farm, garden, weavery, bakery, pottery and wood
workshop. Much work is house based geared towards the individual needs of people. There
is an active evening and weekend social life.
Camphill in Thomastown
Jerpoint House,
Thomastown, Co Kilkenny
telephone: (056) 775 4132
facsimile: (056) 775 4286
The Watergarden,
Co Kilkenny
telephone: (056) 772 4690
THOMASTOWN: This small adult residential community is based in Jerpoint, some 4 km
from the town, living in 2 main households with farm, garden, food-processing workshop
and candle workshop. It is complemented by The Watergarden, an all-ability coffee shop,
gift shop and garden centre (plus pottery and basket workshop) fully integrated with the local
community. There is also a project to support people with special needs.
CASA Breakhouses
(Caring And Sharing Association)
15 Ard na Mara
Co Dublin
telephone: (01) 845 4841
CASA runs 2 break houses in Dublin, offering respite care to people with disability. CASA
aims to provide a friendly, family-like atmosphere, where members with disability and
volunteers partake in daily activities and social outings together. CASA
requires both short and long term volunteers, from 2 months to 1 year.
Cheshire Ireland
Central Office
Block 4 Bracken Business Park
Bracken Road
Sandyford Industrial Estate
Dublin 18
telephone: (01) 297 4100
facsimile: (01) 205 2060
Cheshire Ireland provides supported accommodation, respite and community services to
adults with physical disabilities. We currently operate 18 centres around the country with
new accommodation and respite services in the course of development. The Cheshire ethos
is one of supporting people in their individual choices as to how they lead their lives. There
are many opportunities to become a volunteer within Cheshire Ireland.
Friends of the Elderly
25 Bolton Street, Dublin 1
telephone: (01) 873 1855
facsimile: (01) 873 1617
Friends of the Elderly is part of the international federation of The Little Brothers. It provides
full- time internships (normally for international volunteers) of 1 year on behalf of older
Glencree Centre for Peace and Reconciliation
near Enniskerry , Co Wicklow
telephone: (01) 282 9711
facsimile: (01) 276 6085
This autonomous organisation seeks to work together with those trying to build peace.
Volunteers usually come to Glencree for a year, starting in September, and undertake both
practical work (in kitchen and garden etc.) as well as programme work on peace issues and
with community groups. Shorter placements, including weekends, can be arranged.
Irish Wildlife Trust
Sigmund Business Centre
93a Lagan Road
Dublin Industrial Estate
Glasnevin, Dublin 11
telephone: (01) 860 2839
facsimile: (01) 830 8914
Groundwork, a branch of the Irish Wildlife Trust, runs conservation work camps for
volunteers aged 18 and over (due to insurance restrictions) in national parks in Killarney National Park. Work involves clearing non-native rhododendron from ancient woodlands.
Camps run between June and September; the cost of accommodation and food. Stipend of €30 per week.
JVC - Jesuit Volunteer Communities
20 Upper Gardiner Street
Dublin 1
telephone: (01) 8880606/ 086 124 3836
facsimile: (01) 855 5624
JVC offers volunteers the opportunity to work with marginalised members of society
including young people at risk, homeless and disabled people, and those with addiction
problems and HIV/AIDS. Volunteers make a 10 month commitment (September to June) and
need to be open to the 4 values of JVC: simple lifestyle, community, exploring faith and
working for justice.
Kingsriver Community
Co Kilkenny
telephone: (056) 772 8287
facsimile: (056) 772 8287
This small community looks for volunteers who are able to commit a minimum of 6 months
to caring for its 6 disabled residents; cooking, organic gardening, light maintenance, crafts
and organising. The community also provides training and supported employment for non-
residential people.
L'Arche Ireland is part of an international organization founded by Jean Vanier. L'Arch is
both a faith community and a voluntary agency that provides a support service for people
with intellectual disabilities. At the core of L'Arche is the relationship between persons who
have intellectual disabilities and those who choose to support them in Community. L'Arche
believes that this relationship is one that is mutually transformative, a sign of hope and a
powerful witness in our world. In addition to communities in Kilkenny, Cork, Dublin, there is
one in Belfast in Northern Ireland.
L'Arche Ireland
Cluain Aoibhinn
Fairgreen Lane
Co. Kilkenny
telephone: (056) 772 5283
facsimile: (056) 772 5538
L'Arche Cork
Le Cheile, Togher, Cork
telephone: (021) 431 8880
facsimile: (021) 431 8883
L'Arche Dublin
8 Warrenhouse Road
Baldoyle, Dublin 13
telephone: (01) 839 4356
facsimile: (01) 839 5897
L'Arche Kilkenny
Cluain Aoibhinn,
Fairgreen Lane, Callan, Co Kilkenny
telephone: (056) 772 5628
facsimile: (056) 772 5946
Simon Communities of Ireland
28-30 Exchequer Street , Dublin 2
telephone: (01) 671 1606
Dublin Simon Community
P.O. Box 581,
Dublin 1
telephone: (01) 671 5551
facsimile: (01) 671 5524
Simon has communities in Cork, Dublin, Dundalk and Galway, providing emergency shelters
and long- term residential houses for homeless people. Full- time voluntary workers (over 18)
are required for a minimum of 3 months to undertake work, which can be demanding, both
emotionally and physically. Volunteers from abroad must have excellent spoken English.
Cork Simon Community
PO Box: 76
telephone: (021) 432 1166
facsimile: (021) 432 1349
Dundalk Simon Community
Seatown House
Seatown Place,
Co. Louth
telephone: (042) 933 9583
facsimile (042) 933 9583
Galway Simon Community
Unit 18 Tuam Road Centre
Tuam Road,
telephone: (091) 381 828
Society of St Vincent de Paul
91/92 Sean MacDermot Street
The Sunshine Fund
4th Floor SVP House
Dublin 1
telephone: (01) 819 8433
SVP organises holidays for underprivileged children and young people from the Dublin area.
Voluntary 'stewards' are required during the summer months for the week-long Sunshine
House Holidays in Balbriggan, Co Dublin, and the Teenhols at an outdoor educational centre
in Birr, Co Offaly.
Voluntary Service International
30 Mountjoy Square
Dublin 1
telephone: (01) 855 1011
facsimile: (01) 855 1012
VSI publishes its guide to International Voluntary Work Projects (cost on its website). This
lists volunteer projects of between 10 days and 4 weeks held each summer throughout
Ireland and internationally. The work including arts / culture, practical, environmental, people
with disabilities & children. There is a small placement fee. Food / accommodation provided.


text:
Right Tail Lamp; 93-98 Jeep Grand Cherokee ZJ
This replacement tail light assembly from Omix-ADA fits the right side of 93-98 Jeep Grand Cherokee (ZJ).
Pricing: $95.99
Direct OE replacement Jeep parts and accessories built to the original specifications by Omix-ADA. Limited five year Manufacturer's warranty.
- 12403.22
- 12403.22
- 804314058845
- Omix-ADA
- New
Shipping Information
- Item Requires Shipping
- 3.0 lbs.
- W10.0000" x H13.0000" x L11.0000"
Customer Reviews
Total Reviews (0)
Write the First Review!
You must login to post a review.


text:
World's Chief Fake News Purveyor, CEO of NY Times, Wants Corporations or Government to Eradicate "Fake News"
"Fake News" is a fake story designed to take out our First Amendment rights. The left is completely and utterly out of power. They have nothing but time on their hands to accomplish long sought-after goals. Destroying free speech is top of their list. Their objective now is to destroy Trump's presidency and anyone who supports him.
The left still controls the media, academia and the culture (movies media, music), and they mean to wield this club unmercifully. Their enemy? The truth. How to silence the truth? Call it "hate speech," or now "fake news," and ban it.
Our history is rich with a cacophony of diverse voices. During the 1800's, there were thousands of different newspapers and pamphleteers — all raucous and loud. It wasn't until the 20th century that the consolidation of myriad media companies led to a small handful controlling the flow and framing of news and information.
By 1835, the United States was making newspaper history. Newspapers had freed themselves from government control over content, and there were more newspapers and newspaper readers than in any other country…
The left wants that control back.
There is conspiracy theory and there is conspiracy fact, and what we have on our hands is one mother of a left-wing conspiracy parading as a right-wing conspiracy.
"New York Times CEO Delivers Speech on Eradicating 'Fake News,'" by Kurt Nimmo, Activist Post, December 14, 2016:
On Monday, Mark Thompson, President and CEO of The New York Times Company, delivered remarks to members of the Detroit Economic Club.
Thompson threw around the idea of government censorship of "fake news."
What can we do about it? The first thing that springs to some people's minds is some form of censorship or regulation. I note in my book how the 17th century British political thinker Thomas Hobbes came, at least in part, to blame extremist sermons and tracts – tracts which could be mass-produced and disseminated widely within hours thanks to the still relatively new technology of printing – for England's descent into civil war. He later argued that the war might never have happened if a few thousand of the extremists had been rounded up and executed.
Now, while I don't suppose that even the sternest critic of fake news would advocate the death penalty, there are certainly some who favor a kind of functional censorship, with fake news sites identified and taken down, and fake news somehow filtered out of search and social media by human or algorithmic means.
Thompson then admits this is unrealistic. Besides, there is a thing called the First Amendment.
And who said that the public should only be allowed to read the facts anyway? The First Amendment essentially says they should be allowed to write, distribute and read anything they damn well please. If some of them turn out to prefer churning out and eagerly consuming lies and fantasies, so be it.
He then suggests a Ministry of Truth, of sorts, run by corporations, but admits this is worrisome.
If we imagine the tools that might be used to excise fake news from the web and social media – a mighty algorithm combing every sentence, every image for any trace of falsehood, aided perhaps by legions of human scrutineers employed by some of the world's biggest corporations – they sound suspiciously like the means of control employed by the world's most repressive regimes. They are probably not practical and, even if they were, they would be worrisome or worse in our free societies.
Thompson then falls back on a solution imposed by the state by using food labeling as an example.
Imagine a supermarket where the products had no nutrition information printed on them, and no one was prepared to vouch for quite where they had come from, and the owners told you they couldn't really take responsibility for the quality of anything. Would you feed your children food purchased from that supermarket?
Nutrition information on food products was mandated by the FDA in 1994. Is this what Mr. Thompson is advocating? A new government agency—a ministry of truth—that will decide what is fake and what is not fake news?…


text:
NSW Greens MP Cate Faehrmann and feminist author Eva Cox have joined dozens of sole parents in Sydney to protest against government cuts to single parent benefits.
From January 1, single parents have not been eligible for the parenting payment once their youngest child turns eight.
Instead, they are transferred to the lower Newstart allowance.
More than 60,000 single parents now receive between $60 to $100-a-week less under entitlement changes.
Louise Plitz, 31, a single mother of a ten-year-old boy, joined around 50 other people at the rally in Martin Place on Tuesday.
She works part-time while studying at university and said the payment changes are already affecting her and her son.
"For example, after rent comes out this week, there will be $100 to live off for two weeks," she told AAP.
"So by the time you put a full tank of petrol in, there's not much left over to cover bills. It's extremely stressful."
Ms Plitz said single parents were struggling before the parenting payment changes were made and many were now being condemned to poverty.
The federal government said the cuts, which are worth around $728 million in savings over four years, were needed for its attempt for a budget surplus in 2012/13.
NSW Greens spokeswoman for women, Cate Faehrmann told the rally that the government is "looking at the wrong end of town to find savings".
She said the government should reverse the payment cuts and boost the Newstart allowance by $50 a week.
"We are putting a whole generation of children at a disadvantage because the government is entrenching poverty and inequality," she said.
Similar rallies took place in capital cities across the country on Tuesday, including a protest at Parliament House in Canberra, where parents met with federal MPs to voice their concerns.
Originally published as NSW parents rally against payment cuts


text:
I am a member of the DSMA Advisory Board. I think Cherise is doing such amazing things, I would basically do anything for her but my main responsibility is to make the topic videos each week.
For the next few months, each advisory board member is posting his or her entry for the blog carnival on the DSMA site. Since February is my diaversary and birthday, I am the featured guest this month.
The topic for the February DSMA Blog Carnival is – "What can we do to help stop depression from hitting our community during the winter months?"
Visit the site to find out how I use the words of a TV show criminal and unicorn stickers in the same post.
Taking Care of the Little Things
You still have a few days left to participate in the February carnival. Add the following line to your post: "This post is my February entry in the DSMA Blog Carnival. If you'd like to participate too, you can get all of the information at http://diabetessocmed.com/2012/february-dsma-blog-carnival/" and be sure to add the link to your post on that page.


text:
Holtby helps Caps down OilersOct 25, 2013 - 6:01 AM Washington Capitals take a 4-1 win over the Edmonton Oilers on Thursday.
Alex Ovechkin and Nicklas Backstrom each posted a goal and an assist, while Jason Chimera and Joel Ward also scored for the Capitals, who have won the first two stops on a five-game road trip.
"We were a little shaky in the first since this was our first time in this building," said Washington head coach Adam Oates. "But the guys settled down and we were able to dictate the play there for a while."
Justin Schultz scored the lone goal of the game for the Oilers, who had a two- game winning streak stopped. Devan Dubnyk gave up all four goals on 26 shots in the loss.
Washington took a 1-0 lead with just 1:47 left in the first period as a right circle faceoff win by Backstrom was pushed forward to Marcus Johansson, who quickly dumped it back to Ovechkin for a quick shot into the left corner of the net.
At 15:35 of the second period, the Capitals made it a 2-0 game as a shot from the right point by John Carlson was deflected in front by Ward for his third of the season.
The Caps took a 3-0 lead 1:24 into the third as a pass from the right circle by Ovechkin went to the right circle for Johansson, who then sent it to the front where Backstrom swept it in with a defender on his back.
Chimera scored his second of the season with 6:37 to play with a wrister on the fly from the left circle, while Schultz spoiled Holtby's shutout bid with 2:04 to play as he shifted to the backhand down low while skating and put it into the net for his first of the year.
"I give a lot of credit to their goaltender," Oilers head coach Dallas Eakins said of Holtby "He made some great saves. We had some good looks, we just couldn't get it past him."
Game Notes
Edmonton went 0-for-3 on the power play and is now 0-for-21 over its last six games ... Washington has killed off its last 15 shorthanded situations ... Edmonton plays in Phoenix on Saturday ... Washington plays in Calgary on Saturday ... Washington took a 4-2 win at home against Edmonton on Oct. 14.
Oct 25 12:00 AM
- Edmonton Goal - Justin Schultz, at 17:55.
Capitals 4, Oilers 1 3rd - 2:05Oct 24 11:54 PM
- Washington Goal - Jason Chimera (2), from Mikhail Grabovski at 13:22.
Capitals 4, Oilers 0 3rd - 6:38Oct 24 11:45 PM
- 48
rootsRUWTbot Added 12 roots
Capitals 4, Oilers 0 3rd - 6:38Oct 24 11:45 PM
- Washington Goal - Nicklas Backstrom (2), at 1:24.
Capitals 3, Oilers 0 3rd - 18:36Oct 24 11:28 PM
- 36
rootsRUWTbot Added 12 roots
Capitals 3, Oilers 0 3rd - 18:36Oct 24 11:28 PM
End of 2nd
Oct 24 11:05 PM
- Washington Goal - Jason Chimera, at 15:35.
Capitals 2, Oilers 0 2nd - 4:25Oct 24 10:55 PM
- 24
rootsRUWTbot Added 12 roots
Capitals 2, Oilers 0 2nd - 4:25Oct 24 10:55 PM
End of 1st
Oct 24 10:12 PM
- Washington Goal - Alex Ovechkin (10), at 18:13.
Capitals 1, Oilers 0 1st - 1:47Oct 24 10:09 PM
- 12
rootsRUWTbot Added 5 roots
Capitals 1, Oilers 0 1st - 1:47Oct 24 10:09 PM
- 7
rootsRUWTbot Added 5 roots
Capitals 0, Oilers 0 1st - 8:01Oct 24 9:59 PM
1st Period - 20:00
Oct 24 9:38 PM
- 2
rootsRUWTbot Added 2 roots
Capitals vs. OilersJul 20 8:45 AM
Related News
- NHL Note - Edmonton Oilers Draisaitl, Leon Aug 16
- Oilers sign center Leon Draisaitl to 8-year extension Aug 16
- Oilers' Draisaitl signs 8-year, $68M contract extension Aug 16
- Longtime NHL coach, GM Bryan Murray dies at 74 of cancer Aug 12
- NHL Note - Edmonton Oilers Yamamoto, Kailer Aug 10
- Oilers sign first-round pick Yamamoto Aug 10
- Canada beats Finland 2-0 to win world hockey championship May 22
- Caps' GM says it's on him to keep Ovechkin's Cup window open May 17
- Cup final awaits either playoff-starved Blues or Sharks May 14
- St. Louis Blues stayed course, now reaping benefits May 13
- St. Louis Blues stayed course, now reaping benefits May 13
- Capitals assistant Reirden a 'future head coach' in the NHL May 13


text:
Shrimp, Watermelon, and Halloumi Kabobs
How to Make It
Peel shrimp, leaving tails on; devein, if desired.
Soak wooden skewers in water 30 minutes. (Omit if using metal skewers.)
Meanwhile, combine shrimp and 1/2 cup Cilantro-Lime Marinade in a large zip-top plastic freezer bag. Combine cheese and 1/3 cup Cilantro-Lime Marinade in another large zip-top plastic freezer bag. Seal bags, turning to coat; chill 30 minutes, turning occasionally.
Preheat grill to 350° to 400° (medium-high) heat. Remove shrimp and cheese from marinades, discarding marinades. Thread shrimp, watermelon, and cheese alternately onto skewers, leaving a 1/8-inch space between pieces.
Grill kabobs, covered with grill lid, 4 to 5 minutes on each side or just until shrimp turn pink. Sprinkle with cilantro and mint. Serve with remaining Cilantro-Lime Marinade.
*Firm feta cheese may be substituted.


text:
Prolab L-Carnitine Liquid
12 Oz
Prolab L-Carnitine Liquid is a liquid fat burning sensation, providing you with 2 whole grams of l-carnitine! Heat up your stomach and burn that fat away with L-Carnitine Liquid!: ProLab
: 12 Oz
: 4 Tablespoons
: 6
: Carnitine Supplements
|Product Not Currently Available
Supplement Facts
Serving Size: 4 Tablespoons
Serving Per Container 6
Amount Per Serving
Calories - 160
Pantothenic Acid - 60 mg
L-Carnitine - 2 Grams
Other Ingredients
Glycerin, Potassium Sorbate, Water, Sorbic Acid
* No claims found on this web page or in print have been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease. No claim or opinion about weight loss, bodybuilding or general health on this web page is intended to be, nor should be construed to be, medical advice. Please consult with a healthcare professional before starting any weight loss diet or exercise program.


text:
This product dispatches in 15-21 business days*. Conditions Apply*
MRP : Rs. 5,500.00
You Save : Rs. 565.00
Bajaao Price : Rs. 4,935.00
EMI starts from Rs. 267.31.
Click here for options.
BAJAAO 7" x 10" Horn Tweeter with 1" Titanium Compression Driver
This horn and driver combination was developed for use in a famous manufacturer's THX Ultra2 dual 6-1/2" 2-way loudspeaker system. The reinforced plastic horn's advanced Tractrix geometry ensures controlled dispersion combined with an absolute minimum of distortion.
High efficiency and smooth response required for THX Ultra2 certification is provided by the pre-mounted 4-ohm titanium diaphragm compression driver, which features a 9.6 oz. ceramic magnet incorporated into an optimized motor structure. The fluid-cooled magnet system is shielded to prevent harmful interaction with sensitive equipment. Vertical orientation of the horn's long axis is recommended for optimum horizontal dispersion.
BAJAAO 7" x 10" Horn Tweeter Features:
BAJAAO 7" x 10" Horn Tweeter Specifications:


text:
Upgrade to enjoy subscriber-only features like email alerts and data export. See the Plans and Pricing
Serving 500+ biopharmaceutical companies globally:
Generated: August 17, 2017
|Oral sustained release pharmaceutical formulation and process
|A pharmaceutical sustained release tablet or tablet layer is formed by making a wet granulation, using povidone (PVP) in water or alcohol-water as the granulating fluid which is mixed with a pharmaceutical active, hydroxyethyl cellulose, a wicking agent e.g. microcrystalline cellulose, then drying and milling the granulation and blending with dry powdered erosion promotor, e.g. pregelantinized starch, additional wicking agent, lubricant e.g. magnesium stearate and glidant e.g. silicon dioxide, and compressing the resultant granulation, which upon administration results in a slow release of the pharmaceutical active.
|Radebaugh; Galen W. (Chester, NJ), Murtha; John L. (Holland, PA), Glinecke; Robert (Glenside, PA)
|McNeil-PPC, Inc. (Milltown, NJ)
|Application Number:
Patent Claim Types:
see list of patent claims
|Dosage form; Process; Composition; Formulation;
|Document Number
|Estimated Expiration
|Supplementary Protection Certificate
|SPC Country
|SPC Expiration
|European Patent Office
|► Subscribe
|► Subscribe
|► Subscribe
|► Subscribe
|Hong Kong
|► Subscribe
| This preview shows a limited data set
Subscribe for full access, or try a Trial
The estimated expiration dates shown above are derived by simply adding 20 years to the priority date.
Due to the complexity of determining patent expirations even in a single country, compounded by the diversity of global patent laws, it is advisable to have patent counsel verify freedom to operate.
Export unavailable in trial.
Subscribe for complete access.
Serving 500+ biopharmaceutical companies globally:
Drugs may be covered by multiple patents or regulatory protections. All trademarks and applicant names are the property of their respective owners or licensors. Although great care is taken in the proper and correct provision of this service, thinkBiotech LLC does not accept any responsibility for possible consequences of errors or omissions in the provided data. The data presented herein is for information purposes only. There is no warranty that the data contained herein is error free. thinkBiotech performs no independent verifification of facts as provided by public sources nor are attempts made to provide legal or investing advice. Any reliance on data provided herein is done solely at the discretion of the user. Users of this service are advised to seek professional advice and independent confirmation before considering acting on any of the provided information. thinkBiotech LLC reserves the right to amend, extend or withdraw any part or all of the offered service without notice.
Copyright 2002-2017 thinkBiotech LLC
Follow DrugPatentWatch:


text:
Stakeholder Consultations
Current Consultations
There are no consultations at this time.
Past Consultations
Continuing Professional Development: Maintaining and Enhancing Our Engineering Capability
Please review the document below and provide your comments on the recommendations contained in the document, to PEO at firstname.lastname@example.com. Thank you for your response. Your contribution is important to us.
The consultation closed on December 12, 2013.
Expanded Public Information Model (EPIM) Consultation
PEO is currently reviewing the licence holder information required to be made public on the association's online Directory of Practitioners to fulfill its regulatory mandate under the Professional Engineers Act. As part of this review, we are seeking the input of PEO licence holders.
- EPIM Member Consultation
- EPIM Criteria 3
- EPIM – publicly available information - October 2013
- PEO Privacy Policy
The consultation closed on November 3, 2013.
Report of the Complaints and Discipline Task Force
Please review the following documents:
- Complaints and Discipline Process Task Force Report
- Additional Information for Consultation on the recommendations of the Complaints and Discipline Process Task Force Report
- Response Form
After you have reviewed the consultation documents, please provide comments and/or observations regarding the recommendations in the report, giving consideration primarily to issues of implementation. Your comments may then be sent by email to email@example.com. Thank you for taking the time to review the documents and provide us with your comments.
The consultation closed Wednesday, November 30, 2011.
Name PEO's New Home
Please review these design concepts and complete the consultation survey to indicate your preference.
The survey closed on May 18, 2011.
Canadian Framework for Licensure Consultation
Please review these documents prior to completing the consultation questionnaire on the Canadian Framework for Licensure.
- Canadian Framework for Licensure - Process
- Canadian Framework for Licensure - Overview
- Corporate Registration Guiding Principles and Research
- Continuing Professional Development Guiding Principles and Research
- International Agreements Guiding Principles and Research
- Value Statement for MRAs
- Acroynms and Definitions
The consultation closed on Sunday, April 24, 2011.
Governance Issue
- Consultation Document – Appointment of All Officers – June 2010
- Excerpt from February 2010 Council Minutes
- Briefing Note – 460th Meeting of Council - February 2010
- Governance Issue Discussion Paper – February 2010
- Governance Issues February 2010
- President's Message – Engineering Dimensions March/April 2010
- In Council – Engineering Dimensions March/April 2010
- Presidents Message Engineering Dimensions May June 2010
- In Council – Engineering Dimensions May/June 2010
Sustaining OCEPP Task Force Report
- Sustaining OCEPP Task Force Report
- Sustaining OCEPP Task Force Report April 2010
- Presentation to Sustaining OCEPP Task Force February 2010
- Briefing Note to Council September 2009
- Presentation to Council September 2009
- Business Plan presented to Council November 2009
Clarification of the Practice of Professional Engineering Related to the Ontario Building Code
Position Statement: "Clarification of the Practice of Professional Engineering Related to the Ontario Building Code (Nov 2009)" has been developed to clarify the practice of professional engineering related to the Building Code.
Consultation Closed: June 15, 2009.
Enforceable Code of Ethics
Eleven of the twelve provincial/territorial engineering associations in Canada have an enforceable Code of Ethics. PEO's Code of Ethics is not currently enforceable under section 72(2)(g) of Regulation 941 of the Professional Engineers Act. At its March 2008 meeting, PEO Council gave policy direction to amend Ontario Regulation 941 so that the Code of Ethics would be enforceable (i.e. a breach of any item in the Code of Ethics would constitute "professional misconduct"). Making the Code of Ethics enforceable means that a breach of any part of the Code of Ethics could result in some form of disciplinary action against a licence holder.
Survey closed: August 13, 2008.
Alternative Engineering Internship Program Models
PEO Council has recently decided to hold stakeholder consultations on the program options identified in the attached report entitled "Alternative Engineering Internship Program Models White Paper" dated January 2008.
As a stakeholder in PEO's regulation of the engineering profession in Ontario, your input is important. We are therefore inviting you to read the attached paper and provide comments through a survey.
Consultation closed: July 6, 2008.
10-Point Work Plan
On May 10, 2008 at PEO's AGM in Windsor, a 10-Point Work Plan was unveiled. PEO seeks your input.
Consultation closed: May 28, 2008.
Continued Competency Assurance
This paper is a discussion of whether the commitment to competency assurance should be left entirely to the individual engineer or whether there should be some systematic component that is prescribed by the professional body that regulates the profession. Is the public better served and protected by professionals involved in a voluntary or a mandatory professional competency assurance program?; We welcome your comments and thoughts.
Consultation closed: April 30, 2008. To access the Voluntary Annual Reporting module, go to the Member's Area of PEO's website.
Making secondary professional liability insurance available to PEO members
Survey on Professional Liability Insurance
PEO Council is seeking policy input regarding professional liability insurance for all licence holders, in addition to the liability insurance required to be carried by certificate of authorization holders.
Professional liability insurance for licence holders provides protection to individual engineers for personal liability arising out of the practice of engineering in non-consulting occupations and for past employees of consulting firms who no longer have access to other professional liability insurance. The insurance also provides for defence for the unprotected individual against costly legal actions. This differs from liability insurance for engineering services coverage for engineering firms.
Eleven out of twelve (Ontario being the exception) of the engineering licensing bodies across Canada are currently participating in a mandatory Professional Liability Insurance Program which was implemented on March 31, 2002. The program provides all members of the participating licensing bodies with $100,000 in professional liability coverage per claim or $250,000 per project (in addition to unlimited related legal fees), and the aggregate pool is $20,000,000 to cover claims in a given year. The current annual premium for participating professional engineers is $7.75, but this program and rate is only available if participation is mandatory for all members.
To see the Council briefing note on this issue, click here. More information is available from Pro-Form Insurance Services, the exclusive brokers for the XL Insurance Company's Engineers and Geoscientists Secondary Professional Liability Insurance Program.
Survey closed: August 31, 2007.
Revisiting Council
Proposed model to change the structure of, and method of election to, PEO Council.
Recently, Council appointed Past President Pat Quinn, P.Eng. to lead a study regarding PEO governance. He is seeking your input. Please read his detailed proposal and then take the survey.Based on the survey results and the feedback, Past President Quinn will further develop the proposal and present a refined version to the September Council meeting. Council would then decide how it wants to proceed to the next step. Please forward comments and/or suggestions to email@example.com.
Deadline was August 11, 2007.
Help determine public confidence in PEO as a regulator and in the licences it grants
Ipsos Reid Public Affairs is conducting a survey on behalf of PEO to help determine public confidence in PEO as a regulator and in the licences it grants. The survey was launched on January 17, 2007. Notice of this third party survey was published in the May/June and July/August issues of Engineering Dimensions. Unfortunately, the launch was delayed from autumn 2006 to January 2007.
Your opinion is important to us. As this is a random sample survey, not all members will be contacted to respond. If selected to participate, please let us know what you think by completing the survey by January 31, 2007. Your confidential response will be critical to providing the necessary information to formulate an effective, useful process to measure public confidence in the licence and in PEO in the coming years. Please do not attempt to participate in this survey through the PEO consultation website.
Licensing Process Task Force (LPTF) Reports
Presentations (PowerPoint)
Implementation Plan for Revamping the Certificate of Authorization
Professional Engineers Ontario (PEO) Council has recently approved an Implementation Plan for Revamping the Certificate of Authorization, with implications for all licence holders . PEO seeks input on the following implementation elements to help guide this initiative.
Comments were accepted until December 31, 2006.
Request for Building Proposal
Proposal Delivery
These should be delivered in a sealed envelope, marked "Building Proposal", by 4.30 p.m. November 20, 2006 and addressed to: Chetan Mehta, Professional Engineers Ontario, Suite 1000, 25 Sheppard Ave. West, Toronto, ON M2N 6S9.
Proposal to alleviate any perceived barriers to licensing of professors
On August 28, PEO President Pat Quinn sent to Councillors for comment a paper a potential program to increase licensing by professors in Ontario engineering schools by alleviating any perceived barriers. Comment is also sought from PEO members and the public.
Comments were accepted until September 9, 2006.
Proposal to increase the licensure uptake rate of graduates of accredited Ontario engineering program
On August 16, President Pat Quinn sent to Councillors for comment a paper discussing a potential program to increase the registration with PEO and eventual P.Eng. licensure rate of graduates of accredited Ontario engineering programs. Comment is also sought from PEO members and the public.
Comments were accepted until September 4, 2006.
Revamping the Certificate of Authorization
At Council's 434th meeting on June 23, 2006, President Pat Quinn presented for comment a Position Paper on an approach to revamp PEO's Certificate of Authorization Program.
Comments were accepted until August 15, 2006.
Agenda Management Protocol
As part of PEO's 2005-2009 Strategic Plan, which Council approved on March 4, 2005, one of the initiatives under the fourth key strategic goal, "Strengthen Council's ability to be an effective and efficient policy-making body in accordance with its regulatory obligations", is to "develop and implement an agenda management protocol focusing on policy issues ready for decision and priority-setting according to approved criteria".
The Agenda Management Protocol will support Council and Executive Committee in their decision-making roles through strategic and prioritized agendas and high-quality briefing notes. The Protocol will also assist committees, task forces and others in planning their own timetables for presenting interim and final reports and recommendations for Council's review and action. The Protocol will apply to all Executive Committee and Council meetings, but does not apply to committee, chapter or task force meetings. All committee staff advisors have been trained on the Protocol and are able to assist you with planning for Executive Committee's or Council's review of your proposal.
The Protocol's major components are:
- criteria for inclusion of items on Council agendas;
- agenda design;
- roles and responsibilities in the agenda-setting and briefing note approval process;
- a standardized committee/task force report template;
- briefing note types and requirements;
- revised briefing note guidelines and templates;
- briefing note quality standards; and
- a database to record all current and future Executive Committee and Council items.
The Protocol is being finalized for Council's consideration in September.
Comments and questions were accepted until August 15, 2006.


text: "Bankimchandra Chatterji was born on June 26, 1838, in the village of Kanthalpara near Calcutta. His father, Jadavchandra, an orthodox Kulin Brahmin, was a deputy collector of revenues. Bankimchandra received much of his early traditional Hindu education from a family priest. He was married at the age of 11 to a girl of 5 and in the same year, 1849, was enrolled in Hooghly College."


text:
Chris Brown
Photos of R&B singer Chris Brown on stage, his romance with Rihanna, and the aftermath of the assault.
Newsday.com now uses Facebook for our comment boards. Please read our guidelines and connect your Facebook account to comment.
Only in the Hamptons: Parties, events, more See Gavin DeGraw in concert, plus more LI fun this week See photos of Robert De Niro, who turns 74 today Recent notable deaths 17 must-have dorm room essentials See Katie Holmes, more stars spotted in NYC Elvis Presley through the years Crazy pool floats for summer Dorm decor and other college must-haves Styx, more Jones Beach concert photos Must-have tailgating essentials 50 chains we want on Long Island


text:
Whatsapp is an instant cross massaging application. Aside sending messages and making calls, whatsapp users often express their emotions through their dp.
Using sad image for whatsapp dp sends signals of pain, hardship and brokenness to friends in your contact list. Such images has lead to encouragement and counsel from friends and family who care.
sad images for whatsapp dp is often used when one is hurt, sad or may be going through a hard time.
Tough times are inevitable. It lives an imprint of sadness. People simply express this by uploading sad images for whatsapp dp. Whatsapp has become so much part of our lifes that sad image for whatsapp dp is uploaded as a reflex action. If you display a sad images for whatsapp dp and change it to a happy one you are likely to get a message saying "glad you are okay"
We also have some great latest lists for whatsapp status 2017, Please check Love Status For Whatsapp, Real Best Whatsapp Status, Cool Whatsapp Status, Funny Whatsapp Status, Whatsapp Quotes Status, Sad Status For Whatsapp, Whatsapp Status On Life, Friendship Status For Whatsapp & Best Whatsapp DPs
Latest Sad Images For Whatsapp DP 2017
Check Also:
Best Whatsapp Status & Whatsapp Images 2017


text:
jpw systems is hiring - shipper/receiver
jpw systems is looking for a shipper/receiver. Please view our posting here or at our 'careers' page
jpw systems is hiring
We are currently looking for a Project Coordinator. Click for additional information!
Paul Wraith DAHC/EHC
Congratulations Paul Wraith on being awarded the Distinguished Architectural Hardware Consultant (DAHC) designation at the 2016 Door Hardware Institute Conference in Orlando!
October 2, 2014
Invest in Middlesex County Profiles jpw systems
Check out this great case study to see why we love doing business in Middlesex County!
jpw systems is located in Komoka Ontario, just five minutes west of London. We do much of our work in London and
the surrounding areas of Windsor, Chatham, Sarnia, Stratford, Woodstock, Brantford and Kitchener/Waterloo. We
specialize in consulting, specification writing, supply and installation of architectural door hardware, automatic
door operators, access control, intrusion and cctv products.
jpw systems works closely with our clients to create intuitive solutions that work as a customer expects them to.