Shatta Wale supports Stonebwoy-Sends strong warning to Kelvin Boy
by RASHADShatta Wale has joined his new best friend, Stonebwoy to throw jabs at Kelvyn Boy for his constant disrespect towards Stonebwoy.
In a new tweet after Stonebwoy and Kelvyn Boy exchanged words on the need for underground artists to show respect, Shatta Wale warned new artists to pay the maximum respect to pioneers like himself and Stonebwoy.

Stonebwoy who was tagged in the post took to the comment section to add that they don’t even know what Akuma Village was yet they want to show shoulders.
Shatta Wale tweeted: They never know rewritable CD and Diskette before that be why Dem deh disrespect @stonebwoyb
SEE ALSO: Ghanaians mock Efia Odo for wearing ‘Silver Shine’ to 4Syte TV Music Video Awards (Photos)
Whiles performing at the 4Syte TV music video awards 2019 Stonebwoy threw a jab at Kelvyn Boy and told him right on the stage to show respect or “sit well”.
“Big up to Samini, my godfather, and the upcoming wey dem no dey respect, dem for sit well,” Stonebwoy said.
But Kelvyn Boy who was not pleased with the jab took to his social media handles to tease Stonebwoy.
He told Stonebwoy he has a weak soul and he is in pain that he is going higher and higher after leaving Bhim Nation.


Get the Professor History by giving his id
Professor ID:
{% if result %}
Professor ID
Professor Name
Course Name
{% for row in result %}
{{ row.pID }}
{{ row.pName }}
{{ row.cName }}
{% endfor %} {% endif %}


The sidebar right component is optional and you can add any custom HTML.
It can be toggled with sidebar right button of the header or programmatically with layout.sidebarRightCollapsed().
You can also subscribe to sidebar right toggle status with layout.isSidebarRightCollapsed.
<mk-layout-sidebar-right>
//Custom HTML
</mk-layout-sidebar-right>


[Erowid Note: It's entirely unclear how much material was insufflated. The reported dose as filled out in the submission form is '10mg', and the dose mentioned in the report itself is 80mg.]
I took MXE the day before yesterday and am only now fully recovering from the effects of the drug. A friend brought up a bag of what she thought was ketamine at the time, and I proceeded to sniff about 80mg in one line. I now know snorting isnt exactly the done thing with this stuff.
 About ten minutes in the film I had put on started to distort, words being elongated, overlapping sounds and at the same time unable to find where they are coming from.
Then I experienced a shrill vibrating noise, seemed to be coming from inside my head, but all over the room at the same time.
I walked into the hallway and was met with a trip of pristine white staircases, travelling upwards there was a portrait of my mum at every level, and upon reaching the top I was met with out-of-my-eyes vision again, which freaked me out no end and I began to panic.
Alice in wonderland syndrome was evident, although at the time I didnt know of this and was shouting its just like alice in wonderland in here. Small items in my kitchen like an empty rum bottle kept me anchored to reality temporarily, but a deep breath or a panicked intake of breath would push me back out of my body again, I felt like I saw different realms, doorways with different physics to ours, lone trees in massive landscapes for example.. Hard to recount but really really eye opening stuff..
  I also remember my hands were moving really slowly but I knew I was moving them very fast!
On the whole, a very real experience that I cannot wait to feel again, the synthensysia especially, I felt I could feel my sight it sounds weird but my vision was like running water..
I would do it again and deffinitly feel its addictive quality.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


Startpage Options Changelogs Privacy Donate!
The purpose of this extension is to make the newtab page more useful for those of us who use a lot of bookmarks and dislike the way Chrome serves them. It overrides the new tab page and displays a grid of your apps and bookmarks.
Chose one of the following predefined themes or apply your own theme to the Bookmark Button Startpage.
by ()
You can enter arbitrary css values here. In parenthesis is the context of which you can enter css attribute values. This feature is for users that know webdesign basics.
Apply Theme


Stereotype Threat
April 20th, 2014
It was interesting to listen to some of the lectures on the stereotype threat. The stereotype threat points to the experience of anxiety in a situation where a person might have the potential to confirm negative stereotypes about his or her social group. The example that I heard mentioned a few times was the African-American vs. white groups' comparative performance for a standardized test such as the SAT.
This problem resonated with me very much, of course not only with ethnicity or male vs. female perspective; but also from a income view. In our modern society where ethnic boundaries becoming more blurred and social groups become more homogenous, I believe a huge stereotype threat that exists that is getting more pronounced in our society as a whole is the limitation of academic potential that arises from the divide in wealth.
Current net worth should not really impact academic competence. But, in a world where ivy league universities tuition costs an arm and a leg with a lifetime student loan needed to graduate, and require strong referrals from influential people around the student as an entrance requirement; it is undeniable that some less privileged learners may fall into the trap of not feeling they are adequate for that level of education, or not partake in challenging themselves to get to that level in the first place.
Alternatively, the divide in wealth is also a divide in social group between the 'elite' and 'underprivileged'. Whether it be directly mentioned or not, there is a sociaal line between the two, making the leap between the two ever more difficult.
If someone around me if feeling the stereotype threat, the best way to deal with it is to give them real information and feedback on how they are doing. Encourage and praise and recognize the good. If there is bad, provide transparent and constructive feedback so they can grow to be better. Taking a pragmatic, positive position is the best path to take.
At all times, I would respect the individual's privacy and avoid diving directly into the stereotype itself - since the indiviudal's sensitivities towards the stereotype will differ from my perpsective, the best thing would be for that person to self-reflect on whether they really fit into that stereotypical category or not, based on pragmatic feedback provided from trustworthy peers.


List of medieval catalogues
{% if not printing %}
Medieval catalogues > SECULAR INSTITUTIONS: Hospitals, Towns, and the Professions > Rome, English hospital
{% endif %}
-
SECULAR INSTITUTIONS: Hospitals, Towns, and the Professions
-
Rome, English hospital
-
SH62 Inventory of goods, 1 October 1496 (33)
-
SH63 List of donations, November 1498 (34)
-
SH64 Inventory of goods, before 30 March 1501 (29)
-
SH65 Inventory of goods, 1502-3 (104)
-
SH66 Inventory of goods, 6 November 1506 (6)
-
SH67 List of donations and goods, 9 February 1525 (0)
-
SH68 Inventory of goods, 16 May 1525 (0)
-
SH69 Inventory of goods, 26 April 1538 (0)
-
SH70 Inventory of goods, 27 January 1561 (0)
-
SH71 Inventory of goods, 4 May 1562 (0)
-
SH72 Inventory of goods, 1 May 1563 (0)
-
SH73 Inventory of goods, 4 May 1564 (0)
-
SH74 Inventory of goods, 4 May 1565 (0)
-
SH75 Inventory of goods, 4 May 1566 (0)
-
SH76 Inventory of goods, 4 May 1567 (0)
-
SH77 Inventory of goods, 4 May 1568 (0)
-
SH78 Inventory of goods, 4 May 1569 (0)
-
SH79 Inventory of goods, 4 May 1570 (0)
-
SH80 Inventory of goods, 4 May 1571 (0)
-
SH81 Inventory of goods, 4 May 1572 (0)
-
SH82 Inventory of goods, 4 May 1573 (0)
-
SH83 Inventory of goods, 21 May 1574 (0)
-
SH84 Inventory of goods, 21 May 1575 (0)
-
SH85 Inventory of goods, 26 May 1576 (0)
-
SH86 Inventory of goods, 26 August 1577 (0)
-
SH87 Inventory of goods, 17 May 1578 (0)
26 catalogues found.
All data was derived from the List of Identifications by Professor Richard Sharpe.
{% if not printing %}
A key to codes used in the List is available (opens in new tab).{% endif %}
{% include 'includes/indexmenu.html' %}
{% if printing %}{% endif %}
{% endblock %}
{% block search %}
{% endblock %}
{% block useful_links %}
{% endblock %}


Denny Alfath
Kp. Melayu - Bukit Jodoh, Sei Panas, Batam ·<PHONE_NUMBER>91 ·
<EMAIL_ADDRESS>Currently looking for an opportunity to invest knowledge in Web Development, especially Front-End. Had 6 months of experience of developing web-based system using HTML, CSS, Jquery and PHP Framework Codeigniter 3.


The night started as all nights usually did, I met up my good friend Kyle and we started driving around and making deals getting people weed all over the city.
We then drove to the bottom of his block to meet our dealer to pick up some more chronic. Kyle and I both jumped into his caddy expecting to grab the product and bounce, but he brought up that he had the strongest salvia he could find. Kyle looked over at me and I said lets do it. Our dealer put a little bit of weed on the bottom of a glass pipe and filled the rest of the bowl with 40x extract of salvia. I had never done salvia before and had NO IDEA what to expect, I thought it might be something like weed, boy would I be dead wrong.
Somehow I ended up taking the first hit, I lit the whole bowl up and sucked down as much smoke as I could. After taking my hit I passed the pipe to Kyle, he took a hit and passed it to the guy in shotgun. Soon the pipe was back in my hands I still had my first hit in my lungs when I took the second, I sucked and sucked until I couldn't anymore. Finally I exhaled to my surprise no smoke came out. Instantly everything shone with a eye hurting light and I threw the pipe in Kyle's direction.
After the white faded all I could see was black, at this point I had no idea what was happening, in fact I didn't even know I was human. A huge DNA strand filled the darkness and was every color I ever knew and was pulsating, rotating, and flashing this went on for a little bit until stars starting forming and I could see our solor system and the DNA strand was gone. All of a sudden I was shooting through space at what seemed like warp speed, going deeper and deeper until I shot out of our universe into some strange sponge like aqua blue world. There was a massive shape I kept flying around, eventually I realised it was an organism of some sort. All I can remember about was it had a body figure similar to a human and blue short fur all over its body. I zoomed in on a blackish, brown spot on his lower back, it kept trying to scratch it off but couldn't reach. Then I flew into the germ patch and was going back into our universe until I slammed into Earth.
This was when my vision came back, I came to in Kyle's car driving up to crowfoot shopping centre, which was about 2 km from where I had originally smoked the saliva. For the next hour or two I was trying to put together what had happened. I kept thinking that our Universe, although endless to us was in fact just a germ patch on an organism in some other larger world or dimension.
Salvia truly changed the way I think about things in general, but not in a bad way I seem more open to ideas that before I could of concluded as stupid or retarded, it has opened my mind and let my imagination have no limits.
I had no idea what to expect so I hit it like my last 5-chip of weed in a pipe, which I know now was a very bad idea. I did a very large amount and found it VERY VERY intense, and I'm not new to the drug game either having done weed, mushrooms, extasy, coke, and mescaline. Salvia by far was the most intense visual thing I have ever experienced. The moral of the story is to remeber when trying a new drug to do it in small doses until you get the feel of it. Thanks for readin.. Goon.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


| Date | User | |
|---|---|---|
| Created | ||
| Changed |
| Identification code |
|||
| Planning purpose |
|||
| Plan relations | |||
| Triggers |
|
| Date | User | |
|---|---|---|
| Created | ||
| Changed |
| Document types |
|
| Mandate |
|
| Designated community |
|
| Applying policies | |
| Relevant organisational procedures and workflows | |
| Contracts and agreements specifying preservation rights | |
| Reference to agreements of maintenance and access |
| Samples description: |
| PUID: | |
| Name: | |
| Version: | |
| mime-type: |
| Date | User | |
|---|---|---|
| Created | ||
| Changed |
| Date | User | |
|---|---|---|
| Created | ||
| Changed |
| Date | User | |
|---|---|---|
| Created | ||
| Changed |
Results |
Transformer
Transformer-Changelog
|
Transformed Results |


File
Metadata
| selector |
page-map |
| templateUrl |
map.html |
Constructor
constructor(googleMaps: GoogleMaps, navCtrl: NavController, platform: Platform, video: Video)
|
Methods
|
loadMap
|
loadMap()
|
create a new map by passing HTMLElement then listen to MAP_READY event map.one(GoogleMapsEvent.MAP_READY).then(() => { // your code}) You must wait for this event to fire before adding something to the map or modifying it in anyway then filter the videos and loop through it and create new marker in the video location map.addMarker(markerOptions).then(()=>{}) then added click event on the marker to navigate to video details page
Returns: void
|
|
showList
|
showList()
|
Navigate to the list view page
Returns: void
|
|
showCard
|
showCard()
|
Navigate to the card view page
Returns: void
|
|
navCtrl
|
navCtrl: NavController
|
|
platform
|
platform: Platform
|
Map
The Map page renders a Google Map with all videos location marked on it
import { Component, ViewChild } from '@angular/core';
import { NavController, Platform } from 'ionic-angular';
import {
GoogleMaps, GoogleMap, GoogleMapsEvent, LatLng, CameraPosition, MarkerOptions,
Marker
} from '@ionic-native/google-maps';
import {Video} from "../../providers/video";
import {ItemDetailPage} from "../item-detail/item-detail"
import {CardsPage} from "../cards/cards";
import {ListMasterPage} from "../list-master/list-master";
declare var google: any;
@Component({
selector: 'page-map',
templateUrl: 'map.html'
})
export class MapPage {
@ViewChild('map') map;
videos : any[]
constructor(private googleMaps: GoogleMaps, public navCtrl: NavController, public platform: Platform,public video:Video) {
}
ngAfterViewInit() {
this.video.all().subscribe((res)=>{
this.videos = res.json().docs;
this.loadMap();
});
}
/**
* create a new map by passing HTMLElement
* then listen to MAP_READY event ``` map.one(GoogleMapsEvent.MAP_READY).then(() => { // your code}) ```
* You must wait for this event to fire before adding something to the map or modifying it in anyway
* then filter the videos and loop through it and create new marker in the video location ``` map.addMarker(markerOptions).then(()=>{})```
* then added click event on the marker to navigate to video details page
*/
loadMap() {
// create a new map by passing HTMLElement
let element: HTMLElement = document.getElementById('map');
let map: GoogleMap = this.googleMaps.create(element);
// listen to MAP_READY event
// You must wait for this event to fire before adding something to the map or modifying it in anyway
map.one(GoogleMapsEvent.MAP_READY).then(() => {
map.getMyLocation().then((loc) => {
let position: CameraPosition = {
target: loc.latLng,
zoom: 15,
tilt: 30
};
// move the map's camera to position
map.moveCamera(position);
// create new marker
this.videos.filter((video)=>{return video.lat && video.long}).forEach((video)=>{
let latLong = new LatLng(video.lat,video.long);
let markerOptions: MarkerOptions = {
position: latLong,
title: video.name,
draggable: false,
};
map.addMarker(markerOptions)
.then((marker: Marker) => {
marker.showInfoWindow();
marker.on(GoogleMapsEvent.MARKER_CLICK).subscribe((event) => {
this.navCtrl.push(ItemDetailPage,{video});
});
});
})
});
});
}
/**
* Navigate to the list view page
*/
showList(){
this.navCtrl.setRoot(ListMasterPage);
}
/**
* Navigate to the card view page
*/
showCard(){
this.navCtrl.setRoot(CardsPage);
}
}


@(Email address)
@(Phone number)
@(Enable sounds)
@(Enable notifications)
@(Enable email notifications)
@(Enable phone notifications)
@(Change credentials)
@(Login name)
@(Login password)
@(Passsword will be encrypted.)
@(Account has been updated successfully.)


Our Hiring Process
This is our process to hire new team members at Ombu Labs. It's a process that we have been improving ever since we started our operations. It's very important for us to hire A players.
In this article I will focus on how we evaluate new developers, but parts of the process can be customized for other positions.
We usually hire Junior and Senior developers. You can find our open positions over here.
How to Apply
You can just follow the Apply link for the position that you are interested in.
We don't want to receive an old school resume. We prefer to receive a link to your Github or LinkedIn, in that particular order.
I realize that there are great developers that have never made any open source contributions. If that's your case, we will ask for a couple of code samples.
We want to see some recent code samples and evaluate you based on your work, not on your work history. Experience is important but passion is more important.
First Interview
If we like what we see, we will send you an email to coordinate an initial interview.
In this interview we will talk about your experience, what you know, what you are passionate about, what you are looking for, what we are looking for, and some concepts that are really important to us.
In this stage we want to get a sense of what you are looking for and if we are a good fit for you.
You can expect some technical questions and some random questions.
Paid Pair Programming Time
If we like what you said in the interview, we are going to schedule some time to pair program with you.
We don't expect you to work on a test project for free. That's why we will pay for the time that you spend pair programming with us.
We will start a project from scratch and pair program with you from 8 to 16 hours. You will be driving most of the time, but one of us will be your copilot.
In this test, we want you to work as you usually work. You can use Google, Stack Overflow, Rubydoc, or whatever you need to get things done.
You will spend some time working with each developer in our team. We want to see how we work together and if there is chemistry between us.
Culture Fit Interview
If we like what you did pair programming with us, we will call you in for a culture fit interview.
This interview will be an interview with everyone in the team, not just developers. Everyone in the company will be able to ask you one or more questions. They are usually pretty random.
Also, you will be able to ask anyone in the team any questions. This is a good way for you to find out what it's really like to work at Ombu Labs.
Job Offer
If you pass the culture fit interview, you will receive a job offer.
In the best scenario, you will accept our job offer and join us as soon as possible!
Join us!
We are very careful when adding people to our team. We want to work with the best talent out there.
We don't want to waste anyone's time. That's why our hiring process is so long. In order to keep our team's quality high, we prefer to spend more time than usual making a decision.
If you are looking for a new challenge, check out our open positions: http://www.ombulabs.com/jobs


Buhari, APC govs to meet in Jos
by Agency ReportJames Abraham, Jos
President Muhammadu Buhari will arrive Jos, the Plateau State capital for a two-day meeting with governors elected on the platform of the All Progressives Congress.
The meeting is scheduled to hold between Sunday and Monday.
Secretary to the Plateau State Government, Prof Danladi Atu, confirmed the development at a press conference in Jos on Friday.
Atu said that other dignitaries expected at the meeting included the Senate president, Ahmad Lawan, Speaker of the House of Representatives, Femi Gbajabiamila and at least 17 ministers.
According to him, the meeting will provide an opportunity for the APC governors to share ideas on how to deepen governance in their respective states and provide dividends of democracy to the people.
He said, “The latest meeting of the APC governors coming up in Jos is the third in the series after the previous ones in Ekiti and Kebbi States. The essence is for the governors to share ideas and learn from each other on how best to provide good governance to the people in line with the APC manifesto.
“And that is why Mr President has accepted to be part of the meeting. The Senate president and the Speaker of the House of Representatives, as well as about 17 ministers, will also be in attendance.”


# -*- coding: utf-8 -*-
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
from airflow import AirflowException
from airflow.contrib.hooks.gcp_container_hook import GKEClusterHook
from airflow.models import BaseOperator
from airflow.utils.decorators import apply_defaults
[docs]class GKEClusterDeleteOperator(BaseOperator):
template_fields = ['project_id', 'gcp_conn_id', 'name', 'location', 'api_version']
@apply_defaults
def __init__(self,
project_id,
name,
location,
gcp_conn_id='google_cloud_default',
api_version='v2',
*args,
**kwargs):
"""
Deletes the cluster, including the Kubernetes endpoint and all worker nodes.
To delete a certain cluster, you must specify the ``project_id``, the ``name``
of the cluster, the ``location`` that the cluster is in, and the ``task_id``.
**Operator Creation**: ::
operator = GKEClusterDeleteOperator(
task_id='cluster_delete',
project_id='my-project',
location='cluster-location'
name='cluster-name')
.. seealso::
For more detail about deleting clusters have a look at the reference:
https://google-cloud-python.readthedocs.io/en/latest/container/gapic/v1/api.html#google.cloud.container_v1.ClusterManagerClient.delete_cluster
:param project_id: The Google Developers Console [project ID or project number]
:type project_id: str
:param name: The name of the resource to delete, in this case cluster name
:type name: str
:param location: The name of the Google Compute Engine zone in which the cluster
resides.
:type location: str
:param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform.
:type gcp_conn_id: str
:param api_version: The api version to use
:type api_version: str
"""
super(GKEClusterDeleteOperator, self).__init__(*args, **kwargs)
self.project_id = project_id
self.gcp_conn_id = gcp_conn_id
self.location = location
self.api_version = api_version
self.name = name
def _check_input(self):
if not all([self.project_id, self.name, self.location]):
self.log.error(
'One of (project_id, name, location) is missing or incorrect')
raise AirflowException('Operator has incorrect or missing input.')
[docs] def execute(self, context):
self._check_input()
hook = GKEClusterHook(self.project_id, self.location)
delete_result = hook.delete_cluster(name=self.name)
return delete_result
[docs]class GKEClusterCreateOperator(BaseOperator):
template_fields = ['project_id', 'gcp_conn_id', 'location', 'api_version', 'body']
@apply_defaults
def __init__(self,
project_id,
location,
body={},
gcp_conn_id='google_cloud_default',
api_version='v2',
*args,
**kwargs):
"""
Create a Google Kubernetes Engine Cluster of specified dimensions
The operator will wait until the cluster is created.
The **minimum** required to define a cluster to create is:
``dict()`` ::
cluster_def = {'name': 'my-cluster-name',
'initial_node_count': 1}
or
``Cluster`` proto ::
from google.cloud.container_v1.types import Cluster
cluster_def = Cluster(name='my-cluster-name', initial_node_count=1)
**Operator Creation**: ::
operator = GKEClusterCreateOperator(
task_id='cluster_create',
project_id='my-project',
location='my-location'
body=cluster_def)
.. seealso::
For more detail on about creating clusters have a look at the reference:
https://google-cloud-python.readthedocs.io/en/latest/container/gapic/v1/types.html#google.cloud.container_v1.types.Cluster
:param project_id: The Google Developers Console [project ID or project number]
:type project_id: str
:param location: The name of the Google Compute Engine zone in which the cluster
resides.
:type location: str
:param body: The Cluster definition to create, can be protobuf or python dict, if
dict it must match protobuf message Cluster
:type body: dict or google.cloud.container_v1.types.Cluster
:param gcp_conn_id: The connection ID to use connecting to Google Cloud Platform.
:type gcp_conn_id: str
:param api_version: The api version to use
:type api_version: str
"""
super(GKEClusterCreateOperator, self).__init__(*args, **kwargs)
self.project_id = project_id
self.gcp_conn_id = gcp_conn_id
self.location = location
self.api_version = api_version
self.body = body
def _check_input(self):
if all([self.project_id, self.location, self.body]):
if isinstance(self.body, dict) \
and 'name' in self.body \
and 'initial_node_count' in self.body:
# Don't throw error
return
# If not dict, then must
elif self.body.name and self.body.initial_node_count:
return
self.log.error(
'One of (project_id, location, body, body[\'name\'], '
'body[\'initial_node_count\']) is missing or incorrect')
raise AirflowException('Operator has incorrect or missing input.')
[docs] def execute(self, context):
self._check_input()
hook = GKEClusterHook(self.project_id, self.location)
create_op = hook.create_cluster(cluster=self.body)
return create_op


Welcome to the new Halo Custom Edition website! As you can see, we are currently under construction. Check back later!


--- layout: page-fullwidth meta_teaser: teaser: "" header: image: helm.png background-color: "#262930" caption: Swank Helm caption_url: image: thumb: helm.png homepage: caption: caption_url: "" categories: - robotics title: "Centurion's Helm of +2 Swankiness" tags: [Motivate] section: team personhours: 15 rollcall: [Max] ---
We’re following a Roman theme this year, but nobody’s gonna know it if we don’t look the part. So, we decided it was time to make some Roman soldier style helmets. The most Roman helmets cover the top of the head with the body of the helm, with two additional plates on hinges that cover the cheeks, a protrusion at the back similar to the bill of a ball cap to protect the back of the neck, and of course the iconic curved crest, which would point forwards on the common soldier’s helmet (if the soldier could afford it) or from side to side on the helmet of a centurion (the best soldier of in a group of 100). While it would be nice to mimic the helmet entirely, we don’t have the time or the funds to do that ourselves, and instead opted for a more homespun version.
Our helmets each consist of a construction helmet, the sawn-off head of a broom, and a single screw holding the two together. It’s simple, but it’s cheap, easy, and definitely gets the job done.
The helmet has most of the features of a Roman helmet already, but it is still missing the hinged cheek guards. We likely won’t add hinged ones because they could be distracting to drivers wearing them and they would take too long to build, but I have a plan to cut stationary ones out of foam board and socket them into a pair of empty slots I noticed on the sides of the helmets. Also, Tycho suggested that, at least for the drive team, we could fit a few helmets with safety glasses mounted on hinges to reduce the chance that the drivers accidentally go to the playing field without their protective wear.


---
title: "BOTANICAL DRY BRUSH TECHNIQUE"
date: "2000-01-01 18:01:20 -06:00"
categories:
- adult
- eh
subtitle: ""
layout: "events"
event-image: "botanical-dry-brush-technique.jpg"
event-dates: "SATURDAY, JANUARY 20"
event-location: "Red Butte Garden Classroom"
button-type: "register"
tickets-link: ""
registration-info: "Class Limit: 15"
instructor-info: "Elaine Hultgren
Visit Elaine's Website"
member-cost: "$75"
public-cost: "$75"
event-notes: ""
tickets-button: ""
published: false
---
SATURDAY, JANUARY 20, 9AM - 4PM
REGISTRATION REQUIRED
One of the techniques most often missing in a beginner's watercolor painting is the dry brush technique. The dry brush technique can add a great deal of energy, detail and interest to any painting in any fluid medium. Paint is taken up with a small "detail" brush with very little moisture. Paint is applied with small hatching-like strokes applied in layers in a slow color weaving process. The process is slow going but the results are truly beautiful. WC dry brush works well with wet into wet underpainting and is great technique and will add beautiful detail to your paintings.
Art Supplies Provided:
Artist/Student Will Provide:
Questions? Email Elaine at ehult@cox.net


Man, 70, charged with threatening First Nations, school in Alberta
Police didn’t say how or where the threats were made
by The Canadian PressPolice say a 70-year-old man has been charged after allegedly threatening to “shoot up” two First Nations and a school in the County of St. Paul, Alta.
RCMP allege the man made threats against Saddle Lake First Nation, Witefish Lake First Nation and Ashmont School.
Police didn’t say how or where the threats were made.
They say someone complained about the threats on Sunday afternoon, and they arrested the accused a short time later.
Police say the man from Ashmont, Alta., has been charged with three counts of uttering threats.
Officers say they take allegations of threats seriously and will lay charges where applicable.
The Canadian Press


Portfolio à la mode
Sample projects and designs
simple merch shop
placeholder 1
placeholder 2
switch
mi Art à la mode
Sample projects and designs
placeholder 0
placeholder 1
placeholder 2
switch


randRange(ConicType.CIRCLE, ConicType.HYPERBOLA)
conicTypeToString(CONIC_TYPE)
Slice the cone with the plane so that it's intersection forms
CONIC_TYPE_NAME.
Use the plane controls below to manipulate the plane in order to
get
CONIC_TYPE_NAME.
| Plane height |
|
|
| Plane rotation |
|
|
| Disable real time |
(slow computers)
|
getGuess()
showGuess(guess)
return validateGuess(guess, CONIC_TYPE)
initConics();
(click and drag cone to change the camera angle)


Flood-hit Venice to reopen all schools
Brugnaro also said that forms for citizens and businesses to claim damages would be available shortly
The flood-hit Italian city of Venice will reopen all schools that were earlier closed due to high water tides, the city's mayor Luigi Brugnaro has confirmed. In a tweet on Sunday, Brugnaro also said that forms for citizens and businesses to claim damages would be available shortly, Xinhua news agency reported.
Venice was hit by 150 cm tide on Sunday afternoon, according to the city's tide forecasting and reporting centre. It added that tides could reach a maximum of 110 cm on Monday and Tuesday, and would remain high in the next few days.
"Venice and the Venetians in the darkest periods have done the best things and this time we will all stand together again," Brugnaro said in another tweet Sunday, posting a video clip featuring himself standing on the flooded streets. "Let's start from Venice to study the effects of climate change around the world," he said.
In an earlier tweet, Brugnaro said the devastating floodwaters were "effects of climate change" and that "MOSE must be finished soon". MOSE, or Experimental Electromechanical Module, was first drawn up in 1987 for flood protection and has been under construction since 2003, but has received critics over its possible ecological damage.
It was originally scheduled to be completed last year but faces delays, with a price tag estimated at around 7 billion euros ($7.7 billion) once it was completed. Venice, a World Heritage Site, was flooded on November 12 by a tidal surge of 187 cm, the highest level since 1966, when a 194 cm tide was recorded.
By November 15, the city's St Mark's Square was completely flooded and inaccessible. City officials have removed the walkways that are normally placed over St Mark Square because, with such high tides, they would float into the water, creating safety concerns.
Sign up for all the latest news, top galleries and trending videos from Mid-day.com
Subscribe
Loading...


Conspiracy Theory (1997)
A movie review by Michael J. Legeros Copyright 1997 by Michael J. Legeros
(WB) Directed by Richard Donner Written by Brian Helgeland Cast Mel Gibson, Julia Roberts, Patrick Stewart MPAA Rating "R" (presumably for violence and profanity) Running Time 125 minutes Reviewed at General Cinemas at Pleasant Valley, Raleigh, NC (08AUG97)
==
Phew, what a mess! For his fifth collaboration with director Rich- ard Donner (LETHAL WEAPON I-III, MAVERICK), Mel Gibson plays a motormouth, maybe mentally ill New York City cabbie, Jerry, whose wild conspiracy theories are all but ignored by Alice (Julia Roberts, acting all serious), the Justice Department employee that he has a crush on. She not interested, but another person is: a CIA psychiatrist (Patrick Stewart) who promptly kidnaps him. Is one of Jerry's conjectures correct? *Is* the metal strip in the new $100 bill being used to track your movements? Is Oliver Stone still alive, because he cut a deal with George Bush to spread *dis*information? Is this movie really about *any* of the crazed cabbie's theories? No, no, and no. As it turns out, there's some other nonsense going on here, involving and revolving around Jerry's background. (Hint: pay attention to an early scene where Jerry blacks out and flashes back, in quick succession, to images of an interrogation room, hypodermic needles, and Ms. Roberts herself.)
The *initial* premise is pretty good and is played, for a while, at a delightfully dizzying clip. Mel is wider-open that we've ever seen him and, if his character's relationship with Roberts' initially strains credibility, their combined star power is blissfully intoxicating. (The highest wattage of the summer, perhaps?) Even when the plot contrivances begin to intrude, the two remain a randy dandy screen pair. There's a great scene in Jerry's fortress, er, apartment, with Alice trying to act casual as her hyperactive host tries to remember the combination to a locked coffee bean container. (Which he stores in another locked con- tainer, his fridge.) Other hilarious moments, of which there are many, include a trio of memorable convention-breakers, where Alice ditches a tail, Jerry cold-cocks someone, and, later, eludes a foot pursuit, each in a uproariously unexpected fashion. (That's Donner's own LADYHAWKE playing in the theater, BTW.)
Let's see, other pleasures include... a brilliant title sequence, a jazzy score from Carter Burwell, and the worth-paying-to-see sight of Roberts pumping lead into one bad guy and slamming another's head into a wall. Oh, pretty woman! Getting to the latter, however, requires slogging through an increasingly overburdened and ultimately unappealing story. The last hour of CONSPIRACY THEORY devolves from tolerable to torturous to almost unwatchable.  And here I thought it was wabbit season. Good God, who rewrites these movies? And do they arrive in nondescript black vehicles?
Grade: C-
-- Mike Legeros - Movie Hell http://www.nonvirtual.com/hell
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


--- title: "RNA-seq experiments quality, part 1: quering GEO database from R using E-Utils" author: "Taavi Päll, Ülo Maiväli" date: "2017-05-16" categories: ["R"] tags: ["RNA-seq", "NCBI GEO", "P-value"] ---
This the first post in series describing the analysis of P-value histograms from RNA sequencing experiments uploaded into NCBI GEO database as supplemental data.
This is about replication. Poor reproducibility1 and replicability2 have become major concerns in experimental biomedical science. Reproducibility of a study is mostly determined by the availability of the original data and whether analyses are described in a sufficient detail.
Reproducibility of a study is mostly determined by the availability of the original data and whether analyses are descibed in a sufficient detail.
No new data are generated. Reproducing a study is something that everyone should do when reading a research article really carefully and trying to understand how authors reached to their conclusions. It’s a function of a peer review, basically.
In contrast, a replication study generates new data by following the original experimental procedures.
A replication study generates new data by following the original experimental procedures.
Therefore, sufficiently detailed description of the methods of the study is a prerequisite for successful replication. Replication study introduces new evidence to science and thus has the potential to change the conclusions of the original study.
There are two major obstacles in the replication business: (1) the high cost of actually repeating experiments and the willingness to pay this cost is greatly reduced by (2) the lack of consensus on how to measure replicability. This makes it desirable to first estimate in silico, which studies are worth replicating in the lab, and how to best replicate them.
The uncertainty in identifying true discoveries remains in case reproduction and replication and is caused by random nature of P-values calculated for our experimental samples. In the long run, randomness can be controlled by assuming false discovery rate (FDR). As an other arm, trust into obtained P-value can be increased by estimating prospectively the probability of success, the power of detecting true effects. Statistical power is used to set the sensitivity of the experimental system in the context of many consecutive measurements.
However, power is mostly not estimated or reported in published articles and the already conducted study cannot be used to estimate its power (Figure 1).
Therefore, reported single P-values tell us nothing about the probability of null hypothesis or the quality of experiment design and replicability.
Fortunately, in case of omics experiments, where large amounts of P-values are generated in parallel, it is possible to judge the quality of experiment and its potential replicability just by looking at the shape of the P-value histogram. In addition, the proportion of true null effects can be calculated from the shape of P-value histogram. When we know the number of true null effects, then we know the number of true non-null effects, and then the power can be calculated.
RNA sequencing (RNA-seq) is usually done in a massively parallel way, testing for differential expression between experiment and control conditions of thousands of RNA pairs. This allows to check the quality of each RNA-seq experiment by examining the distribution of the P-values that were calculated by the original authors and were used by them to make inferences about differential expression of individual RNAs in their study.
When these P-values indicate a technically successful experiment, they can be further used to calculate the false discovery rate and assess the prospective power by using the proportion of true nulls, which together enable to analyse the replication potential of the study.
RNA-seq and other high-throughput experiments can be obtained from three sources storing data from high-throughput experiments: NCBI GEO, DDBJ and ENA. According to Minimum Information about a high-throughput SEQuencing Experiment, one could expect to find also “The ‘final’ processed (or summary) data for the set of assays in the study: the data on which the conclusions in the related publication are based, and descriptions of the data format” along with sequence read data and metadata deposited into databases. Most likely, these final processed data contain set of P-values which can be used for post-experiment quality control. We will going to use NCBI GEO database as perhaps the most well-known source.
NCBI GEO database can be accessed from R via Bioconductor’s package GEOquery
. However, GEOquery
assumes that you already know the IDs of entities that you want to download. We don’t know, but we want them all. For programmatic access, NCBI has Entrez Programming Utilities (E-Utils). Here we are going to use ESearch
which provides a list of UIDs matching a text query and ESummary
for downloading document summaries (DocSums) for a list of these UIDs.
E-Utils can be used to construct HTTP request to NCBI server using GET
verb from httr
package. Let’s say we are interested in total number of high throughput sequencing datasets in GEO database. We can use following example query specifying study type: ‘expression profiling by high throughput sequencing[DataSet Type]’ to get UIDs for RNA-seq experiments (mostly). Response contains xml content where we can extract our UIDs:
library(tidyverse)
library(magrittr) # %<>% and set_colnames()
library(httr) # GET()
library(xml2) # xml stuff
query <- 'expression profiling by high throughput sequencing[DataSet Type]'
# Function to submit request to NCBI
get_GEO_ids <- function(query, database = "gds", retmax = 500, ...){
url <- "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi"
qres <- GET(url, query = list(db = database, term = query, retmax = retmax, ...))
rescont <- content(qres)
rescont %>% xml_find_all(xpath = "//Id") %>% xml_text()
}
# Get Ids
ids <- get_GEO_ids(query = query, retmax = 20000)
head(ids)
## [1] "200099676" "200098985" "200098984" "200098651" "200098650" "200076573"
In order to get all that’s available, based on prior knowledge, I did set the maximum number of retrieved UIDs to 20000. This query retrieved us 13370 GEO Series UIDs.
Now we can use UIDs to retrieve document summaries. Document summary contains GEO Accession number and bunch of other info, like series title and summary, dataset publication date, PubMed id when study has been published, used taxa, and platform id among others. Large query must be split into smaller pieces, otherwise the query will freeze. Here I submit multiple queries with chunk size of 500.
# Function to document summaries for UIDs from NCBI
get_docsums <- function(ids, database = "gds"){
url <- "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi"
# Split UIDs into chunks of size max 500
chunkize <- function(x, chunksize) {
split(x, ceiling(seq_along(x)/chunksize))
}
UID_chunks <- chunkize(ids, 500)
get_qsums <- function(uid) {
GET(url, query = list(db = database, id = paste(uid, collapse = ",")))
}
qsums <- lapply(UID_chunks, get_qsums)
lapply(qsums, content)
}
# Get document summaries
sumcont <- get_docsums(ids)
# Number of chunks
length(sumcont)
## [1] 27
After downloading, docsummaries needs to be extracted from XML format for further processing:
library(XML)
extract_docsums <- function(xmldocument){
d <- xmlParse(xmldocument) %>% xmlRoot
items <- d[1]$DocSum %>%
xmlSApply(xmlGetAttr, name = "Name") %>%
unlist() %>%
c("Id",.) %>%
unname()
d %>%
xmlSApply(. %>% getChildrenStrings) %>%
t %>%
as_data_frame %>%
set_colnames(items)
}
ds <- sumcont %>% lapply(extract_docsums) %>% bind_rows()
ds
## # A tibble: 13,370 x 28
## Id Accession GDS
## <chr> <chr> <chr>
## 1 200099676 GSE99676
## 2 200098985 GSE98985
## 3 200098984 GSE98984
## 4 200098651 GSE98651
## 5 200098650 GSE98650
## 6 200076573 GSE76573
## 7 200089265 GSE89265
## 8 200095711 GSE95711
## 9 200082240 GSE82240
## 10 200086321 GSE86321
## # ... with 13,360 more rows, and 25 more variables: title <chr>,
## # summary <chr>, GPL <chr>, GSE <chr>, taxon <chr>, entryType <chr>,
## # gdsType <chr>, ptechType <chr>, valType <chr>, SSInfo <chr>,
## # subsetInfo <chr>, PDAT <chr>, suppFile <chr>, Samples <chr>,
## # Relations <chr>, ExtRelations <chr>, n_samples <chr>,
## # SeriesTitle <chr>, PlatformTitle <chr>, PlatformTaxa <chr>,
## # SamplesTaxa <chr>, PubMedIds <chr>, Projects <chr>, FTPLink <chr>,
## # GEO2R <chr>
Now the data can be summed up by the PDAT
– GEO publication date variable and then we have cumulative counts ready to be plotted. Results show that expression profiling by sequencing has seriously taken off as the number of datasets in NCBI GEO is accumulating exponentially (Figure 2).
library(lubridate)
pdat <- ds %>%
select(PDAT, PubMedIds) %>%
mutate(pub=nchar(PubMedIds)!=0) %>%
group_by(PDAT) %>%
summarise(N = n(),
pub = sum(pub)) %>%
mutate_at(vars(N, pub), cumsum)
pdat %<>% gather(key,value, -PDAT)
pdat %>%
ggplot(aes(ymd(PDAT), value, linetype=key)) +
geom_line() +
ylab("Number of GEO series") +
xlab("Date") +
scale_linetype_discrete(labels=c("GEO series","GEO series with\npublications")) +
theme(legend.position = c(.35, 0.8),
legend.background = element_blank(),
legend.title = element_blank())
How big is the time gap between publishing article and related GEO dataset and which journals publish most high-throughput sequencing papers.
Let’s have a look at the published high-throughput expression/sequencing papers. How big is the time gap between publishing article and related GEO dataset and which journals publish most high-throughput sequencing papers. I got already dataset publication dates (PDAT
), so I need to download article publication data from PubMed. To download articles summary data I use PubmedIds
from GEO Series document summaries.
# Extract PubMed Ids
pmid <- ds %>% filter(PubMedIds!="") %$% PubMedIds
# PubMed should be queried one-by-one
pubmed_summary <- function(uid){
url <- "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi"
GET(url, query = list(db = "pubmed", id = uid))
}
# NB! This step takes time
pubmed <- data_frame(PubMedIds = pmid) %>%
mutate(docsums = map(pmid, ~{message(.x); pubmed_summary(.x)}))
I extract info from downloaded summaries, convert into data.frame and join pubmed data with GEO data using PubMedIds
:
# Extract document summaries
pubmed_sums <- pubmed %>% mutate(docsums = map(docsums, ~try(extract_docsums(.x), silent=T)))
## Entity 'nbsp' not defined
pubmed_sums %<>%
filter(!map_lgl(docsums, ~inherits(.x,"try-error"))) %>%
unnest
# Merge with GEO doc summaries
merged_ds <- left_join(select(pubmed_sums, -Id), select(ds, Id, Accession, PubMedIds, PDAT, GPL))
# Parse dates into common format
merged_ds <- mutate_at(merged_ds, vars(PDAT,PubDate, EPubDate), ymd) %>%
select(Accession,PubMedIds,PDAT,PubDate,EPubDate,Source,LastAuthor,GPL)
# If PubDate is missing, use EPubDate
merged_ds %<>%
mutate(PubDate = if_else(is.na(PubDate), EPubDate, PubDate))
# Records still missing publication date
no_pubdate <- filter(merged_ds, is.na(PubDate))
# Calculate differences
merged_ds %<>% mutate(pubdiff = PDAT-PubDate)
Nice! In accordance with journal data sharing policies, majority of datasets are made public almost synchronously with article publication date (Figure 3). 125 articles referencing 152 GSE Series lack publication date in their document summaries.
library(grid)
library(gridExtra)
h <- ggplot(merged_ds, aes(pubdiff)) +
geom_histogram(bins = 60) +
xlab("Time difference in days") +
ylab("Number of GEO Series")
library(MASS) # rlm because of outliers
p <- ggplot(merged_ds, aes(PubDate, PDAT)) +
geom_point() +
xlab("Article publication date") +
ylab("Dataset publication date") +
geom_smooth(method = "rlm")
ggp <- lapply(list(h, p), ggplotGrob)
ggp <- arrangeGrob(grobs = ggp, ncol = 2)
grid.draw(ggp)
detach("package:MASS", unload=TRUE) # masks dplyr::select()
Top journals publishing high-throughput sequencing data is shown on Figure 4. Interestingly, PLosOne is one of the top publishers of these studies. When we get there, it would be interesting to see if there are any quality differences between studies published in Nature and PLoSOne or publications ending up in Nature Communications instead of Nature.
# Summarise studies by journal
top <- select(merged_ds, Accession, Source) %>%
group_by(Source) %>%
summarise(N=n()) %>%
arrange(desc(N))
# Plot top25 publishers
ggplot(top[1:25,], aes(Source, N)) +
geom_point() +
scale_x_discrete(limits = top$Source[1:25]) +
scale_y_continuous(limits = c(0, 1200)) +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5),
axis.title.x = element_blank()) +
ylab("Number of articles")
What are the most popular sequencing platforms in use:
# Some dataset use more than one GPL (platform)
library(stringr)
plat <- ds %>%
select(Accession, GPL, PDAT, n_samples) %>%
mutate(GPL = str_split(GPL,";")) %>%
unnest()
# Summarise platform submissions, filter out datasets with missing GPL info
plat_sum <- plat %>%
mutate(N = nchar(GPL)!=0) %>%
filter(N) %>%
group_by(GPL) %>%
arrange(GPL, PDAT) %>%
mutate_at("N", cumsum)
# Top 10 most popular platforms: to narrow down selection
popular_gpl <- sort(table(plat$GPL), decreasing = T)
top_gpl <- plat_sum %>%
filter(GPL %in% names(popular_gpl[1:10]))
# GPL ids to names: add human readable names to platforms
library(GEOquery)
top_gpl_names <- top_gpl %>%
select(GPL) %>%
distinct() %>%
mutate(title = map_chr(GPL, ~{gpl <- getGEO(paste0("GPL",.x)); gpl@header$title}))
# Abbreviate species names
abbr_species <- function(x){
sp <- paste(tail(unlist(str_extract_all(x, "\\b\\w")), 2), collapse = "")
replacement <- paste0("\\(", sp, "\\)")
str_replace(x, "\\(.*\\)", replacement)
}
top_gpl_names %<>%
mutate(Platform = abbr_species(title))
# Merge with publication data
top_gpl %<>% left_join(top_gpl_names)
All top 10 most popular platforms come from Illumina (Figure 5). Interestingly, the number of human and mouse datasets sequenced using same platforms grow at very similar rate.
library(ggthemes)
top_gpl %>%
filter(GPL%in%names(popular_gpl[1:10])) %>%
ggplot(aes(ymd(PDAT), N, color = Platform)) +
geom_line(size=1) +
scale_color_tableau() +
ylab("Cumulative number of datasets") +
xlab("Publication date")
This is it, my first post. Next post will be about identifying, downloading and importing of supplemental files for GEO Accessions.
Last update: 2017-05-23 11:35:31


VisiblePositions created at [html, x] where html is non-editable should descend into an editable body, for convenience. Everything on this page should be selected.


(project aborted, mostly because I could not find a way to make the gameplay interesting when levels size scale)


Each entry on this page defines a connection to a particular device on a
Bacula storage daemon. Typically the daemon runs on the same system, but it
is possible to define more than one daemon, some of which are on remote hosts
with different tape drive types or more disk space.
The important attributes for each daemon are :
- Storage name
- A unique name used on this system to identify the daemon.
- Bacula SD password
- This field must contain the password used by the storage daemon on the remote system, which can be found in the /etc/bacula/bacula-sd.conf file.
- Hostname or IP address
- The fully qualified hostname or IP of the system running the storage daemon.
- Storage device name
- Each storage daemon can define one or more devices, each of which corresponds to a different directory or tape drive. This field determines which device this particular daemon connection uses.
- Media type name
- This field must contain a short name for the type of media used by the storage device, such as File or DDS-2. It must be the same as the media type in the Storage Devices section on the storage server.
Often it is useful to have more than one entry for the same host on this page,
each of which has a different storage device. This allows you to create backups
that write to different directories or tape drives.
If the TLS options are shown on the storage daemon form, they can be used
to enable secure communication between the director and the remote storage
server. This is typically not necessary in a simple Bacula configuration, as
the storage and director daemons usually run on the same system.


OHM Vehicles are the perfect cars to propel you into the
electric future. Powered with electricity, our vehicles take
into consideration the ever growing problems of our world.
Choosing the right car has never been easier ~ whatever you need, OHM can offer.
Top Choices
Model 3
Model 3
Get where you need to with speed and confidence. Model 3 sets a new standard, offering top class acceleration.
Model 5
Model 5
Take to the road with comfortable and reliable driving. Model 5's specially-designed motors allow for vastly improved handling and traction control.
Model 2
Model 2
One of the safest SUVs on the market, Model 2 allows for stable driving both on and off road.
Embrace the future with OHM vehicles.
The world is changing. By 2030, nearly one-third of all vehicles in America are predicted to be electric. As we move towards this future, choosing the right car for you will be important. Whether or not electric is for you, OHM is for you. Built from environmentally conscious materials, OHM vehicles offers a simple and affordable alternative to fossil fuels.
---
Model Specs
Model 3
$ 67,000
Acceleration: 3.1s (0-60 MPH)
Weight: 4,186 Ibs
Range: 355 miles
Cargo: 16 cubic ft
Wheels: 19"
Model 5
$ 58,000
Acceleration: 2.8s (0-60 MPH)
Weight: 4,751 Ibs
Range: 327 miles
Cargo: 31 cubic ft
Wheels: 19"
Model 2
$ 74,000
Acceleration: 2.6s (0-60 MPH)
Weight: 5,304 Ibs
Range: 306 miles
Cargo: 107 cubic ft
Wheels: 21"
---
Model Design
Safety comes first...
Each of our models are designed with safety in mind. Specialized front and side impact protection minimizies deceleration and aftershock in the event of a crash. The frame of our models are designed to absorb as much energy as possible, helping to reduce occupant velocity in crashes. In order to reduce rollover risk, the center of weight for our models are all positioned very low to help hold the car down firmly.
Extended warranty...
Our models each come with a 4 year or 60,000 mile warranty. Regardless of which one you reach first, we have you covered. In addition to the car itself, our warranty covers problems with the engine, transmission/transaxle, transfer case, and drivetrain. NRust and corrosion with also be covered. All OHM vehicles are also provided with a Federal Emissions warranty, lasting 8 years and covering you if your vehicle doesn't meet the EPA-required emissions standards.
Peak performance...
While affordable, our vehicles are also designed for top-notch performance. OHM's All-Wheel Drive runs on two motors, each helping to control wheel torque and reduce skidding. Each vehicle is capable of running on either motor, so if one breaks down you're car will still operate efficiently. Hyper responsive wheels and brakes, combined with lowered suspension, gives the driver secure control over the vehicle at all times.
OHM Vehicles are incredibly reliable. My Model 3 is still in amazing condition after three years of hour long commutes.
- Richard, Jouranlist
My Model 2 carries heavy loads without a sweat. It has all the space and durability I need.
- Susan, Engineer
My kids and I absolutely love our Model 5. The inside is comfortable and cool, making long road trips bearable.
With electric vehicles rapidly rising in popularity... What makes them better?
Electric vehicles cost less to operate than normal vehicles - the electricty required to charge your car costs significantly less than using petroleum.
All you need to charge an electric vehicle is an electric grid. As such, your car can be charged virtually anywhere where you have access to electricity. The U.S, along with many other countries, are rapidly establishing charging stations as well.
You're helping our world. Electric vehicles produce much less pollution than gas-dependent cars. As an environmentally concerned company, OHM vehicles are also made with eco-friendly materials.


Designing User Interfaces
Janice Prakash
user interface, ui, software interface
The book Of Mice and Screens by Aldus Brandywine is one of the best introductions to the vast topic of designing user interfaces.


Market Pulse on November 13th
by Olivier Rigot, EMC Gestion de FortuneS&P 500 3094,04, 0,07%.
A day of consolidation with not much to report, prices are resisting any selling pressure and bargain hunting is at work whenever prices drift somehow. Weekly sentiment indicators are for a second week on a row stretched as the bull to bear ratio stands at 164, historically an elevated ratio pointing out to some kind of compacency from private investors. The last time the ratio hit this level was at the end of July, just before the summer swift correction, a potential warning.


| Interface | Description |
|---|---|
| BarbelHisto<T> |
The main abstraction of
BarbelHisto that provides the client API. |
| BarbelHistoContext |
Delivers the configuration set by
BarbelHistoBuilder to the
application components. |
| BarbelModeProcessor |
| Class | Description |
|---|---|
| BarbelHistoBuilder |
Builder class for
BarbelHisto . |
| BarbelHistoCore<T> |
The core component of
BarbelHisto . |
| BarbelHistoCore.UpdateLogRecord | |
| BarbelQueries |
Convenience methods to perform queries on
BarbelHisto.retrieve(Query)
and the like. |
| BarbelQueryOptions |
Convenience class to pass options to
BarbelHisto.retrieve(com.googlecode.cqengine.query.Query, QueryOptions) . |
| DocumentJournal |
Document Journal abstraction to work on for internal processing in
BarbelHistoCore and for the client. |
| DocumentJournal.JournalReader |
| Enum | Description |
|---|---|
| BarbelMode | |
| DocumentJournal.ProcessingState |
| Annotation Type | Description |
|---|---|
| DocumentId |
Annotation to identify the primary key of a business type.
|
Copyright © 2019 Project Barbel. All rights reserved.


This is an example of an incomplete art...
This blog was generated using the Exaltation blog maker by Christopher Diggins.


Name
Email
Major
Set
Biology
Chemistry
CS
Engineering
Math
Physics
Joint Chemistry/Biology
Joint CS/Math
Joint Math/Comp/Bio
Joint Math/Physics
Path
Set
Job
Graduate school
Gap year
Not sure
Name
Summer plans
Summer plans
Email
City
Summer city
Major
State
Locate
Summer state
Locate
Path
Country
Summer country
City and state
City coordinates
Set
Summer city coordinates
Set
Organization
Organization
Locate
Summer organization
Locate
Summer organization
Organization coordinates
Set
Summer organization coordinates
Set
Summer city and state
Comments
Comments
Show Facebook profile?
Facebook profile
Organization link
Summer organization link
Next
Download
Upload
Post-graduation email
Phone number
Post-graduation email
Phone number


Manual
Community support is available at UrlRewrite on StackOverflow.
Read examples of usage and a sample of the ant task report. If you have any suggestions/examples for this manual please post them to the group.
Install
- Add Maven dependency below or add
urlrewritefilter-5.0.0.jar
directly into your WEB-INF/lib directory.
<dependency> <groupId>org.tuckey</groupId> <artifactId>urlrewritefilter</artifactId> <version>5.0.0</version> </dependency>
- Add the following to your WEB-INF/web.xml (add it near the top above your
servlet mappings (if you have any)): (see filter
parameters for more options)
<filter> <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> </filter> <filter-mapping> <filter-name>UrlRewriteFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
- Add urlrewrite.xml into your WEB-INF directory. (src/main/webapp/WEB-INF/ for Maven users)
- Restart the context.
You can visit http://<IP_ADDRESS>:8080/rewrite-status (or whatever the address of your local webapp and context) to see output (note: this page is only viewable from localhost).
Filter Parameters
There are a few advanced filter parameters for enabling conf file reloading etc. There are self-explanatory.
<filter> <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>  <init-param> <param-name>confReloadCheckInterval</param-name> <param-value>60</param-value> </init-param>  <init-param> <param-name>confPath</param-name> <param-value>/WEB-INF/urlrewrite.xml</param-value> </init-param>  <init-param> <param-name>logLevel</param-name> <param-value>DEBUG</param-value> </init-param>  <init-param> <param-name>statusPath</param-name> <param-value>/status</param-value> </init-param>  <init-param> <param-name>statusEnabled</param-name> <param-value>true</param-value> </init-param>  <init-param> <param-name>statusEnabledOnHosts</param-name> <param-value>localhost, dev.*.myco.com, *.uat.mycom.com</param-value> </init-param>  <init-param> <param-name>statusEnabledOnHosts</param-name> <param-value>localhost, dev.*.myco.com, *.uat.mycom.com</param-value> </init-param>  <init-param> <param-name>modRewriteConf</param-name> <param-value>false</param-value> </init-param>   </filter> <filter-mapping> <filter-name>UrlRewriteFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
Note, setting logLevel
to slf4j
will cause the built in logging to
call slf4j as if it was the logging framework,
obviously you will need to have the jar for slf4j in your classpath.
Configuration File WEB-INF/urlrewrite.xml
|
<urlrewrite>
<rule>
<outbound-rule>
<class-rule>
<name> <note> <condition> <from> <to> <set> <run> Back References Variables Functions |
Configuration is done via a simple XML file that lives in your WEB-INF
folder. It should be named
urlrewrite.xml.
It may be helpful to read the UrlRewriteFilter DTD
(Document Type Definition). Please also make sure you look at the examples. A simple
configuration file looks like:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 5.0//EN" "http://www.tuckey.org/res/dtds/urlrewrite5.0.dtd"> <urlrewrite> <rule> <from>^/some/olddir/(.*)$</from> <to type="redirect">/very/newdir/$1</to> </rule> <rule match-type="wildcard"> <from>/blog/archive/**</from> <to type="redirect">/roller/history/$1</to> </rule> </urlrewrite>
The urlrewrite.xml file must have a root element called "urlrewrite" and must contain at least one "rule" element.
A "rule" must contain a "from" and a "to", and can have zero or more "condition" elements and zero or more and/or "set" elements.
When a "rule" is processed against an incoming request, all the "condition" elements must be met, then the "from" will be applied to the request URL and the final URL generated by applying the "to" to the "from" pattern. So long as the rule has matched then the "set" will be run.
When executing a rule the filter will (very simplified) loop over all rules and for each do something like this psuedo code:
Pattern.compile(<from> element); pattern.matcher(request url); matcher.replaceAll(<to> element); if ( <condition> elements match && matcher.find() ) { handle <set> elements (if any) execute <run> elements (if any) perform <to> element (if any) }
<urlrewrite> element
The top level element.
| Attribute | Possible Value | Explanation |
|---|---|---|
| default-match-type (optional) |
regex (default) | All rules and thier conditions will be processed using the Java Regular Expression engine (unless
match-type is specified on a rule). |
| wildcard | All rules and thier conditions will be processed using the Wildcard Expression
engine
(unless match-type is specified on a rule). |
|
| decode-using (optional) |
header,utf8 (default) | When URL is decoded request.getCharacterEncoding() will be used, if that is empty UTF-8 will be used. |
| null | Do not decode at all. (note, this means the literal string null e.g. decode-using="null") | |
| header | Only use request.getCharacterEncoding() to decode. | |
| [encoding] | Only use a specific character encoding eg, ISO-8859-1. See Java Charset Object for all character encodings. | |
| header,[encoding] | When URL is decoded request.getCharacterEncoding() will be used, if that is empty a specific character encoding eg, ISO-8859-1. See Java Charset Object for all character encodings. | |
| use-query-string (optional) |
false (default) | The query string will not be appended to the url that the "from" element matches against. |
| true | The query string will be appended to the url that the "from" element matches against. | |
| use-context (optional) |
false (default) | The context path will not be added to the url that the "from" element matches against. |
| true | The context path will be added to the url that the "from" element matches against. |
<rule> element
Zero or more. The basis of a rule.
| Attribute | Possible Value | Explanation |
|---|---|---|
| enabled (optional) |
true (default) | Enable this rule. |
| false | Disable this rule. | |
| match-type (optional) |
regex (default) | This rule and it's conditions will be processed using the Java Regular Expression engine. |
| wildcard | This rule and it's conditions will be processed using the Wildcard Expression engine. |
In the following example requests for /world/usa/nyc
will be transparently forwarded to
/world.jsp
<rule match-type="regex"> <from>^/world/([a-z]+)/([a-z]+)$</from> <to>/world.jsp</to> </rule>
<rule match-type="wildcard"> <from>/world/*/*</from> <to>/world.jsp</to> </rule>
<outbound-rule> element
Zero or more. This is very similar to a normal rule but it is used for rewriting urls that go through
response.encodeURL()
.
| Attribute | Possible Value | Explanation |
|---|---|---|
| enabled (optional) |
true (default) | Enable this rule. |
| false | Disable this rule. | |
| encodefirst (optional) |
false (default) | Run encodeURL() after running this outbound rule. |
| true | Run encodeURL() before running this outbound rule. |
May contain "run", "from", "to" and "set" element(s) also. Example:
<outbound-rule> <from>^/world.jsp?country=([a-z]+)&city=([a-z]+)$</from> <to>/world/$1/$2</to> </outbound-rule>
Using the example above JSP's with the code
<a href="<%= response.encodeURL("/world.jsp?country=usa&city=nyc")
%>">nyc
will output
nyc
Or JSTL
<a href="<c:url value="/world.jsp?country=${country}&city=${city}"
/>">nyc
will output
nyc
Note, If you are using JSTL (ie, <c:url) this will work also.
<name> element
An optional element used for documenting the name of the rule. This can be used with rule and outbound-rule. See ant task.
<rule> <name>World Rule</name> <from>^/world/([a-z]+)/([a-z]+)$</from> <to>/world.jsp?country=$1&city=$2</to> </rule>
<note> element
A simple optional element used for documentation of the rule. This can be used with rule and outbound-rule. See ant task.
<rule> <name>World Rule</name> <note> Cleanly redirect world requests to JSP, a country and city must be specified. </note> <from>^/world/([a-z]+)/([a-z]+)$</from> <to>/world.jsp</to> </rule>
<condition> element
An element that lets you choose conditions for the rule. Note, all conditions must be met for the rule to be run (unless "next" is set to "or" obvoiusly).
Value can be any Regular Expression.
| Attribute | Possible Value | Explanation |
|---|---|---|
| type (optional) |
header (default) | If used, the header name must be specified in the "name" attribute. |
| method | The method of the request. GET, POST, HEAD etc. | |
| port | The port that the web application server is running on. | |
| time |
Current time at the server (this will be the number of seconds since 00:00:00 1970-01-01 UTC otherwise known as unix
time).
i.e. (new Date()).getTime()
This can be used for making sure content goes live only at a time you set. | |
| year |
Current year at the server.
i.e. (Calendar.getInstance()).get(Calendar.YEAR)
| |
| month |
Month at the server. January is 0
i.e. (Calendar.getInstance()).get(Calendar.MONTH)
| |
| dayofmonth |
Day of the month at the server. March first is 1
i.e. (Calendar.getInstance()).get(Calendar.DAY_OF_MONTH)
| |
| dayofweek |
Day of the week at the server. Saturday is 1, Sunday is 7
i.e. (Calendar.getInstance()).get(Calendar.DAY_OF_WEEK)
| |
| ampm |
AM or PM time at the server.
i.e. (Calendar.getInstance()).get(Calendar.AM_PM)
| |
| hourofday |
The hour of the day (24 hour clock) at the server. 10pm is 22
i.e. (Calendar.getInstance()).get(Calendar.HOUR_OF_DAY)
| |
| minute |
The minute field of the current time at the server.
i.e. (Calendar.getInstance()).get(Calendar.MINUTE)
| |
| second |
The second field of the current time at the server.
i.e. (Calendar.getInstance()).get(Calendar.SECOND)
| |
| millisecond |
The millisecond field of the current time at the server.
i.e. (Calendar.getInstance()).get(Calendar.MILLISECOND)
| |
| attribute |
Will check the value of a request attribute (don't confuse this with parameter!), name must be set when
using this type.
i.e. request.getAttribute([name])
| |
| auth-type |
Will check the value of a request attribute (don't confuse this with parameter!)
i.e. request.getAuthType()
| |
| character-encoding |
The character encoding of the imcoming request.
i.e. request.getCharacterEncoding()
| |
| content-length |
The length of the imcoming request (can be useful if you want to deny large requests).
i.e. request.getContentLength()
| |
| content-type |
The type of the imcoming request. (this is probably not that useful)
i.e. request.getContentType()
| |
| context-path |
The context path of the imcoming request.
i.e. request.getContextPath()
| |
| cookie |
The value of a cookie, note, name must be specified to use this
i.e. request.getCookies()
the find we the one with [name] specified and check the value.
| |
| parameter |
A tidier way of checking request parameters than looking for them in the query string. This will check for the
parameter in GET or POST, note, name must be specified.
i.e. request.getParameter([name])
| |
| path-info |
i.e. request.getPathInfo()
| |
| path-translated |
i.e. request.getPathTranslated()
| |
| protocol | The protocol used to make the request, e.g. HTTP/1.1
i.e. request.getProtocol()
| |
| query-string | The query string used to make the request (if any), e.g. id=2345&name=bob
i.e. request.getQueryString()
| |
| remote-addr | The IP address of the host making the request, e.g. <IP_ADDRESS>
i.e. request.getRemoteAddr()
| |
| remote-host | The host name of the host making the request, e.g. 123qw-dsl.att.com (note,
this will only work if your app server is configured to lookup host names, most aren't).
i.e. request.getRemoteHost()
| |
| remote-user | The login of the user making this request, if the user has been authenticated, e.g. bobt
i.e. request.getRemoteUser()
| |
| requested-session-id | Returns the session ID specified by the client, e.g. 2344asd234sada4
i.e. request.getRequestedSessionId()
| |
| requested-session-id-from-cookie | Whether the requested session ID is from a cookie or not
i.e. request.isRequestedSessionIdFromCookie()
| |
| requested-session-id-from-url | Whether the requested session ID is from the URL or not
i.e. request.isRequestedSessionIdFromURL()
| |
| requested-session-id-valid | Whether the requested session ID is valid or not
i.e. request.isRequestedSessionIdValid()
| |
| request-uri | Returns the part of this request's URL from the protocol name up to the query
string in the first line of the HTTP request
i.e. request.getRequestURI()
| |
| request-url | Reconstructs the URL the client used to make the request. The returned URL
contains a protocol, server name, port number, and server path, but it does not include query string parameters.
i.e. request.getRequestURL()
| |
| session-attribute |
(note, name must be set)
i.e. session.getAttribute([name])
| |
| session-isnew |
Weather the session is new or not.
i.e. session.isNew()
| |
| server-name |
The host name of the server to which the request was sent (from the host header not the machine name).
i.e. request.getServerName()
| |
| scheme |
The scheme used for the request, e.g. http or https
i.e. request.getScheme()
| |
| user-in-role |
(Note, the value for this cannot be a regular expression)
i.e. request.isUserInRole([value])
| |
| name (optional) |
(can be anything) | If type is header, this specifies the name of the HTTP header used to run the value against. |
| next (optional) |
and (default) | The next "rule" and this "rule" must match. |
| or | The next "rule" or this "condition" may match. | |
| operator (optional) |
equal (default) | Equals. The operator to be used when the condition is run, the regular expression matches or the values are equal. |
| notequal | Not equal to. (i.e. request value != condition value). | |
| greater | Greater than. (i.e. request value > condition value). Note, this operator only work with numeric rule types. | |
| less | Less than. (i.e. request value < condition value). Note, this operator only work with numeric rule types. | |
| greaterorequal | Greater to or equal to. (i.e. request value >= condition value). Note, this operator only work with numeric rule types. | |
| lessorequal | Less than or equal to. (i.e. request value <= condition value). Note, this operator only work with numeric rule types. |
Examples:
<condition name="user-agent" operator="notequal">Mozilla/[1-4]</condition> <condition type="user-in-role" operator="notequal">bigboss</condition> <condition name="host" operator="notequal">www.example.com</condition> <condition type="method" next="or">PROPFIND</condition> <condition type="method">PUT</condition>
<from> element
You must always have exactly one from for each rule or outbound-rule. Value can be a regular expression in the Perl5 style. Note, from url's are relative to the context.
| Attribute | Possible Value | Explanation |
|---|---|---|
| casesensitive (optional) |
false (default) | This value will be matched using case insentitive match. ie, "/WellingtoN" will match "/wellington". |
| true | This value will be matched using case sentitive match. ie, "/aAa" will NOT match "/aaa". |
Example:
<from>^/world/([a-z]+)$</from>
<to> element
Value can be a regular replacement expression in the Perl5 style.
| Attribute | Possible Value | Explanation |
|---|---|---|
| type (optional) |
forward (default) | Requests matching the "conditions" for this "rule", and the URL in the "from" element will be internally
forwarded
to the URL specified in the "to" element. Note: In this case the "to" URL must be in the same context as
UrlRewriteFilter. This is the same as doing:
RequestDispatcher rq = request.getRequestDispatcher([to value]);
|
| passthrough | Identical to "forward". | |
| redirect | Requests matching the "conditions" and the "from" for this rule will be HTTP redirected.
This is the same a doing:
HttpServletResponse.sendRedirect([to value])) |
|
| permanent-redirect | The same as doing:
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
(note, SC_MOVED_PERMANENTLY is HTTP status code 301) |
|
| temporary-redirect | The same as doing:
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
(note, SC_MOVED_TEMPORARILY is HTTP status code 302) |
|
| pre-include | ||
| post-include | ||
| proxy | The request will be proxied to the full url specified. commons-http and commons-codec must both be in the classpath to use this feature. | |
| last (optional) |
false (default) | The rest of the "rules" will be processed if this one succeeds. |
| true | No more "rules" will be processed if this one is a match. | |
| encode (optional) |
false (default if under rule) | response.encodeURL([to]) will be run on the to url before performing the rewrite. |
| true (default if under outbound-rule) | response.encodeURL([to]) will NOT be called. | |
| context (optional) |
If your application server is configured to allow "cross context" communication then this attribute can be used
to forward (and only forward, not redirect or other "to" types) requests to a named servlet context.
On Tomcat, for instance, the application contexts in the server configuration (server.xml or context.xml) need the option crossContext="true". For instance, the two applications mentioned before ("app" and "forum") have to be defined as: <Context docBase="app" path="/app" reloadable="true" crossContext="true"/>
<Context docBase="forum" path="/forum" reloadable="true" crossContext="true"/>
|
|
| qsappend (optional) |
false (default) | |
| true | Append the query string to the to url when redirecting or forwarding. |
Note, "to" can be null ie, <to>null</to>
, this will mean that the request will go no
further if the rule is matched (ie, this filter will not call chain.doFilter
).
If "to" is set to -, no substitution will take place and the request will go on like nothing happened (ie, this filter will call chain.doFilter
).
<to>/world.jsp?country=$1</to>
To elements can contain backreferences and variables.
Backreferences
%N
Provides access to the grouped parts (parentheses) of the pattern from the last matched Condition in the current rule. N must be less than 10 and greater than 0 (i.e. %1, %2, %3 etc).
Variables
%{VARIABLE-NAME}
Any valid condition type can be used as a variable name. ie,
'%{port}
' will be translated to '80
',
'%{year}
' to '2005
',
'%{cookie:myCookie}
' would be translated to
'myCookieValue
' (assuming the user had a cookie named myCookie with the value myCookieValue).
Valid types are condition types, see condition for a full description.
Functions
${FUNCTION:PARAMS}
Functions can be places in set
and to
elements.
| Name | Example | Example Returns | Explanation |
|---|---|---|---|
| replace | ${replace:my cat is a blue cat:cat:dog} |
my dog is a blue dog | |
| replaceFirst | ${replaceFirst:my cat is a blue cat:cat:dog} |
my cat is a blue dog | |
| escape | ${escape:utf8:a b c} |
a+b+c | Escapes/Encodes string using URLEncoder.encode using the specified encoding. |
| unescape | ${unescape:utf8:a+b+c} |
a b c | Unescapes/Unencodes string using URLEncoder.decode using the specified encoding. |
| lower | ${lower:Hello World} |
hello world | |
| upper | ${upper:hello} |
HELLO | |
| trim | ${trim: abc def } |
abc def |
<set> element
Allows you to set varous things if the rule is matched.
| Attribute | Possible Value | Explanation |
|---|---|---|
| type (optional) |
request (default) | The same as request.setAttribute([name],
[value])
(note, name must be set). |
| session | The same as request.getSesison(true).setAttribute([name],
[value])
(note, name must be set). |
|
| response-header | The same as response.setHeader([name],
[value])
(note, name must be set). |
|
| cookie | Value can be in the format "[value][:domain[:lifetime[:path]]]". This sets a cookie on the client's browser. The cookie's name is specified by the name attribute. The domain field is the domain of the cookie, such as '.apache.org',the optional lifetime is the lifetime of the cookie in seconds, and the optional path is the path of the cookie (note, name must be set). | |
| status | The same as response.setStatus([value])
|
|
| content-type | The same as response.setContentType([value])
|
|
| charset | The same as response.setCharacterEncoding([value])
|
|
| expires | Will set the Expires HTTP header by adding the time specified and current time
(this is mod_expires style). Syntax "{num type}*".
Units can be (singular or plural);
years, months, weeks, days, hours, minutes, seconds.
eg, "1 day 2 seconds", "3 hours", "1 year 1 hour" |
|
| locale | The same as response.setLocale([value])
specify the Locale in the format
(valid
locales are, zh, zh-CN, zh-CN-southern i.e. "-" separating the language, country and variant (if any)).
|
|
| parameter | Enables you to override a request.getParameter(String) with a custom value |
|
| method | Enables you to override request.getMethod() with a custom value |
|
| name (optional) |
(can be anything) | If type is request, session, response-header, cookie this specifies the name item. |
In the following example a request attribute "client" will be set to "AvantGo" or "Samsung SCH-6100", this can be
fetched in a servlet or
JSP using request.getAttribute("client")
.
<rule> <condition name="user-agent">Mozilla/3\.0 (compatible; AvantGo .*)</from> <from>.*</from> <set name="client">AvantGo</set> </rule> <rule> <condition name="user-agent">UP\.Browser/3.*SC03 .* </from> <from>.*</from> <set name="client">Samsung SCH-6100</set> </rule>
It is also possible to use regular replacement expressions as part of the value similar to their usage in <to> elements:
<rule> <from>/products/(.*)/(.*)/index.html</from> <set name="urlrewrite.product.slug">$1</set> <set name="urlrewrite.product.id">$2</set> <to>/products?slug=$1&id=$2</to> </rule>
<run> element
Allows you to run a method on an object when a rule and it's conditions are matched.
| Attribute | Possible value | Explanation |
|---|---|---|
| class | The class you want to run a method on. Must be a fully qualified name. | |
| method (optional) | run (default) | The method you want to run, the method must have the parameters (HttpServletRequest, HttpServletResponse)
e.g. run(HttpServletRequest request, HttpServletResponse response)
Note, if init(ServletConfig) or destroy() is found they will be run at when
creating
or destroying an instance.
|
| neweachtime (optional) | false (default) | One instance for each UrlRewriteFilter instance. |
| true | A new instance of the class will be created before running each time set to true. |
When the rule in the following example is matched, WorldServlet.goGet(HttpServletRequest,
HttpServletResponse)
will be invoked, the request will then be forwarded to /world-presentation.jsp
.
<rule> <from>^/world/[a-z]+/[a-z]+$</from> <run class="com.blah.web.WorldServlet" method="doGet" /> <to>/world-presentation.jsp</to> </rule>
Note, you can specify init-param's the same way you would for a servlet.
<run class="com.blah.web.MyServlet" method="doGet"> <init-param> <param-name>someParamName</param-name> <param-value>10</param-value> </init-param> </run>
If the method being called throws an Exception the original exception will be re-thrown as if it were the original if it extends RuntimeException (eg, NullPointer), other exceptions are wrapped in a ServletException and thrown so your container can handle them.
<class-rule> element
Allows you to run a method every time a request come in for 100% dynamic rules. See the org.tuckey.web.filters.urlrewrite.sample package for an example.
| Attribute | Explanation |
|---|---|
| class | The class you want to run a method on. Must be a fully qualified name. |
| method (optional, default matches) | The method you want to run, the method must have the parameters (HttpServletRequest, HttpServletResponse)
e.g. run(HttpServletRequest request, HttpServletResponse response)
Note, if init(ServletConfig) or destroy() is found they will be run at when
creating or destroying an instance.
|
| last (optional, default true | If false more rules will be processed following this rule even if it is matched (so that a better match may be found). |
Example:
<class-rule class="com.blah.web.MyRuleClass" />
Tips
- When you want to put an "&" in a rule you must enter it as the XML entity "&"
- For simplicity you might want to start all from's with a
^
and end them with a$
.
In regular expressions^
specifies the start of the string and$
specifies the end.
ie, a request for/my/url/path
will NOT match<from>^/url/$</from>
but it will match<from>/url/</from>
- If using
<outbound-rule>
remember all urls in your code must be encoded e.g.<a href="<%= response.encodeURL("/some/olddir/b.jsp") %>">my link
- Regular expressions are complex and a bit tricky at times, read regular expression syntax for Java.
- If you find regular expressions difficult use Wildcards.
- "Context" is important. If you have an app with the context "/myapp" and you request the url "/myapp/somefolder/somepage.jsp", the container tells UrlRewriteFilter that the url is "/somefolder/somepage.jsp". This can be confusing, but basically your rules and conditions should not contain the context path (it will be handled by the container).
Wildcard Matching Engine
The wildcard matching engine can be used instead of regex. It is supported in conditions and rules
where match-type
is set to wildcard
(or default-match-type is set on the
urlrewrite element
e.g. /big/url/*
will match /big/url/abc.html
but will NOT
match /big/url/abc/dir/
or /big/url/abc/
.
/big/url/**
will match /big/url/abc.html
, /big/url/abc/dir/
and
/big/url/abc/
.
You can also use Regular expression style variable replacement, each match of a *
will
be available for use in to
and set
elements using simple $1
$2
variables.
e.g. /my/big/url/*
will match /my/big/url/abc.html
and $1
will be set to abc.html
.
Added in 3.0
Ant Task
An Ant task has been written to allow validate the conf file and generation of documentation. You can view a sample.
Paste the following into your build.xml file, then change the dest
and conf
to point to the correct places. Note, the urlrewrite jar
file will need to be in your classpath.
<target name="urlrewrite-doc" depends="compile" description="UrlRewriteFilter validation and documenting"> <taskdef name="urlrewritedoc" classpath="lib/urlrewritefilter-5.0.0.jar" classname="org.tuckey.web.filters.urlrewrite.UrlRewriteDocTask" /> <urlrewritedoc conf="${build.home}/WEB-INF/urlrewrite.xml" dest="urlrewrite-conf-overview.html" /> </target>
mod_rewrite Style Configuration
Sample web.xml snippet:
<filter> <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>  <init-param> <param-name>modRewriteConfText</param-name> <param-value><![CDATA[ # redirect mozilla to another area RewriteCond %{HTTP_USER_AGENT} ^Mozilla.* RewriteRule ^/no-moz-here$ /homepage.max.html [L] ]]></param-value> </init-param> </filter> <filter-mapping> <filter-name>UrlRewriteFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
OR alternately set modRewriteConf to true in filter parameters and add a WEB-INF/.htaccess
file with
your mod_rewrite style configuration in it.
<filter> <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>  <init-param> <param-name>modRewriteConf</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>UrlRewriteFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
Sample: WEB-INF/.htaccess
# redirect mozilla to another area RewriteCond %{HTTP_USER_AGENT} ^Mozilla.* RewriteRule ^/no-moz-here$ /homepage.max.html [L]
Documentation for the original mod_rewrite library mostly applies, differences are documented below.
| Attribute | Explanation |
|---|---|
| RewriteLogLevel | Specified as int, trasnlated as: <= 1 - FATAL, 2 - ERROR, 3 - INFO, 4 - WARN, >= 5 DEBUG |
| RewriteLog | SYSOUT, SYSERR, slf4j (if not set, servlet context logging will be used) |
| RewriteRule |
Supported but note:
|
| RewriteBase | Not supported |
| RewriteLock | Not supported |
| RewriteMap | Not supported |
| RewriteOptions | Not supported |