--- layout: post title: Build a Realtime Event Bus with Firebase and Angular date: 2015-08-10 16:58:57.000000000 -07:00 type: post published: true status: publish categories: - AngularJS - Firebase - JavaScript - Programming tags: [] meta: _wpcom_is_markdown: '1' _edit_last: '8' _nina_cross_promo: a:1:{s:8:"template";s:17:"custom_1399328552";} _thumbnail_id: '1068' _yoast_wpseo_primary_category: '' author: login: ohmadmin email<EMAIL_ADDRESS>display_name: Lukas Ruebbelke first_name: Lukas last_name: Ruebbelke ---
"We think Firebase is just what we need to get rid of this crazy long polling stuff we are doing but what about HIPAA compliance?" This was the challenge that I found myself in awhile back as I was working with a health care startup. Realtime capabilities was going to take their application to the next level but they had some serious considerations around how they could store their data as it had potentially sensitive patient information. The solution is to use Firebase as an event bus that monitors a minimal amount of information on the Firebase servers and when a change is detected, your application then queries the main servers for the full object.
I have prepared a handy diagram to illustrate the event flow as you can see below.
To put this into concrete terms, I have a medical app that stores medical supply orders that I want to monitor the progress of the order as it is being fulfilled. All of the orders would live on the main server with a corresponding Firebase record that contained a unique ID and a timestamp. When an order was updated at the main server, the server would update the timestamp at the Firebase record using the REST API that comes with Firebase. All connected clients would detect that the timestamp of the Firebase object was updated and would then make a REST call to the main server to get the new and updated order.
For the sake of demonstration, I am using Firebase to play the part of the compliant server as well as the realtime event bus. Before we dig into the code, let us take a quick moment to look at our data structures at the servers.
The full object has an ID property as its key and a title and description property as you can see below.
The condensed, realtime object shares the same ID for its key and has a update_at property which contains a timestamp. Other than the actual ID to the object, there is no personally identifying data being stored in the realtime object.
The source files for this example are structured to represent two entirely separate entities. The two main folders in the project are the server folder and the realtime folder. The server folder represents the compliant server portion of the equation while the realtime folder represents the event bus portion of the equation.
I believe we are ready to get started, so grab the code and let's go!
[button link="https://github.com/simpulton/angular-firebase-event-bus" size="large" window="yes"]Code[/button]
We are going to start with the REST client that communicates with the compliant server. This majority of this section is going to be a composition of basic Angular techniques but still worth covering so that we can understand the entire lifecycle of the event bus.
The first piece to communicating with the compliant server is the RESTService which uses the $http service to perform standard REST calls. We have two convenience functions, getUrl and getUrlWithId to construct our endpoints. We are pointing to the base URI which we defined as a constant service called RESTFUL_URI in the server/server.js file. We are pointing to the orders endpoint and adding the .json extension because this is what Firebase requires.
I have used this technique on a few different backends and this part will change slightly depending on what you are using. The critical point is that you can make RESTful calls to your server.
And from here we have some pretty standard REST calls that are wrapped in the all, fetch, create, update and destroy methods.
[js]
app.factory('RESTService', function ($http, RESTFUL_URI) {
var getUrl = function () {
return RESTFUL_URI + 'orders.json';
};
var getUrlWithId = function (orderId) {
return RESTFUL_URI + 'orders/' + orderId + '.json';
};
var all = function () {
return $http.get(getUrl());
};
var fetch = function (orderId) {
return $http.get(getUrlWithId(orderId));
};
var create = function (title, description) {
var params = {
title: title,
description: description
};
return $http.post(getUrl(), params);
};
var update = function (orderId, title, description) {
var params = {
title: title,
description: description
};
return $http.put(getUrlWithId(orderId), params);
};
var destroy = function (orderId) {
return $http.delete(getUrlWithId(orderId));
};
return {
all: all,
fetch: fetch,
create: create,
update: update,
destroy: destroy
};
});
[/js]
Now that we have a way to communicate with the compliant server, it is time to build out the controller what will consume the RESTService service. In the ServerCtrl, we have create a few basic methods to marshall events from the view to our RESTService service. The methods in the ServerCtrl are fairly self-documenting and do exactly what they say. The one thing that I would like to point out is that I have left markers in the code for where we are going to hook up our calls to the realtime objects in the completed promises of our initial REST calls. We will fill those out in just a moment.
[js]
app.controller('ServerCtrl', function ($scope, RESTService, RealtimeService) {
var server = this;
server.newOrder = {
title: '',
description: ''
};
server.resetForm = function () {
server.newOrder = {
title: '',
description: ''
};
};
server.getOrders = function () {
RESTService.all()
.then(function (result) {
server.orders = result.data !== 'null' ? result.data : {};
});
};
server.createOrder = function (title, description) {
RESTService.create(title, description)
.then(function (result) {
server.getOrders();
server.resetForm();
// Realtime stuff coming
});
};
$scope.updateOrder = function (id, title, description) {
RESTService.update(id, title, description)
.then(function (result) {
// Realtime stuff coming
});
};
$scope.removeOrder = function (id) {
RESTService.destroy(id)
.then(function () {
server.getOrders();
// Realtime stuff coming
});
};
server.getOrders();
});
[/js]
Firebase has provided realtime libraries for just about major language and web framework that exists but it is not as widely known that you can interact with Firebase endpoints via a REST API as well. This was implied as we are using Firebase to approximate our compliant server, but it becomes a bit more explicit when we use REST to communicate to an object that we are also using AngularFire to monitor in realtime. Our RealtimeService looks quite similar to our RESTService in terms of structure, albeit slightly more concise as we only need an update and destroy method. Notice that in the update method, we are setting the payload with a single parameter of update_at that is set to a current timestamp.
The reason we only have an update method and not a create method is that Firebase will go ahead and create an object at a specific endpoint if it doesn't actually exist. Convenient!
[js]
app.factory('RealtimeService', function ($http, FIREBASE_URI) {
var getUrlWithId = function (id) {
return FIREBASE_URI + 'realtime-orders/' + id + '.json';
};
var update = function (id) {
var params = {updated_at: new Date().toString()};
return $http.put(getUrlWithId(id), params);
};
var destroy = function (id) {
return $http.delete(getUrlWithId(id));
};
return {
update: update,
destroy: destroy
};
});
[/js]
With the RealtimeService in place, we can update our ServerCtrl to not only communicate with the compliant server but also with Firebase. When a new object is created, we will call RealtimeService.update and pass in the ID of the newly created object. In this case, it comes in the form of result.data.name since that is how Firebase returns the object. You will need to update this to match whatever format your compliant server uses.
[js]
server.createOrder = function (title, description) {
RESTService.create(title, description)
.then(function (result) {
server.getOrders();
server.resetForm();
RealtimeService.update(result.data.name)
});
};
[/js]
It is a bit easier for the RealtimeService.update method as we already know the ID of the object that we just updated.
[cc lang="javascript"]
$scope.updateOrder = function (id, title, description) {
RESTService.update(id, title, description)
.then(function (result) {
RealtimeService.update(id);
});
};
[/js]
The same goes for the RealtimeService.destroy method as we only need to send in the ID of the object we just destroyed.
[js]
$scope.removeOrder = function (id) {
RESTService.destroy(id)
.then(function () {
server.getOrders();
RealtimeService.destroy(id);
});
};
[/js]
This completes the necessary commentary on how the code works for the RESTful client that communicates with the compliant server. The three main parts to making this work are the RESTService, RealtimeService and the ServerCtrl which coordinates the two services.
We are coordinating the communication between the compliant server and Firebase from within a web application, but I have also seen this done entirely at the server level as well.
We are now at the realtime, event bus portion of this example which is where things really start to get interesting! We are going to start by grabbing a realtime collection of our items via the RealtimeService using the $firebaseArray service. Creating a realtime collection in Firebase is a two-step process that involves instantiating a new Firebase reference and passing in the URI to the endpoint that contains your realtime data. In the case of the code below, we are pointing it to the realtime-orders node that exists at the FIREBASE_URI endpoint. We then instantiate the collection by passing our newly created ref to the $firebaseArray service which returns all of the items at that reference with realtime capabilities. We then make that collection available by returning it via the all method.
[js]
app.factory('RealtimeService', function ($firebaseArray, FIREBASE_URI) {
var ref = new Firebase(FIREBASE_URI + 'realtime-orders');
var orders = $firebaseArray(ref);
var all = function () {
return orders
};
return {
all: all
};
});
[/js]
And now we can make our collection available to our view by binding it to the realtime.orders property in our RealtimeCtrl.
[js]
app.controller('RealtimeCtrl', function ($scope, RESTService, RealtimeService, CurrentOrderService) {
var realtime = this;
realtime.orders = RealtimeService.all();
});
[/js]
We then bind to the collection in our view just like any other collection as you can see in the code below. We are building out a table with a standard ng-repeat="order in realtime.orders".
{% highlight html %}
| ID | Updated At |
|---|---|
| {{order.$id}} | {{order.updated_at}} |
{% endhighlight %}
The real "magic" of this example up to this point is in the two lines below. We are creating a new Firebase reference and then instantiating a realtime collection using $firebaseArray.
[js]
var ref = new Firebase(FIREBASE_URI + 'realtime-orders');
var orders = $firebaseArray(ref);
[/js]
By creating a general collection at realtime.orders, we can know when our collection is modified as a whole but we do not have a good way of knowing what was updated at an atomic level. Because Firebase references are extremely lightweight, we are going to create an order directive to monitor each individual order for changes. This also allows us to encapsulate some additional functionality within our directive. To simplify things, we are going to examine the structure of our directive without any of the controller logic in it for now. In our directive definition object, we are setting scope:true so that each directive instance gets a new scope. We are also using the new bindToController syntax, to bind the orderId property to our controller. To complete our directive definition object, we are defining our controller and controllerAs properties.
[js]
app.directive('order',
function ($rootScope, $firebaseObject, RESTService, FIREBASE_URI, CurrentOrderService) {
var controller = function () {
// Pending
};
return {
scope: true,
bindToController: {
orderId: '@'
},
controller: controller,
controllerAs: 'orderCtrl'
};
});
[/js]
We are also injecting a few different services which we will elaborate on in just a moment. The first order of business is to create a realtime reference to the order object that our directive represents. We will create this almost the exact same way as we created our orders collection but we will be using the $firebaseObject service instead. The $firebaseObject service is useful for monitoring a single object instead of an array of objects as we saw in the $firebaseArray example above. Once we have created the correct Firebase reference, we pass that into the $firebaseObject service which will return an order object that has realtime capabilities.
[js]
app.directive('order',
function ($firebaseObject, FIREBASE_URI, RESTService, CurrentOrderService) {
var controller = function () {
var orderCtrl = this,
ref = new Firebase(FIREBASE_URI + 'realtime-orders/' + orderCtrl.orderId);
orderCtrl.order = $firebaseObject(ref);
return {
scope: true,
bindToController: {
orderId: '@'
},
controller: controller,
controllerAs: 'orderCtrl'
};
});
[/js]
Our realtime order object has a few events that we can use to know when a change has occurred. Because a realtime object fires change events as it is loading, we will wait to start watching it until the $loaded event has fired. Once the $loaded event has fired, we then start to monitor it via the $watch method. When a change is detected, we will call the getOrder method and pass in orderId.
[js]
app.directive('order',
function ($firebaseObject, FIREBASE_URI, RESTService, CurrentOrderService) {
var controller = function () {
var orderCtrl = this,
ref = new Firebase(FIREBASE_URI + 'realtime-orders/' + orderCtrl.orderId);
orderCtrl.order = $firebaseObject(ref);
orderCtrl.order.$loaded()
.then(function () {
orderCtrl.order.$watch(function () {
orderCtrl.getOrder(orderCtrl.orderId);
});
});
return {
scope: true,
bindToController: {
orderId: '@'
},
controller: controller,
controllerAs: 'orderCtrl'
};
});
[/js]
And this entire example comes down to this one method. The entire event bus happens right here. In the orderCtrl.getOrder method, we call the RESTService to fetch the full object based on the id of the realtime object that was just updated. Once we have the full object, we are going to send it to the CurrentOrderService so that we can surface the details of what object was just updated.
[js]
app.directive('order',
function ($firebaseObject, FIREBASE_URI, RESTService, CurrentOrderService) {
var controller = function () {
var orderCtrl = this,
ref = new Firebase(FIREBASE_URI + 'realtime-orders/' + orderCtrl.orderId);
orderCtrl.order = $firebaseObject(ref);
orderCtrl.order.$loaded()
.then(function () {
orderCtrl.order.$watch(function () {
orderCtrl.getOrder(orderCtrl.orderId);
});
});
orderCtrl.getOrder = function (id) {
RESTService.fetch(id)
.then(function (result) {
CurrentOrderService.setCurrentOrder(result.data);
});
};
};
return {
scope: true,
bindToController: {
orderId: '@'
},
controller: controller,
controllerAs: 'orderCtrl'
};
});
[/js]
With our order directive created, we will update our tr element slight to include our new addition. We are instantiating the directive by adding the order attribute and passing in the appropriate orderId via order-id="{{order.$id}}".
{% highlight html %}
| ID | Updated At |
|---|---|
| {{orderCtrl.order.$id}} | {{orderCtrl.order.updated_at}} |
{% endhighlight %}
The realtime version of the RESTService is incredibly simple with a single fetch method but I wanted to include it here for reference purposes.
[js]
app.factory('RESTService', function ($http, RESTFUL_URI) {
var getUrlWithId = function (orderId) {
return RESTFUL_URI + 'orders/' + orderId + '.json';
};
var fetch = function (orderId) {
return $http.get(getUrlWithId(orderId));
};
return {
fetch: fetch
};
});
[/js]
The CurrentOrderService is a basic service that is essentially a getter and setter for the currentOrder object. The only twist to this is that we are using $rootScope as an internal event bus to broadcast to the rest of the application that there was an currentOrderUpdated event.
I rarely use $rootScope directly except for an event bus to broadcast events to the rest of the application. This is handy because Angular events only happen on $scope objects and by using $rootScope, we can guarantee that all scope objects are notified because they are all children of $rootScope.
[js]
app.factory('CurrentOrderService', function ($rootScope) {
var currentOrder = {};
var getCurrentOrder = function () {
return currentOrder;
};
var setCurrentOrder = function (order) {
currentOrder = order;
$rootScope.$broadcast('currentOrderUpdated');
};
return {
getCurrentOrder: getCurrentOrder,
setCurrentOrder: setCurrentOrder
};
});
[/js]
In our RealtimeCtrl, we then listen for the currentOrderUpdated using $scope.$on and use that event to grab the latest currentOrder object.
[js]
app.controller('RealtimeCtrl', function ($scope, RESTService, RealtimeService, CurrentOrderService) {
var realtime = this;
realtime.orders = RealtimeService.all();
realtime.currentOrder = CurrentOrderService.getCurrentOrder();
$scope.$on('currentOrderUpdated', function () {
realtime.currentOrder = CurrentOrderService.getCurrentOrder();
});
});
[/js]
And then we can display the order details as we have in the HTML below.
{% highlight html %}
| Title | Description |
|---|---|
| {{realtime.currentOrder.title}} | {{realtime.currentOrder.description}} |
{% endhighlight %}
And there we have it! This is the technique that I use to provide realtime capabilities to compliant servers that store sensitive information. The general premise is that we are only storing an ID and a timestamp within Firebase and using that to serve as an event bus to the complete data at the compliant server.
It is my fondest desire that someone will take the material I share and use it to make lots of money. That would be super rad! With that said, I am not a compliance authority and / or a lawyer so double check with the powers that be before rolling your own version out to production.
Firebase REST API Documentation
[button link="https://github.com/simpulton/angular-firebase-event-bus" size="large" window="yes"]Code[/button]


When Simbegwire’s mother died,
she was very sad. Simbegwire’s
father did his best to take care of
his daughter. Slowly, they learned
to feel happy again, without
Simbegwire’s mother.
Every morning they sat and talked
about the day ahead. Every evening
they made dinner together. After
they washed the dishes,
Simbegwire’s father helped her with
homework.
One day, Simbegwire’s father came
home later than usual. “Where are
you my child?” he called.
Simbegwire ran to her father. She
stopped still when she saw that he
was holding a woman’s hand. “I
want you to meet someone special,
my child. This is Anita,” he said
smiling.
“Hello Simbegwire, your father told
me a lot about you,” said Anita. But
she did not smile or take the girl’s
hand.
Simbegwire’s father was happy and
excited. He talked about the three
of them living together, and how
good their life would be. “My child, I
hope you will accept Anita as your
mother,” he said.
Simbegwire’s life changed. She no
longer had time to sit with her
father in the mornings. Anita gave
her so many household chores that
she was too tired to do her school
work in the evenings. She went
straight to bed after dinner.
Her only comfort was the colourful
blanket her mother gave her.
Simbegwire’s father did not seem to
notice that his daughter was
unhappy.
After a few months, Simbegwire’s
father told them that he would be
away from home for a while. “I have
to travel for my job,” he said. “But I
know you will look after each other.”
Simbegwire’s face fell, but her
father did not notice. Anita did not
say anything. She was not happy
either.
Things got worse for Simbegwire. If
she didn’t finish her chores, or she
complained, Anita hit her. And at
dinner, the woman ate most of the
food, leaving Simbegwire with only
a few scraps.
Each night Simbegwire cried herself
to sleep, hugging her mother’s
blanket.
One morning, Simbegwire was late
getting out of bed.
Anita shouted. She pulled
Simbegwire out of bed. The
precious blanket caught on a nail,
and tore in two.
星卑桂亞超唔開心，佢決定離家出走。佢帶住條毛氈嘅碎片，包咗少少嘢食，沿住爹哋出差嘅路線離開咗屋企。
星卑桂亞超唔開心，佢決定離家出走。佢帶住條毛氈嘅碎片，包咗少少嘢食，沿住爹哋出差嘅路線離開咗屋企。
辛波薇亞傷心透了，她決定離家出走。她帶著毯子的碎片，包了一些食物，沿著爸爸出差的路離開了家裡。
Simbegwire was very upset. She
decided to run away from home.
She took the pieces of her mother’s
blanket, packed some food, and left
the house. She followed the road
her father had taken.
When it came to evening, she
climbed a tall tree near a stream
and made a bed for herself in the
branches.
As she went to sleep, she sang:
“Maama, maama, maama, you left
me.
You left me and never came back.
Father doesn’t love me anymore.
Mother, when are you coming back?
You left me.”
The next morning, Simbegwire sang
the song again. When the women
came to wash their clothes at the
stream, they heard the sad song
coming from the tall tree.
They thought it was only the wind
rustling the leaves, and carried on
with their work. But one of the
women listened very carefully to
the song.
This woman looked up into the tree.
When she saw the girl and the
pieces of colourful blanket, she
cried, “Simbegwire, my brother’s
child!”
The other women stopped washing
and helped Simbegwire to climb
down from the tree. Her aunt
hugged the little girl and tried to
comfort her.
Simbegwire’s aunt took the child to
her own house. She gave
Simbegwire warm food, and tucked
her in bed with her mother’s
blanket.
That night, Simbegwire cried as she
went to sleep. But they were tears
of relief. She knew her aunt would
look after her.
When Simbegwire’s father returned
home, he found her room empty.
“What happened, Anita?” he asked
with a heavy heart. The woman
explained that Simbegwire had run
away. “I wanted her to respect me,”
she said. “But perhaps I was too
strict.”
Simbegwire’s father left the house
and went in the direction of the
stream. He continued to his sister’s
village to find out if she had seen
Simbegwire.
Simbegwire was playing with her
cousins when she saw her father
from far away. She was scared he
might be angry, so she ran inside
the house to hide.
But her father went to her and said,
“Simbegwire, you have found a
perfect mother for yourself. One
who loves you and understands
you. I am proud of you and I love
you.”
They agreed that Simbegwire would
stay with her aunt as long as she
wanted to.
Her father visited her every day.
Eventually, he came with Anita. She
reached out for Simbegwire’s hand.
“I’m so sorry little one, I was
wrong,” she cried. “Will you let me
try again?”
Simbegwire looked at her father
and his worried face. Then she
stepped forward slowly and put her
arms around Anita.
The next week, Anita invited
Simbegwire, with her cousins and
aunt, to the house for a meal. What
a feast! Anita prepared all of
Simbegwire’s favourite foods, and
everyone ate until they were full.
Then the children played while the
adults talked.
Simbegwire felt happy and brave.
She decided that soon, very soon,
she would return home to live with
her father and her stepmother.


Documentation
Opens the rucksack in the directory designated by DIRECTORY-DESIGNATOR.
:IF-DOES-NOT-EXIST can be either :CREATE (creates a new rucksack if the
it does not exist; this is the default) or :ERROR (signals an error if
the rucksack does not exist).
:IF-EXISTS can be either :OVERWRITE (loads the rucksack if it exists;
this is the default), :SUPERSEDE (deletes the existing rucksack and creates
a new empty rucksack) or :ERROR (signals an error if the rucksack exists).
Source
(defun open-rucksack (directory-designator
&rest args
&key
(class 'serial-transaction-rucksack)
(if-exists :overwrite)
(if-does-not-exist :create)
(cache-class 'lazy-cache)
(cache-args '())
&allow-other-keys)
"Opens the rucksack in the directory designated by DIRECTORY-DESIGNATOR.
:IF-DOES-NOT-EXIST can be either :CREATE (creates a new rucksack if the
it does not exist; this is the default) or :ERROR (signals an error if
the rucksack does not exist).
:IF-EXISTS can be either :OVERWRITE (loads the rucksack if it exists;
this is the default), :SUPERSEDE (deletes the existing rucksack and creates
a new empty rucksack) or :ERROR (signals an error if the rucksack exists)."
(declare (ignorable cache-class cache-args))
(check-type directory-designator (or string pathname))
(check-type if-exists (member :overwrite :supersede :error))
(check-type if-does-not-exist (member :create :error))
(let ((directory (if (stringp directory-designator)
(pathname directory-designator)
directory-designator)))
(with-lock (*rucksack-opening-lock*)
(setq *rucksack*
(if (probe-file (merge-pathnames "roots" directory))
;; Rucksack already exists.
(ecase if-exists
(:error
(error "Can't create rucksack in ~S: the directory
already seems to contain a rucksack."
directory))
(:supersede
;; Remove all rucksack files from the directory.
(loop for file in (rucksack-files-in-directory directory)
do (delete-file file))
;; And create a fresh rucksack.
(apply #'make-instance class :directory directory args))
(:overwrite
;; This is the normal case.
(apply #'make-instance class :directory directory args)))
;; Rucksack doesn't seem to exist.
(ecase if-does-not-exist
(:error
(error "Can't open rucksack in ~S: the rucksack roots
file is missing."
directory))
(:create
(ensure-directories-exist directory)
(apply #'make-instance class :directory directory args))))))))
Source Context


{% extends "base/page_centered.html" %} {% block page_title %}Instructions{% endblock %} {% block extra_styles %} {{ block.super }} .icon { vertical-align: bottom; } {% endblock %} {% block main_content %}
Coming Soon!
You can share a link to your map by pressing the "Share" button on the Projects page. The visibility of your maps will depend on the option you select:
We are working on new tools to present and visualize your data. Stay tuned for the next release of Local Ground!


The logarithmic integral function
The logarithmic integral function of J. P. G. L. Dirichlet is an improvement of
Gauss' first estimation of the
number of primes, the prime number theorem.
Like the prime number theorem, the logarithmic integral gives an approximation of the number of prime numbers up to a given natural number n.
For big values of n, the function converges to the actual number of prime numbers π(n).


Tour De Madison B-cycle
In Madison, we are fortunate to have a nice bicycle sharing system called Madison B-cycle. B-cycle is perfect for short trips and the occasional commute. Being located all over the city, I used B-cycles frequently last summer. In this month’s newsletter to members, the Madison B-cycle staffed proposed a challenge - bike all 32 stations in 24 hours. The prize? A Madison B-Cycle t-shirt. How could I say no?
I recruited my buddy Will to go with me and we planned our trip for a breezy 40 degree day. I even used the B-Cycle API to write a program that would optimize our route (look for another post on this later). We split the trip into 3 stages. Stage 1 started at 7AM on the corner of W. Washington and Regent and took us to 17 stations west of the capitol. Stage 2 was a quick loop of the capitol stations, which we completed over lunch. After work, we completed the final stage taking us to all the east side stations. Total time and distance: roughly 3 hours 30 minutes and just over 20 miles.
Overall, the experience was quite awesome and fun!. Tour de Bcycle gave us the opportunity to see Madison in an entirely new way. I would highly recommend it to anyone interested. A 24-hour pass is only $5, so you don’t even need to be an annual member.
The GPS I had with me was acting up, but you can see our incomplete route on runkeeper. I also brought my DSLR along and put together a short video documenting the trip:
Url_for(anything) With ActiveModel
This weekend, while working on upgrading murfie.com to Rails 3, I found a situation requiring url_for()… except, I wasn’t using it with an ActiveRecord model :/
Yehunda Katz and ActiveModel to the rescue! Rails 3’s ActiveModel is a great way to mix ActiveRecord functionality into any object. Yehunda’s article covers validations and serialization, but glosses over ActiveModel::Naming.
|
Adding this module to a class means that url_for(Model) just works! Of course you need to have routes setup, but url_for will automatically construct the named routes if they match up with the model name.
Under the hood, rails is calling model_name on the class of the object passed into url_for(). Model.model_name returns a string, but is actually an instance of ActiveModel::Name, which is then used by url_for() to generate the named route for the object.
|
Email Unsubscribe From Hell
Look at this picture. See where I have circled the unsubscirbe link? Yes, that grey text with no underline is a link. Secha Touch, who sent this email, should be ashamed.
Transferring Data Between Heroku Applications
Today I found myself needing to move data between two heroku apps. If you have the pgbackups addon installed, it turns out this is really easy:
|
Heroku covers the process more in depth in their documentation
Heroku rocks!
Rails Is for Beginners
This morning I came across an article on hacker news titled Rails Is Not For Beginners. The article is actually about Sinatra, but the link-bait title is dead wrong. Rails is perfect for beginners and here is why …
A friend of mine with zero programming experience recently asked me to help him learn web development. We setup rails together, and I pointed him to some online tutorials. When he called me the next evening, he could barely contain his excitement:
“Rails is awesome! I can edit, add, delete! This is a real web app and I made it!”
In Rails, with only a few commands you can have a fully functioning CRUD app built on scaffolding. No experienced Rails developer I know uses scaffolding. So why is it still in the source code? Because Rails is for beginners.
The best way to teach anyone web development is to inspire them to learn on their own. My friend is a long way from being a productive web developer, but because of Rails he is excited to learn more.
If you are a beginner and looking for a place to start, I recommend railstutorial.org. It is a fantastic resource, and best of all the online version is free.
Moving to Octopress
I’m moving the blog from dreamhost+wordpress to heroku+octopress (which is built on jekyll). Anything before this point in the blog has been imported and might be a little off. You have been warned!
Radio Interview for GeoHuddle
Last Friday, I did a radio interview on 1670 AM for my startup - GeoHuddle. The full audio is available here:
[wpaudio url=”http://www.southpolesteve.com/wp- content/uploads/GH_interview.mp3” text=”InBusiness with Jody and Joan - Interview with Steve Faulkner”]
Just click the little play button to listen
Vote for GeoHuddle in the GE Ecomagination Challenge
As some of you might know, I am working on a new startup company these days called GeoHuddle. We are developing a new style of community geothermal energy system. Check out our website at www.geohuddle.com
More importantly, we need your help! GeoHuddle is making a bid in the newly announced $200 million dollar GE Ecomagination Challenge. Please take a few moments and go vote for our startup!


Aren't You Sssscared? Gutsy Man Takes a 'Snake' Bath
Ophidiophobia, or fear of snakes, is quite a common phobia among people. Well, it seems that this isn't the case with this man who, quite the contrary, enjoys the company of serpents.
An audacious man has been caught on camera keeping quite unusual, not to mention terrifying, company. The man is seen sitting in a terrarium buried chest-deep in a swarm of dozens of huge snakes creeping and crawling around him. This does not seem to bother the man at all - he seems to be enjoying the company of his cold-blooded friends.


Get in touch with Ampere Autos!
You're welcome to send us an email directly at<EMAIL_ADDRESS>or you can use the following form to get in touch with us. We're happy to field any questions about electric or hybrid vehicles, or we can have someone knowledgable provide more information about our sales process or service departments.


This tool allows user to simulate multifactorial experiments. The optimization result can be verified here: This tool provides an error of the estimated values for the factors.
Select number of factors
Select the upper and lower limits
Factor
Lower limit
Upper limit
Perform individual experiment/measure distance from optimum value (validate optimum value)


Defeated Sri Lankan Presidential Candidate Quits Ruling Party Leadership - Reports
Sri Lanka presidential candidate Sajith Premadasa accepts defeat, congratulates victorious rival Gotabhaya Rajapaksa.
"It is my privilege to honour the decision of the people and congratulate Gotabaya Rajapaksa on his election as the seventh president of Sri Lanka," Premadasa said in a statement.
Sajith Premadasa said in a statement that he was stepping down as deputy leader of ruling party following his defeat.
Former Defence Secretary Gotabaya Rajapaksa is leading Sri Lanka’s presidential election with 50.46 percent of the vote, the preliminary results from the country’s Election Commission showed.
His main rival, Sajith Premadasa, the housing minister and son of former president Ranasinghe Premadasa, is set to get 43.6 percent.
Rajapaksa’s campaign has already claimed its victory in the election. Premadasa, in turn, has conceded his defeat.
"It is my privilege to honour the people's decision and congratulate Mr. Gotabaya Rajapaksa on his election. I am grateful to our citizens who voted for me," Premadasa wrote on Twitter.
Sri Lankans went to the polls on Saturday to pick their new president out of 35 candidates.
Rajapaksa played a prominent role in crushing Tamil Tigers, rebels from a mostly Hindu ethnicity who fought a decades-long independence war against the central government. In the election, he campaigned for stronger security and economic reforms.
Premadasa was vying to rally minorities and women behind him, while also appealing to the Buddhist base with promises of better life quality and more affordable housing. He has support of Tamils and the Muslim minority.


The following excerpt is from the README file included in the project.
========================================================================== Pi4J :: Java library for Raspberry Pi ========================================================================== ## PROJECT INFORMATION Project website: http://www.pi4j.com/
 Project discussion group: https://groups.google.com/forum/#!forum/pi4j
 Project issues list: https://github.com/Pi4J/pi4j/issues

 Release builds are available from * [Maven Central] http://search.maven.org/#search%7Cga%7C1%7Ccom.pi4j * [Google Code] http://code.google.com/p/pi4j/downloads Snapshot builds are available from * [Sonatype OSS] https://oss.sonatype.org/index.html#nexus-search;quick~pi4j * [Google Code] http://code.google.com/p/pi4j/downloads Copyright (C) 2012 Pi4J ## LICENSE Licensed 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. ## FUTURE PLANS * Add Java API support for SPI communication. (JNI wrapper for wiringPi SPI already exists) * Enhance/replace serial communication API. * Create additional GpioProvider implementations * Create device abstraction implementations * Create pi4j-api library and move interfaces there ## RELEASES 2012-12-16 :: 0.0.4 * Added support for building a Pi4J .deb installer package for Debian/Raspian Linux distribution. (BETA) * Modified NetworkInfo static methods to permit empty array return values when a network property cannot be obtained. https://github.com/Pi4J/pi4j/issues/3 * Fixed issue in newer Raspberry Pi 512mb firmware where Pi4J was not compiled against latest wiringPi library and thus not detecting the hardware properly. https://github.com/Pi4J/pi4j/issues/3 * Fixed defect where Pi4J library prevented consuming program from exiting properly. https://github.com/Pi4J/pi4j/issues/4 https://github.com/Pi4J/pi4j/issues/6 * Added support for MCP23008 GPIO Provider using I2C bus. * Added support for MCP23017 GPIO Provider using I2C bus. * Modified build script to support concurrent soft-float and hard-float native library builds * Modified build script to include pulling wiringPi sources and compiling when building native library * Added power controller device interface, base impl, and reference impl * Added GpioController.provisionXXXPin methods that allow name to be optional * Relocated project downloads location to google code site; github deprecated downloads. * Added Google Groups discussion forum to project docs. * Added getTag() and setTag() to GpioPin interface and impl. * Added TemperatureConversion utility. * Added optional blocking argument to GpioPin pulse method to support blocking pulse invocations 2012-10-22 :: 0.0.3-SNAPSHOT * Refactored Gpio interfaces to permit extensible GpioProviders for add-on devices. * Refactored Gpio interfaces to separate digital, analog, and PWM types of input and output pins. * Added support for analog GPIO pins (interfaces, methods and events). * Added Olimex AVR-IO-M16 GpioProvider to serve as an example of extending a new GpioProvider for GPIO expansion. * Added Olimex AVR-IO-M16 sources for ARV micro-controller. * Removed setDirection() from GpioPin; embedded this functionality into existing setMode() method. Eliminating duplication. * Removed old test programs from pi4j-core and moved wiringPi examples to pi4j-example project. * Added support for I2C communication. * Added blink() methods for GPIO pins 2012-09-23 :: 0.0.2-SNAPSHOT * Refactored Gpio interface to permit methods using Pin argument to function without requiring a GpioPin to first be provisioned * Added OSGi manifest * Optimized GPIO interrupt thread handling to only be created if GpioPin listeners or triggers have been registered.  * Added additional convenience methods in GpioPin interface for evaluating state, direction, resistance, mode, etc. * There were two Gpio classes; renamed one to GpioController to avoid confusion. * Added OSGi service project to export Pi4J GPIO as an OSGi service. 2012-09-19 :: 0.0.1-SNAPSHOT * Initial ALPHA release


TQ3MemoryStatistics |
typedef struct TQ3MemoryStatistics { TQ3Uns32 structureVersion; TQ3Uns32 currentAllocations; TQ3Uns32 maxAllocations; TQ3Int64 currentBytes; TQ3Int64 maxBytes; } TQ3MemoryStatistics;
- structureVersion
- Version of this structure. Initialize to kQ3MemoryStatisticsStructureVersion.
- currentAllocations
- Current number of memory blocks allocated by Quesa.
- maxAllocations
- Maximum number of memory blocks allocated by Quesa.
- currentBytes
- Current number of memory bytes allocated by Quesa.
- maxBytes
- Maximum number of memory bytes allocated by Quesa ("high-water mark").
© 1999-2023 Quesa Developers (Last Updated 1/27/2023)


There are three states of being. Not knowing, action and completion.
Accept that everything is a draft.
It helps to get done.
There is no editing stage.
Pretending you know what you’re doing is almost the same as knowing what you are doing,
so just accept that you know what you are doing
what you’re doing even if you don’t and do it.
Banish procrastination. If you wait more
than a week to get an idea done, abandon it.
The point of being done is not to finish but
to get other things done.
Once you’re done you can throw it away.
Laugh at perfection. It’s boring and keeps
you from being done.
People without dirty hands are wrong.
Doing something makes you right.
Failure counts as done. So do mistakes.
Destruction is a variant of done.
If you have an idea and publish it on the
internet, that counts as a ghost of done.
Done is the engine of more.


Protein NER that uses BANNER (http://cbioc.eas.asu.edu/banner/). BANNER is a named entity recognition system, primarily intended for biomedical text. It is a machine-learning system based on conditional random fields and contains a wide survey of the best features in recent literature on biomedical named entity recognition (NER). It relies on a CRF model (Mallet). The list of features can be found in CRFTagger BANNER achieves a F1 of 84.92 on BioCreative2 It is the subject of the following paper: Leaman, R. & Gonzalez G. (2008) BANNER: An executable survey of advances in biomedical named entity recognition. Pacific Symposium on Biocomputing 13:652-663(2008)
| Param. Name | Description | Required | Default Value |
| modelFile | N | pear_resources/models/gene_model_v02.bin | |
| nlpData | N | pear_resources/nlpdata | |
| bannerProps | N | pear_resources/banner.properties |
Usage (example):
ae: ch.epfl.bbp.uima.ae.BannerAnnotator modelFile: pear_resources/models/gene_model_v02.bin nlpData: pear_resources/nlpdata bannerProps: pear_resources/banner.properties
BANNER's built-in word tokenizer. Tokens ouput by this tokenizer consist of a contiguous block of alphanumeric characters or a single punctuation mark. Note, therefore, that any construction which contains a punctuation mark (such as a contraction or a real number) will necessarily span over at least three tokens.
Usage (example):
ae: ch.epfl.bbp.uima.ae.BannerTokenizerAnnotator
Lemmatiser (http://en.wikipedia.org/wiki/Lemmatisation) Annotator that uses the Dragon Toolkit (http://dragon.ischool.drexel.edu/). The Dragon Toolkit is used in BANNER. It is described in the paper Zhou, X., Zhang, X., and Hu, X., "Dragon Toolkit: Incorporating Auto-learned Semantic Knowledge into Large-Scale Text Retrieval and Mining," In proceedings of the 19th IEEE International Conference on Tools with Artificial Intelligence (ICTAI), October 29-31, 2007, Patras, Greece
| Param. Name | Description | Required | Default Value |
| lemmatiser_data | N | pear_resources/nlpdata/lemmatiser |
Usage (example):
ae: ch.epfl.bbp.uima.ae.DragonLemmatiserAnnotator lemmatiser_data: pear_resources/nlpdata/lemmatiser
An annotator that compares the annotations in a gold (human-annotated) view to the annotations in a system-annotated view.
Usage (example):
ae: ch.epfl.bbp.uima.cleartk.ner.brainregion.BrainRegionAnnotationEvaluator
Usage (example):
ae: ch.epfl.bbp.uima.cleartk.ner.brainregion.BrainRegionsSequenceAnnotator
An annotator that compares the annotations in a gold (human-annotated) view to the annotations in a system-annotated view.
| Param. Name | Description | Required | Default Value |
| org.uimafit.descriptor.ConfigurationParameter.USE_FIELD_NAME | The annotation class whose gold and system spans should be compared | Y | |
| org.uimafit.descriptor.ConfigurationParameter.USE_FIELD_NAME | The name of the CAS view containing the gold (manual) annotations | Y | |
| org.uimafit.descriptor.ConfigurationParameter.USE_FIELD_NAME | The name of the CAS view containing the system (automatic) annotations | Y |
Usage (example):
ae: ch.epfl.bbp.uima.cleartk.ner.protein.AlternateAnnotationEvaluator org.uimafit.descriptor.ConfigurationParameter.USE_FIELD_NAME:org.uimafit.descriptor.ConfigurationParameter.USE_FIELD_NAME: org.uimafit.descriptor.ConfigurationParameter.USE_FIELD_NAME:
Usage (example):
ae: ch.epfl.bbp.uima.cleartk.ner.protein.ProteinNerSequenceAnnotator
Finds abbreviations (e.g. "PC" for pyramidal cells) using BioAdi (http://bioagent.iis.sinica.edu.tw/BIOADI/), Biomedical Abbreviation Definition Identifier. BioAdi identifies the mapping between SF (Short Form) and LF (Long Form) terms in paper. The SF and LF terms can vary and different writing habits generate different subtypes of terms. For example, HCC generally stands for "Hepatocellular Carcinoma", but it can also be written as "Hepatoma", "hepatocellular cancer", "hepato-cellular carcinoma", and so on and so forth. These transformers cause problems on many fields such as database querying, text mining, and literature annotation. Paper: BIOADI: a machine learning approach to identifying abbreviations and definitions in biological literature Cheng-Ju Kuo, Maurice HT Ling, Kuan-Ting Lin, and Chun-Nan Hsu, BMC Bioinformatics. 2009; 10(Suppl 15): S7.
Usage (example):
ae: ch.epfl.bbp.uima.ae.BioAdiAbreviationAnnotator
This annotator processes tokens in the CAS and inserts corresponding lemmas.
Usage (example):
ae: ch.epfl.bbp.uima.ae.BlueBioLemmatizer
Language detection @see http://code.google.com/p/language-detection
| Param. Name | Description | Required | Default Value |
| min_text_length | N | 200 |
Usage (example):
ae: ch.epfl.bbp.uima.ae.LanguageDetectionAnnotator min_text_length: 200
Linnaeus Uima wrapper, for species name recognition and normalization (http://linnaeus.sourceforge.net/ and http://sourceforge .net/projects/linnaeus/files/Linnaeus/linnaeus-uima-wrapper.pear/download). The provided trained model shows 94% recall and 97% precision on the LINNAEUS-species-corpus. LINNAEUS is the subject of the following paper: Gerner M., Nenadic, G. and Bergman, C. M. (2010) LINNAEUS: a species name identification system for biomedical literature. BMC Bioinformatics 11:85.
| Param. Name | Description | Required | Default Value |
| CONFIG_FILE | N |
Usage (example):
ae: ch.epfl.bbp.uima.ae.LinnaeusAnnotator CONFIG_FILE:
Wordnet Uima wrapper, using JWI (the MIT Java Wordnet Interface). ATM, find the first match from the lemmatizer. Needs tokens with POS as input. @see http://projects.csail.mit.edu/jwi/
| Param. Name | Description | Required | Default Value |
| modelFile | dict file from Wordnet | N |
Usage (example):
ae: ch.epfl.bbp.uima.ae.WordnetAnnotator modelFile:
CollectionReader for the Biocreative2 (2006) annotated corpus (http://www.biocreative.org/news/biocreative-ii/), containing 20000 sentences from MEDLINE abstracts. P00027739T0000|5 28|gamma glutamyltransferase P00027739T0000|0 28|Serum gamma glutamyltransferase
| Param. Name | Description | Required | Default Value |
| corpus_mode | mode, either test or train | Y | test |
| corpusRoot | path to corpus | Y | pear_resources/bc2geneMention/ |
| include_alternate | whether to include the alternate tagged forms | N | true |
Usage (example):
cr: ch.epfl.bbp.uima.cr.Biocreative2GeneCollectionReader corpus_mode: test corpusRoot: pear_resources/bc2geneMention/ include_alternate: true
Corpus reader for the BioNLP 2011 GENIA Event Extraction (GENIA) Shared Task http://2011.bionlp-st.org/home/genia-event-extraction-genia Format: http://www-tsujii.is.s.u-tokyo.ac.jp/GENIA/SharedTask/detail.shtml#format
| Param. Name | Description | Required | Default Value |
| inputDirectory | N | pear_resources/BioNLP-ST_2011/BioNLP-ST_2011_genia_devel_data_rev1 |
Usage (example):
cr: ch.epfl.bbp.uima.cr.BioNLPGeniaEventsCollectionReader inputDirectory: pear_resources/BioNLP-ST_2011/BioNLP-ST_2011_genia_devel_data_rev1
CollectionReader for the GENIA annotated corpus (http://www-tsujii.is.s.u-tokyo.ac.jp/~genia/topics/Corpus/). GENIA Corpus Version 3.0x consists of 2000 abstracts. The base abstracts are selected from the search results with keywords (MeSH terms) Human, Blood Cells, and Transcription Factors.
| Param. Name | Description | Required | Default Value |
| corpusFile | path to Genia xml corpus | Y | pear_resources/GENIAcorpus3.02/GENIAcorpus3.02.xml |
Usage (example):
cr: ch.epfl.bbp.uima.cr.GeniaCorpusCollectionReader corpusFile: pear_resources/GENIAcorpus3.02/GENIAcorpus3.02.xml
Collection Reader for nxml files (http://dtd.nlm.nih.gov/)
Usage (example):
cr: ch.epfl.bbp.uima.cr.NxmlCollectionReader
Collection Reader for Pubmed Gzipped XML dumps. These can be leased and downloaded from Pubmed (http://www.nlm.nih.gov/databases/journal.html). There are currently ~ 700 dump files. New dumps are added weekly.
Usage (example):
cr: ch.epfl.bbp.uima.cr.PubmedArchiveCollectionReader
Collection Reader for Pubmed Gzipped XML dumps. These can be leased and downloaded from Pubmed (http://www.nlm.nih.gov/databases/journal.html). There are currently ~ 700 dump files. New dumps are added weekly. New file format, I believe
Usage (example):
cr: ch.epfl.bbp.uima.cr.PubmedArchiveCollectionReader2
Collection Reader for Pubmed Central (http://www.ncbi.nlm.nih.gov/pmc/) nxml files (http://dtd.nlm.nih.gov/). The Open Access Subset (http://www.ncbi.nlm.nih.gov/pmc/tools/openftlist/) can be downloaded from PMC's FTP (http://www.ncbi.nlm.nih.gov/pmc/tools/ftp/).
Usage (example):
cr: ch.epfl.bbp.uima.cr.PubmedCentralCollectionReader
Collection Reader for the University of Southern California (USC) Tract-tracing experiments (TTE) corpus.
Usage (example):
cr: ch.epfl.bbp.uima.cr.UscTteCollectionReader
Collection Reader for the WhiteText brain regions corpus (http://www.chibi.ubc.ca/WhiteText/). This corpus has 17,585 brain region mentions. Paper: French L, Lane S, Xu L and Pavlidis P (2009) Automated recognition of brain region mentions in neuroscience literature. Front. Neuroinform. 3:29. doi:10.3389/neuro.11.029.2009
| Param. Name | Description | Required | Default Value |
| corpusFile | N |
Usage (example):
cr: ch.epfl.bbp.uima.cr.WhiteTextCollectionReader corpusFile:
Collection Reader for BBP's TestCase XML format. Creates CAS from the XMLs and add the relevant annotations (protein, concentration, celltype). This format is especially relevant for the validation of our first Research Task (see confluence).
| Param. Name | Description | Required | Default Value |
| inputFileParam | N |
Usage (example):
cr: ch.epfl.bbp.uima.cr.XmlTestcaseCollectionReader inputFileParam:
Writes the given Annotations to a specified MySQL database.
| Param. Name | Description | Required | Default Value |
| db_connection | host, dbname, user, pw | Y | |
| createTableStatement | SQL statement to create the table | N | |
| insertStatement | SQL statement to insert annotations. The first argument will be (pm)id. Example: INSERT INTO `my_table` (`pmid`, `token`, `begin`, `end`) VALUES (?,?,?,?) | Y | |
| annotationClass | full qualified name of the annotation class. Example: de.julielab.jules.types.Token | Y | |
| annotationFields | ordered array of annotation fields (omitting pmid). Example: { "coveredText", "begin", "end" } | Y |
Usage (example):
ae: ch.epfl.bbp.uima.ae.DatabaseAnnotationWriter db_connection:createTableStatement: insertStatement: annotationClass: annotationFields:
Writes the given JCas to a MySQL database (the bb_pubmed database). Useful for updating it with new articles from PubMed's FTP, for example.
| Param. Name | Description | Required | Default Value |
| db_connection | host, dbname, user, pw | N | localhost, bb_pubmed, root, |
Usage (example):
ae: ch.epfl.bbp.uima.ae.PubmedDatabaseAE db_connection: localhost, bb_pubmed, root,
@see PubmedWholeDatabaseCR to iterate the whole Pubmed database
| Param. Name | Description | Required | Default Value |
| between | specifies a range of pubmed_id, e.g. {13,17} --> 13 <= pubmed_id <= 17. It is recommended to keep it under 1M, as these results are all stored in the db memory | N | |
| skipEmptyDocs | Skip PubMed articles that have no abstract | N | true |
| db_connection | host, dbname, user, pw | N | <IP_ADDRESS>, bb_pubmed, bemyguest, |
Usage (example):
cr: ch.epfl.bbp.uima.cr.PubmedDatabaseCR between:skipEmptyDocs: true db_connection: <IP_ADDRESS>, bb_pubmed, bemyguest,
Allow to read Pubmed articles based on a list of PubMed ids. It is recommended not to use a very large list ( < 100k).
| Param. Name | Description | Required | Default Value |
| db_connection | host, dbname, user, pw | N | <IP_ADDRESS>, bb_pubmed, bemyguest, |
| ids | a list of pubmed ids | Y |
Usage (example):
cr: ch.epfl.bbp.uima.cr.PubmedFromListDatabaseCR db_connection: <IP_ADDRESS>, bb_pubmed, bemyguest, ids:
Allow to iterate the WHOLE db (no BETWEEN)
| Param. Name | Description | Required | Default Value |
| db_connection | host, dbname, user, pw | N | <IP_ADDRESS>, bb_pubmed, bemyguest, |
| skipEmptyDocs | Skip PubMed articles that have no abstract | N | true |
| and_query | specifies an additional query to filter on, e.g. AND pubmed_id IN (SELECT id FROM neuroscience_ids_from_mesh) | N |
Usage (example):
cr: ch.epfl.bbp.uima.cr.PubmedWholeDatabaseCR db_connection: <IP_ADDRESS>, bb_pubmed, bemyguest, skipEmptyDocs: true and_query:
Filters "redundant" annotations. First, computes the shortest path to cover a Sentence and removes annotations that are not on that shortest path. Keep multiple annotations pairs if they are both on the shortest path. Second, keeps only one of the annotation pairs (based on confidence).
Usage (example):
ae: ch.epfl.bbp.uima.ae.ViterbiFilterAnnotator
Allows Python scripts to be used in UIMA through Jython (http://www.jython.org/)
| Param. Name | Description | Required | Default Value |
| script_path | N |
Usage (example):
ae: ch.epfl.bbp.uima.jython.JythonAnnotator script_path:
Allows Python scripts to be used in UIMA through Jython (http://www.jython.org/)
| Param. Name | Description | Required | Default Value |
| script_string | a String that contains a Python script | Y |
Usage (example):
ae: ch.epfl.bbp.uima.jython.JythonAnnotator2 script_string:
Allows BeanShell Java scripts to be used in UIMA. Sets jCas as available variable.
| Param. Name | Description | Required | Default Value |
| script_string | a String that contains a Beanshell Java script | Y |
Usage (example):
ae: ch.epfl.bbp.uima.ae.BeanshellAnnotator script_string:
Lets you print a message to sysout
| Param. Name | Description | Required | Default Value |
| message | a message to print out | Y |
Usage (example):
ae: ch.epfl.bbp.uima.ae.PrintCommentAnnotator message:
Usage (example):
ae: ch.epfl.bbp.uima.ae.ReferencesFinderAnnotator
Extracts the text of a PDF file using Snowtide's PDFTextSteam (http://www.snowtide.com/) and optionally the tables found in the PDF using TableSeer (http://sourceforge.net/projects/tableseer/).
This AE is used for local multithreaded processing, and relies on a FileReader to set the file path in the Header
| Param. Name | Description | Required | Default Value |
| extractTables | whether to extract tables | N | true |
Usage (example):
ae: ch.epfl.bbp.uima.pdf.cr.PdfCollectionAnnotator extractTables: true
Extracts the text of a PDF file using Snowtide's PDFTextSteam (http://www.snowtide.com/) and optionally the tables found in the PDF using TableSeer (http://sourceforge.net/projects/tableseer/). TODO implement Snowtide parser in TableSeer
| Param. Name | Description | Required | Default Value |
| extractTables | whether to extract tables | N | true |
Usage (example):
cr: ch.epfl.bbp.uima.pdf.cr.PdfCollectionReader extractTables: true
Usage (example):
cr: ch.epfl.bbp.uima.pdf.extraction.sections.NxmlPdfReader
CollectionReader that connects to Pubmed's remote search service (webservice API). Allows to query for a specific term (e.g. "cat") or mesh terms (e.g. "brain[mesh]").
| Param. Name | Description | Required | Default Value |
| query | the query parameter for entrez. E.g. 'cat' or 'brain[mesh]' or '16381840[pmid]' or '17170002 16381840' (for several PMIDs) | Y | |
| maxNrResults | maximum number of results that should be returned | Y | 100 |
Usage (example):
cr: ch.epfl.bbp.uima.cr.PubmedWebServiceCollectionReader query:maxNrResults: 100
Prunes/dedupes overlapping Measures. Necessary because the RegExAnnotator will create for '128 ± 12 copies' 2 different Measure annotations ('128 ± 12 copies' and '12 copies'), so we need to remove the latter.
Usage (example):
ae: ch.epfl.bbp.uima.ae.PruneMeasuresAnnotator
Main RegEx annotator implementation class. ren: changed file resolution ren: changed process(), adding ⊂⊃ btw all T
Usage (example):
ae: ch.epfl.bbp.uima.ae.RegExAnnotator
Collects existing annotations (Protein, Concentration and trigger words) and aggregates (copy) them in a CellTypeProteinConcentration.
Usage (example):
ae: ch.epfl.bbp.uima.ae.RT1CellTypeProteinConcentrationExtractor
Prints a histogram of the counts of annotation
| Param. Name | Description | Required | Default Value |
| printForEveryCas | N | false |
Usage (example):
ae: ch.epfl.bbp.uima.ae.AnnotationHistogramAnnotator printForEveryCas: false
A consumer that writes out specified Annotations and features to a specified text file
| Param. Name | Description | Required | Default Value |
| outputFile | outputfile, or System for sysout | N | out.txt |
| annotationClass | the full name of the annotation class | N | org.apache.uima.jcas.tcas.Annotation |
| featureName | the name of the feature to extract, or none for the text only | N | |
| filterFeaturesWithValue | filter the features that have this value | N | |
| param_new_line | whether to add a new line after each token | N | false |
Usage (example):
ae: ch.epfl.bbp.uima.ae.AnnotationTypeWriter outputFile: out.txt annotationClass: org.apache.uima.jcas.tcas.Annotation featureName:filterFeaturesWithValue: param_new_line: false
A consumer that writes out specified Annotations into static files, for BRAT's stand-off format (http://brat.nlplab.org/standoff.html)
| Param. Name | Description | Required | Default Value |
| addBratFiles | whether to add the complete, working brat server | N | true |
| batchPrefix | prefix to add for each file in Brat; useful when comparing different batches | N | |
| debug | prints out annotations to StdOut | N | false |
| outputDir | N | brat |
Usage (example):
ae: ch.epfl.bbp.uima.ae.BartWriter addBratFiles: true batchPrefix: debug: false outputDir: brat
Removes specific tags from the CASes
| Param. Name | Description | Required | Default Value |
| className | The name (including package) of the class to be detagged, use: MyClass.class.getName(), or 'all' to remove ALL annotations | Y |
Usage (example):
ae: ch.epfl.bbp.uima.ae.CasDetaggerAnnotator className:
Usage (example):
ae: ch.epfl.bbp.uima.ae.cleanup.DisambiguatorAnnotator
/ order matters! /
Usage (example):
ae: ch.epfl.bbp.uima.ae.cleanup.OneRulesThemOutAnnotator
Bluntly removes annotations that cover a word with an uninteresting POS, like DT or TO, IN, ...
Usage (example):
ae: ch.epfl.bbp.uima.ae.cleanup.SkipSomePosAnnotator2
Removes duplicates annotations that have same Class, same begin and same end. TODO: There is no logic yet as how to select the annotation to keep in case of duplicates.
| Param. Name | Description | Required | Default Value |
| annotationClasses | an array with the full name of each annotation classes | Y |
Usage (example):
ae: ch.epfl.bbp.uima.ae.DeduplicatorAnnotator annotationClasses:
Dumps the document text to a text file
| Param. Name | Description | Required | Default Value |
| outputDir | N | target/docs |
Usage (example):
ae: ch.epfl.bbp.uima.ae.DocumentTextWriter outputDir: target/docs
Splits an input text into Sentences at each dot.
Usage (example):
ae: ch.epfl.bbp.uima.ae.DotSentenceSplitterAnnotator
Dumps it all to sysout
Usage (example):
ae: ch.epfl.bbp.uima.ae.Dumper
Ensures that the jCas has a Header annotation, sets it to a random value otherwise otherwise
Usage (example):
ae: ch.epfl.bbp.uima.ae.EnsureDocHasHeader
Ensures that the jCas has at lease one Sentence annotation, sets it to the whole text otherwise
Usage (example):
ae: ch.epfl.bbp.uima.ae.EnsureDocHasOneSentence
Ensures that the text of a CAS is not null, sets it to "" otherwise
Usage (example):
ae: ch.epfl.bbp.uima.ae.EnsureDocTextNotNullAnnotator
Checks that each Token has a POS and a lemma, sets otherwise the POS to a "null" string, resp. the lemma to the coveredText itself
Usage (example):
ae: ch.epfl.bbp.uima.ae.EnsureTokensHaveLemmaAndPOS
TODO add configurable evaluators (strict, relaxed, etc)
| Param. Name | Description | Required | Default Value |
| gold_annotation | the annotation class name to copy to the gold view (and remove from initial view | Y | |
| system_annotation | the annotation class name to copy to the gold view (and remove from initial view | Y | |
| evaluator | possible values: atLeastCovered, exact, overlap | N | exact |
Usage (example):
ae: ch.epfl.bbp.uima.ae.EvaluationAnnotator gold_annotation:system_annotation: evaluator: exact
Copies specified annotation to view_gold (later used by EvaluationAnnotator) and remove it from the _InitialView.
| Param. Name | Description | Required | Default Value |
| gold_annotation | the annotation class name to copy to the gold view (and remove from initial view | Y |
Usage (example):
ae: ch.epfl.bbp.uima.ae.EvaluationPreprocessorAnnotator gold_annotation:
"Forces" to run the garbage collection every N document.
| Param. Name | Description | Required | Default Value |
| runEveryNDocument | N | 10000 |
Usage (example):
ae: ch.epfl.bbp.uima.ae.GarbageCollectorAnnotator runEveryNDocument: 10000
Annotates general English words
Usage (example):
ae: ch.epfl.bbp.uima.ae.GeneralEnglishAnnotator
Utility to perform in-place (statically configured) parameter configuration for grid-search optimization. Parameters are dynamically loaded, and named "o1", "o2", ... They have the following form: o1: paramName{space}paramType{space}value1{space}value2...
Examples:
o1: test1 bool
o2: test2 int 1 3 5
o2: test3 string a b asdf
| Param. Name | Description | Required | Default Value |
| combinaisonIndex | The index of the current option | Y |
Usage (example):
ae: ch.epfl.bbp.uima.ae.GridSearchConfiguration combinaisonIndex:
| Param. Name | Description | Required | Default Value |
| outputDir | output directory , defaults to target/htmlViewer | N | target/htmlViewer/ |
Usage (example):
ae: ch.epfl.bbp.uima.ae.HtmlViewerWriter outputDir: target/htmlViewer/
Adds e.g. setAnnotType("⊂AGE⊃") to all AgeDictTerm annotations. This is used by Lucas
Usage (example):
ae: ch.epfl.bbp.uima.ae.LucasHelperAnnotator
Adds a MultipleProteins annotations if there is more that one Protein in this document
Usage (example):
ae: ch.epfl.bbp.uima.ae.MultipleProteinsAnnotator
Sentence splitter that outputs the content of the whole CAS text as one single Sentence. Useful, since some NERs only take sentences as input.
Usage (example):
ae: ch.epfl.bbp.uima.ae.NaiveSentenceSplitterAnnotator
Writes out specified Annotations and its enclosing sentence to a specified text file
| Param. Name | Description | Required | Default Value |
| outputFile | outputfile, or null for sysout | N | |
| annotationClass | the full name of the annotation class | Y |
Usage (example):
ae: ch.epfl.bbp.uima.ae.PrintAnnotationInSentenceWriter outputFile:annotationClass:
Annotates punctuation chars @input Punctuation
Usage (example):
ae: ch.epfl.bbp.uima.ae.PunctuationAnnotator
Tokenizer that can be configured with a regex Pattern
| Param. Name | Description | Required | Default Value |
| tokenizationPattern | a String that will be compiled to a regex Pattern, and used for tokenization | N | (?<=[(a-zA-Z_0-9\-)])(?=[^(a-zA-Z_0-9\-)])|(?<=[^(a-zA-Z_0-9\-)])(?=[(a-zA-Z_0-9\-)]) |
Usage (example):
ae: ch.epfl.bbp.uima.ae.RegexTokenizerAnnotator tokenizationPattern: (?<=[(a-zA-Z_0-9\-)])(?=[^(a-zA-Z_0-9\-)])|(?<=[^(a-zA-Z_0-9\-)])(?=[(a-zA-Z_0-9\-)])
Format is: pmId:sentId{tab}text
@see SentenceDumpCollectionReader
| Param. Name | Description | Required | Default Value |
| outputFile | A path to the output file | N | sentences.txt |
Usage (example):
ae: ch.epfl.bbp.uima.ae.SentenceDumpAnnotator outputFile: sentences.txt
Annotate (flags) tokens that have an "uninteresting" POS, like V.., W.., DT or TO, IN, ...
Usage (example):
ae: ch.epfl.bbp.uima.ae.SkipSomePosAnnotator
Snowball stemmer annotator for Tokens
Usage (example):
ae: ch.epfl.bbp.uima.ae.SnowballAnnotator
Logs statistics about the progress of the pipeline.
| Param. Name | Description | Required | Default Value |
| printEvery | print every n doc | N | 1000 |
Usage (example):
ae: ch.epfl.bbp.uima.ae.StatsAnnotatorPlus printEvery: 1000
Statistics (histogram) of document text length. Bins are rounded to 100
Usage (example):
ae: ch.epfl.bbp.uima.ae.StatsTextAnnotator
Dumps to sysout
Usage (example):
ae: ch.epfl.bbp.uima.ae.SysoutDumper
Tests the number of annotations on each CAS. Probably only useful when testing a pipeline that processes a single document.
| Param. Name | Description | Required | Default Value |
| expects | [{annot} {expected_count}, ]* , e.g. de.julielab.jules.types.Token 10, ch.epfl.bbp.uima.types.GeneralEnglish 4 | Y |
Usage (example):
ae: ch.epfl.bbp.uima.ae.TestAnnotator expects:
Adds annotations for: 1) modal verbs (e.g. should, ...) and 2) other verbs (if not covered by VerbDictTerm) Removes all other annotations if POS = V
Usage (example):
ae: ch.epfl.bbp.uima.ae.VerbsCleanerAnnotator
Simple whitespace tokenizer.
Usage (example):
ae: ch.epfl.bbp.uima.ae.WhitespaceTokenizerAnnotator
A simple CAS consumer that generates XCAS (XML representation of the CAS) files in the filesystem. renaud: Removing createConfigurationParameterName
| Param. Name | Description | Required | Default Value |
| outputDir | takes a path to directory into which output files will be written. | Y | |
| xmlSchemeName | specifies the UIMA XML serialization scheme that should be used. Valid values for this parameter are 'XMI' (default) and 'XCAS'. | Y | XMI |
| fileNamerClassName | the class name of the XWriterFileNamer implementation to use | Y | org.uimafit.component.xwriter.IntegerFileNamer |
Usage (example):
ae: ch.epfl.bbp.uima.ae.XWriter outputDir:xmlSchemeName: XMI fileNamerClassName: org.uimafit.component.xwriter.IntegerFileNamer
A simple CAS consumer that generates zipped XCAS (XML representation of the CAS) files in the filesystem.
| Param. Name | Description | Required | Default Value |
| outputDir | takes a path to directory into which output files will be written. | Y | |
| org.uimafit.descriptor.ConfigurationParameter.USE_FIELD_NAME | specifies the UIMA XML serialization scheme that should be used. Valid values for this parameter are 'XMI' (default) and 'XCAS'. | Y | XMI |
| org.uimafit.descriptor.ConfigurationParameter.USE_FIELD_NAME | the class name of the XWriterFileNamer implementation to use | Y | org.uimafit.component.xwriter.IntegerFileNamer |
| org.uimafit.descriptor.ConfigurationParameter.USE_FIELD_NAME | whether to output in a structure directory | N | false |
Usage (example):
ae: ch.epfl.bbp.uima.ae.ZipXWriter outputDir:org.uimafit.descriptor.ConfigurationParameter.USE_FIELD_NAME: XMI org.uimafit.descriptor.ConfigurationParameter.USE_FIELD_NAME: org.uimafit.component.xwriter.IntegerFileNamer org.uimafit.descriptor.ConfigurationParameter.USE_FIELD_NAME: false
Creates an html view of the annotations in the CASes.
| Param. Name | Description | Required | Default Value |
| outputDir | N | annotationViewer/ | |
| styleMap | N | viewer/blueStyleMap.xml |
Usage (example):
ae: ch.epfl.bbp.uima.annotationviewer.BlueAnnotationViewerAnnotator outputDir: annotationViewer/ styleMap: viewer/blueStyleMap.xml
| Param. Name | Description | Required | Default Value |
| inputDirectory | path to a directory containing pdfs, or path to a zip file containing pdfs (make sure it does not contain other file formats) | N | |
| directoryIterator | the directoryIterator to use. E.g. DefaultDirectoryIterator, ZipDirectoryIterator, LargeDirectoryIterator | N | DefaultDirectoryIterator |
| isRecursive | N | false | |
| fileExtensionFilter | a filter on file extension | N | null |
Usage (example):
cr: ch.epfl.bbp.uima.cr.AbstractFileReader inputDirectory:directoryIterator: DefaultDirectoryIterator isRecursive: false fileExtensionFilter: null
Simply iterates a directory, and delegates to an AE to retrieve the actual file and process it. NOTE: no documentText is set yet, the first AE must do that
Usage (example):
cr: ch.epfl.bbp.uima.cr.FileReader
CollectionReader that takes a simple text file as input. Each line is turned into a new CAS. Format is: pmId:sentId{tab}text
For PubMed, there are ~70M sentences. @see SentenceDumpAnnotator
| Param. Name | Description | Required | Default Value |
| inputFile | path to text file | N | sentences.txt |
Usage (example):
cr: ch.epfl.bbp.uima.cr.SentenceDumpCollectionReader inputFile: sentences.txt
Interactively reads a sentence from stdin; useful for debugging.
Usage (example):
cr: ch.epfl.bbp.uima.cr.StdinInteractiveReader
CollectionReader that takes a simple text array as input.
| Param. Name | Description | Required | Default Value |
| input | a array of string, to be processed | Y |
Usage (example):
cr: ch.epfl.bbp.uima.cr.TextArrayReader input:
CollectionReader that takes a simple text file as input. Each line is turned into a new CAS. Alternatively, each new empty lines creates a new CAS (using the TextLineReader#PARAM_SPLIT_MODE parameter).
| Param. Name | Description | Required | Default Value |
| inputFile | path to text file | Y | pear_resources/sample_file.txt |
| splitMode | how to split for new CAS. Values are 1 (split on each new line, default), 2 (split on empty new line) | Y | 1 |
Usage (example):
cr: ch.epfl.bbp.uima.cr.TextLineReader inputFile: pear_resources/sample_file.txt splitMode: 1
CollectionReader that takes a simple text as input.
| Param. Name | Description | Required | Default Value |
| input | a string, to be processed | Y |
Usage (example):
cr: ch.epfl.bbp.uima.cr.TextReader input:
A simple collection reader that reads CASes in as XMIs from a directory in the filesystem.
| Param. Name | Description | Required | Default Value |
| xmlSchemeName | specifies the UIMA XML serialization scheme that should be used. Valid values for this parameter are 'XMI' and 'XCAS' | N | XMI |
Usage (example):
cr: ch.epfl.bbp.uima.cr.XCollectionReader xmlSchemeName: XMI
A simple collection reader that reads CASes in as Zipped XMIs from a directory in the filesystem.
| Param. Name | Description | Required | Default Value |
| xmlSchemeName | specifies the UIMA XML serialization scheme that should be used. Valid values for this parameter are 'XMI' and 'XCAS' | N | XMI |
Usage (example):
cr: ch.epfl.bbp.uima.cr.ZipXmiCollectionReader xmlSchemeName: XMI
Annotator NER for brain regions mentions, modeled after Leon French's NER. Operates in 3 modes:
| Param. Name | Description | Required | Default Value |
| mode | which mode (train, eval, infer) | N | infer |
| threads | how many threads for eval and train | N | 3 |
| trials | cross validation: how many trials | N | 1 |
| modelFile | the model file to write to or read from | N |
Usage (example):
ae: ch.epfl.bbp.uima.ae.BrainRegionAnnotator mode: infer threads: 3 trials: 1 modelFile:
OpennlpPosTagger.java Copyright (c) 2006, JULIE Lab. All rights reserved. This program and the accompanying materials are made available under the terms of the Common Public License v1.0 Author: buyko Current version: 2.0 Since version: 1.0 Creation date: 30.01.2008 Analysis Engine that invokes the OpenNLP POS Tagger. This annotator assumes that sentences and tokens have been annotated in the CAS. We iterate over sentences, then iterate over tokens in the current sentece to accumulate a list of tokens, then invoke the OpenNLP POS Tagger on the list of tokens.
| Param. Name | Description | Required | Default Value |
| caseSensitive | Is Tag Dictionary Use Case senstive | N | false |
| useTagdict | true if a tag dictionary should be used, please consider data fields tagdict, caseSensitive | N | true |
| tagDict | Path to tag Dictionary | N | pear_resources/models/postag/tagdict-genia |
| modelFile | N | pear_resources/models/postag/Tagger_Genia.bin.gz |
Usage (example):
@ch.epfl.bbp.uima.ScriptingShortcut(shortcut=ch.epfl.bbp.uima.ae.OpenNlpHelper.getPosTagger())
Sentence splitter, based on OpenNLP's MaxEnt SentenceDetector, and trained on biomedical corpora (PennBio or Genia corpora).
| Param. Name | Description | Required | Default Value |
| modelFile | N |
Usage (example):
@ch.epfl.bbp.uima.ScriptingShortcut(shortcut=ch.epfl.bbp.uima.ae.OpenNlpHelper.getSentenceSplitter())
OpennlpTokenizer.java Copyright (c) 2006, JULIE Lab. All rights reserved. This program and the accompanying materials are made available under the terms of the Common Public License v1.0 Author: buyko Current version: 2.0 Since version: 1.0 Creation date: 30.01.2008 Analysis Engine that uses the OpenNLP Tokenizer. This engine assumes that sentences have been annotated in the CAS. It iterates over sentences and invoke the OpenNLP Tokenizer on each sentence.
| Param. Name | Description | Required | Default Value |
| modelFile | N |
Usage (example):
ae: ch.epfl.bbp.uima.ae.TokenAnnotator modelFile:
OpenNLPChunker.java Copyright (c) 2007, JULIE Lab. All rights reserved. This program and the accompanying materials are made available under the terms of the Common Public License v1.0 Author: buyko Current version: 2.0 Since version: 1.0 Creation date: 30.01.2008 OpenNLP Chunker provides chunks to tokens in IOB format (e.g. B-NP, I-VP). This UIMA wrapper provides all needed input parameters to the OpenNLP Chunker and converts the IOB output of the OpenNLP Chunker in CAS.
Usage (example):
ae: de.julielab.jules.ae.opennlp.ChunkAnnotator
OpenNLPParser.java Copyright (c) 2007, JULIE Lab. All rights reserved. This program and the accompanying materials are made available under the terms of the Common Public License v1.0 Author: buyko Current version: 2.0 Since version: 1.0 Creation date: 30.01.2008 Wrapper for the OpenNLP Parser. Constituency-based parsing.
Usage (example):
ae: de.julielab.jules.ae.opennlp.ParseAnnotator
OpennlpPosTagger.java Copyright (c) 2006, JULIE Lab. All rights reserved. This program and the accompanying materials are made available under the terms of the Common Public License v1.0 Author: buyko Current version: 2.0 Since version: 1.0 Creation date: 30.01.2008 Analysis Engine that invokes the OpenNLP POS Tagger. This annotator assumes that sentences and tokens have been annotated in the CAS. We iterate over sentences, then iterate over tokens in the current sentece to accumulate a list of tokens, then invoke the OpenNLP POS Tagger on the list of tokens.
| Param. Name | Description | Required | Default Value |
| caseSensitive | Is Tag Dictionary Use Case senstive | N | false |
| tagset | the used postagset | N | de.julielab.jules.types.GeniaPOSTag |
| useTagdict | true if a tag dictionary should be used, please consider data fields tagdict, caseSensitive | N | true |
| tagDict | Path to tag Dictionary | N | pear_resources/models/postag/tagdict-genia |
| modelFile | N | pear_resources/models/postag/Tagger_Genia.bin.gz |
Usage (example):
ae: de.julielab.jules.ae.opennlp.PosTagAnnotator caseSensitive: false tagset: de.julielab.jules.types.GeniaPOSTag useTagdict: true tagDict: pear_resources/models/postag/tagdict-genia modelFile: pear_resources/models/postag/Tagger_Genia.bin.gz
OpennlpSentenceDetector.java Copyright (c) 2006, JULIE Lab. All rights reserved. This program and the accompanying materials are made available under the terms of the Common Public License v1.0 Author: buyko Current version: 2.0 Since version: 1.0 Creation date: 30.01.2008 This wrapper provides the interface to the OpenNLP Sentence Detector @see http://opennlp.sourceforge.net/
Usage (example):
ae: de.julielab.jules.ae.opennlp.SentenceAnnotator
OpennlpTokenizer.java Copyright (c) 2006, JULIE Lab. All rights reserved. This program and the accompanying materials are made available under the terms of the Common Public License v1.0 Author: buyko Current version: 2.0 Since version: 1.0 Creation date: 30.01.2008 Analysis Engine that uses the OpenNLP Tokenizer. This engine assumes that sentences have been annotated in the CAS. It iterates over sentences and invoke the OpenNLP Tokenizer on each sentence.
Usage (example):
ae: de.julielab.jules.ae.opennlp.TokenAnnotator


Hulu again raising prices for online live-TV service | Honolulu Star-Advertiser
Hulu is again raising prices for its online TV bundle, as other streaming-TV providers do the same.
Hulu’s service, like AT&T TV Now, Dish’s Sling and YouTube TV, are a replica of traditional TV but on the internet. They were once vaunted as a successor to traditional cable. But the market has lost steam as prices rise. One early entrant, Sony’s PlayStation Vue, is shutting down, and analysts expect others to follow.
The entertainment industry’s attention has shifted to new and upcoming streaming services like Apple TV Plus, Disney Plus, AT&T’s HBO Max and Comcast ‘s Peacock.
Hulu with Live TV’s price will rise $10, to $55 a month, in December. Prices had risen $5 in February.
The Disney-owned streaming provider’s traditional video-on-demand service will remain at $6 a month.


© 2015 Pet Clinic, A Spring Framework Demonstration.
Designed by Andrew Abogado. Developed by Tony Nguyen & Lim Han.


|
keigeki
1.0.0
傾撃
|
#import <CCActionGrid.h>
Instance Methods | |
| (ccVertex3F) | - vertex: |
| (ccVertex3F) | - originalVertex: |
| (void) | - setVertex:vertex: |
| Instance Methods inherited from CCGridAction | |
| (id) | - initWithSize:duration: |
| (CCGridBase *) | - grid |
| Instance Methods inherited from CCActionInterval | |
| (id) | - initWithDuration: |
| (BOOL) | - isDone |
| (CCActionInterval *) | - reverse |
Additional Inherited Members | |
| Class Methods inherited from CCGridAction | |
| (id) | + actionWithSize:duration: |
| Protected Attributes inherited from CCGridAction | |
| ccGridSize | gridSize_ |
| Properties inherited from CCGridAction | |
| ccGridSize | gridSize |
Base class for CCGrid3D actions. Grid3D actions can modify a non-tiled grid.
| - (ccVertex3F) originalVertex: | (ccGridSize) | pos |
returns the non-transformed vertex than belongs to certain position in the grid
| - (void) setVertex: | (ccGridSize) | pos | |
| vertex: | (ccVertex3F) | vertex | |
sets a new vertex to a certain position of the grid
| - (ccVertex3F) vertex: | (ccGridSize) | pos |
returns the vertex than belongs to certain position in the grid


Hooting Yard reader Richard Carter has a letter published in the latest edition of the London Review Of Books. I take the liberty of reproducing it here for your edification and instruction. Our resident anagrammatist R. (who is not Richard, by the way) should find it of particular interest:
Steven Shapin writes that Darwin's uncontrollable retching and farting seriously limited his public life (LRB, 30 June). Some years ago, to my delight, I worked out that the great man's full name, Charles Robert Darwin, is an anagram of ‘rectal winds abhorrer’. Unfortunately for my anagram, the meanings of words, like species, can evolve. On the rare occasions that Darwin mentioned his problems to friends, he always used the word ‘flatulence’. Nowadays, we think of flatulence as being synonymous with farting, but in Darwin's day it meant (as it technically still does) an accumulation of gases in the alimentary canal. While I'm sure that Darwin must have vented his excess gas one way or the other, there's no reason to believe that his farts were uncontrollable.


EaselJS Text font
Synopsis: Learn how to use google webs fonts within your CreateJS projects
Topics: Text class, google web fonts
Target: EaselJS v0.4.1 and above
This tutorial is part of the EaselJS GitHub repository.
Check out the repository for more tutorials and a handful of helpful samples.
CSS: Font Primer
When choosing a font it is important to know that browsers will only display fonts that are installed on the viewers machine. Lucky for us CSS has a fallback system: if the font you have selected is not installed, the browser will choose a similar font from a generic font set.
SERIF
Serif fonts have small lines tailing on the end of the main strokes of the letters.
Examples:
Georgia
Times
Times New Roman
SANS-SERIF
Sans-serif fonts have straight ends to letters and therefore have a much cleaner designs.
Examples:
Arial
Verdana
Helvetica
MONOSPACE
Letters and characters each occupy the same amount of horizontal space (Non-monospace fonts have different widths.)
Examples:
Courier
Courier New
CURSIVE
Cursive fonts either have joining strokes or other cursive characteristics, such as handwriting styles.
Examples:
Comic Sans
Monotype Corsiva
FANTASY
Fantasy fonts usually decorative fonts and are often used for titles. They are not designed for long bodies of text.
Examples:
Impact
Haettenschweiler
Basic Implementation
The font
property allows for any valid CSS font attribute. The font family property specifies what font
will be displayed. Common font names would be fonts like Helvetica, Arial, Courier, etc.
CSS provides a fallback, since all fonts might not be availble on all computers.
Generic families are these fallback: serif, sans-serif, cursive, fantasy, monospace.
For more information common fonts on all systems click here
If you run the following code you will see a basic "Hello World" message:
Alternatively, you can pass string, font-family and color value parameters to the constructor.
Google Web Fonts
Google web fonts provide a developers/designers the ability to use high-quailty web fonts that they can include within their HTML pages. Having over 600 fonts families to choose from you’ll be hard pressed to find one that wouldn’t work for your pages. One benefit for choosing Google Web Fonts is the caching benefits and bandwidth saving, since those fonts are stored on Google servers. Google has made this process of using their fonts very simple, you’ll be up and running before you know it.
Getting Started
- What you'll need to do first is head over to Google's font Catalog.
- Search for a font called Dorsa then add the font to your collection by clicking on the “Add to Collection” button found on the lower right hand side.
- Once you are ready to use the font, click on “Use” found on the bottom of page.
- Then you'll be prompted to verify your font settings and provide with stub code. Copy and paste the information below and add it to your web page.
- Now create an instance of the Text class, using the newly acquired font!


This week in The Dabbler I provide a unique insight into my working methods, casting a frank and unstinting* gaze upon the creative process involved in the writing of the masterpiece that is Porpoises Rescue Dick Van Dyke. Mention of which reminds me that, several days after publication, there may be one or two readers in far-flung corners of the earth who have not yet bought copies. You know who you are. Zip thyselves o'er to Lulu and make purchase now, tardy ones!
* NOTE : “Unstinting”, in this context, means “not involving at any stage the participation of a stint”. As any fule kno, a stint is a type of bird, specifically a very small wader known in North America as a peep. They can be difficult to identify because of the similarity between species, and various breeding, non-breeding, juvenile and moulting plumages, but you shouldn't let that stop you.


Feel free to contribute a codepen for this missing demo
Fork this codepen as the base template
To contribute: create an github issue with a link to your codepen


{{item.title}}
{{item.createdAt|moment:'fromNow'}} - {{item["Category.description"]}}{{item.price|currency:"$":0}}
AddNo results found
We found 0 results for "{{search}}" Use fewer keywords or try these instead
We found 0 results for "{{search}}" Use fewer keywords or try these instead


Welcome!
My name is Nidia Carranza.
I enjoy anything and everything that involves collaboration and creation!
I am a Chicago native, born and raise in the northwest side. I enjoy waking up early and working out when the gym is nearly empty (around 5am).
During my free time I love hanging out with my dog, Misterooni, and visiting places I have never been before. My favorite foods include: pepporoni pizza, chiles rellenos, perogis and rice pudding.
When I am not learning and diving into code/web development I teach students in my community in Belmont-Cragin and I run a "Girls Who Code" club.
It is my continuous love for learning that drives me to teach others and to always accept all challenges!


#assign lifecycle="active">
Put @PostConstruct
on a method that we want to run on startup just after all the
beans have been wired.
Typically we open a resource like network connections to a remote resource (cache, queue, database etc).
@Singleton public class CoffeeMaker { ... @PostConstruct public onStartup() { // connect to remote resource ... ... } ...
Put @PreDestroy
on a method that we want to run on shutdown.
Typically we want this method to close resources.
@Singleton public class CoffeeMaker { ... @PreDestroy public onShutdown() { // close resources ... } ...<@next "Factory" "factory"/>


SF Symbols 1.1 Update Brings Even More Symbols
by Andrew OrrApple has released an SF Symbols 1.1 update today, giving developers over 1,500 symbols to use in their apps.
SF Symbols 1.1
Developers can use SF Symbols in apps running on iOS 13 or later, watchOS 6 or later, and tvOS 13 and later.
Each symbol comes in a wide range of weights and scales, allowing you to easily design adaptable interfaces that look great. Symbols are easy to integrate into your app directly from within Xcode. And if you need a symbol that isn’t provided by SF Symbols, you can export template files to create your own with the same capabilities using a vector graphics editor. Version 1.1 adds custom symbol validation, a new sidebar with categories for faster browsing, and the option to receive updates automatically.
You can download SF Symbols 1.1 here.


Esp32 Remote Management
Esp32
Remote Management
Not connected
add_box
Connect
add
New connection
smartphone
System
info
Info
memory
Partitions
wifi
Network.WiFi
info
Status
storage
Storage
storage
Storage
New connection
HTTP
HTTPS
Type
IP
Invalid IP format
Port
Port must be a number
1
Version
Connect
Cancel


ICYMI #215: Acer Swift 5 Malaysia, Xiaomi CC9 Pro, Samsung Galaxy Note 10+ Kylo-Ren edition & more!
by Raywen OngThe Xiaomi CC9 Pro that comes with a 108MP main camera is now available to purchase in Malaysia. And if you need a light laptop, Acer has just launched their lightest laptop in Malaysia yesterday. All of these and more on today’s episode of ICYMI.
Samsung Galaxy Note 10+ Kylo-Ren Edition
In conjunction with the release of the new star wars movie next month, Samsung has released a special edition Kylo Ren-themed Galaxy Note 10+.
Xiaomi CC9 Pro Malaysia
Quad camera smartphones are everywhere. But if you want to own something a little bit different, the Xiaomi CC9 Pro that comes with 5 cameras in total is now available in Malaysia.
Acer Swift 5 Malaysia
Acer has launched their 990g laptop in Malaysia yesterday and it is the Swift 5. Click here to know more.
Oppo Reno 10X Zoom special edition is coming to Malaysia next week
The brand new variant of the Oppo Reno 10X Zoom will be arriving in Malaysia soon. This smartphone will be released in conjunction with the opening of Oppo’s new flagship store at The Gardens Mall on the 30th November.


Blockchain Dapp
Account :
Loading...
About Dapp
This disrtibuted application get the data from user and then stored it on the blockchain. User can get the entered data from blockchain.
Insert a integer value
Set Value
Get the inserted value
Value is :
Get Value


About Us
Ages 6 weeks - 5 years
Hours of Operation
Tuesday-Thursday
7:30-5:30
Drop in Care
Part Time Care
Mother's Day Out
Little Heroes has been in operation since 2015. Little Heroes was a long time dream of mine that came true with the birth of my daughter. I worked for the health department and struggled to find a daycare that offered both a home environment, and a place we felt comfortable and safe leaving our most prized possession in. My husband is a Paramedic and I am a trained First Responder. Above all, we wanted to ensure our child would be safe while away from us. This began the end of our search for child care and the start of Little Heroes Home Child Care. We are so thankful for all the little ones that have come into our lives and home, and look forward to caring for many more.
Child Safety
Child safety is our top priority here at Little Heroes. While accidents can happen anywhere, we want parents to know they have the best team caring for their loved ones.
Pics from Daycare
Contact Us
Phone
1-512-909-3322
Aliciapoulos360@gmail.com


About Me
I am Sona Shrestha. I live in Girraween. I am working as an Implementation Officer. Currently I am doing bootcamp course on Full Stack Web Development. It is helping to move forwards towards my career goal. I am looking for opportunity in Entry level Web Development.


menu
Gambit
foo
Gastown
Yaletown
East Van
West End
Stage Left
Pop Up
Flip!
Gastown
Yaletown
East Van
West End
That was nice
Gastown
Yaletown
East Van
West End
Toast is Ready
Done


Software engineering is the process of developing computer based software to benefit both industry and society as a whole.
The goal of Software Systems Engineering is to develop software that is:
-
Economical - ensuring that you are in full control of the costs when creating software. Ensuring this is managed in a commercial environment is critical to business
- Target Driven – ensuring that software developed meets the set specification. This is essential in a commercial environment. This is also essential in areas such as avionic software engineering (software used in aeroplanes) where software produced is used to prevent harm coming to civilians.
- Reliable – the ability to ensure that developed software has been thoroughly tested before deployment. This is to ensure both safety when used in practical scenarios and for software to essentially work as desired. This is to make sure users are not inconvenienced and potentially endangered.
- Adaptable – The ability to improve software to meet the changing requirements of users/companies. It also provides the ability to innovate new features for pieces of software.
- Safe - developed software is fundamentally safe when used in real life applications
- Economical - ensuring that you are in full control of the costs when creating software. Ensuring this is managed in a commercial environment is critical to business.
Software Development Process
In software engineering, a software development process is the process of dividing software development work into distinct phases to improve design, product management, and project management.
To learn more about the key processes involved in devopment cycle, click the following link.
Learn More


Publishing the Github Pages
As a part of documentation of the project work for proper ordering the Project Diarry and preparation of final report, I have tried to publishing in Github Pages. Thus created repository regarding github page. So these five weeks were dedicated to the Publication of the Repository in Github.
GitHub Pages is a static site hosting service that takes HTML, CSS, and JavaScript files straight from a repository on GitHub, optionally runs the files through a build process, and publishes a website. GitHub Pages is available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see "GitHub's products."
There are three types of GitHub Pages sites: project, user, and organization. Project sites are connected to a specific project hosted on GitHub, such as a JavaScript library or a recipe collection. User and organization sites are connected to a specific GitHub account. To publish a user site, you must create a repository owned by your user account that's named user.github.io. To publish an organization site, you must create a repository owned by an organization that's named organization.github.io. Unless you're using a custom domain, user and organization sites are available at http(s)://username.github.io or http(s)://organization.github.io.
Github Page Preview :


> You access the statistics before you actually start to search. That's wrong: > the statistics returned is always wrt the current state of the search. So, > what you want to do is to access stat() after you do the search. Ah, of course. That is obvious in retrospect! Thanks! Kellen


Congo A review by Joe Chamberlain
Starring Laura Linney; Dylan Walsh; Ernie Hudson; Tim Curry & Grant Heslov
Congo is based on the Michael Crichton novel of the same name. Laura Linney plays a scientist whose company has sent an expedition into the Congo to look for a lost city. While the expedition is in contact with their employers in the US via a video satellite link, they are attacked. Before the transmission is cut off, it appears as though the attackers are giant gorillas. Linney is told to mount another expedition to find out what happened. Her character hooks up with another expedition that is also going to the Congo. This one consists of a scientist who is returning his gorilla, Amy, to the Congo. Oh yeah, Amy knows sign language and the intrepid scientist has developed technology that interprets her signs into words. So Amy can speak. Sound kinda dumb? Well, in the original novel, Crichton pulls it off. The movie doesn't. Congo is a disappointment from the get go. Amy, as you might expect, is not a real gorilla -- and it shows. There are very few scenes in this movie were you might actually be fooled into thinking this was anything other than a guy in a bad gorilla suit.
The actors are largely wasted in this movie -- especially Ernie Hudson who plays the guide, and Tim Curry as the shady treasure hunter along for the ride. The rest of the cast is almost laughable. It may be as much a fault of the script as it was of the actors. I suppose if I was an actor, it would be pretty difficult trying to give my best effort while acting alongside a talking monkey. Not to mention the fact that Congo doesn't quite seem to know if it is an action movie or if it some sort of environmental cause. The movie seems to instantly switch gears back and fourth from this dangerous search for the lost city, to some sort of animal rights message that Amy should be with her own kind in the jungle and not in captivity. Of course that message is completely forgotten when the killer apes arrive and the cast starts unloading some heavy firepower into them. I'm not even going to go into the somewhat schizophrenic killer apes. For most of the movie they are portrayed as being these highly intelligent creatures, but during the final climactic scenes of the movie all those brains seem to have gone right out the window.
Confused? Don't feel bad. So were the filmmakers. The movie isn't a total disaster; it just could have been so much better considering the source of the story. Which, in all fairness, is not Crichton's best work. So let's just say this film is no Jurassic Park. The only high point, and we're not talking Mount Everest here, is the fact that some of the special effects weren't half bad. But they weren't good enough to make up for the guy in the bad monkey suit. My advice? If you are a Michael Crichton fan -- read the book. Everyone else should stay away from this movie and check out one of the better Crichton movie adaptations – like Jurassic Park or Rising Sun
5/10
Visit The Movie Guy http://movieguy.tripod.com
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


Money Play. How should Red play 32?
pips Red=149 White=134
(CorrectAnswer= 0/0, ErrorScore= 0)
The key to this position is to recognise that the blots on the 11- and 10-pts are assets and not liabilities. Behind in the race Red would love the chance to make another point in White’s home board.
Those blots exert pressure on White’s 16-pt. After you understand the strategy it’s not too difficult to find 7/4, 6/4 building the point you want next. Picking up both blots is nearly a blunder. Of course any play involving 22/20 is at least an error.
Those blots exert pressure on White’s 16-pt. After you understand the strategy it’s not too difficult to find 7/4, 6/4 building the point you want next. Picking up both blots is nearly a blunder. Of course any play involving 22/20 is at least an error.
1. Cubeful 2-ply 7/4 6/4 Eq.: -0.404 0.371 0.069 0.002 - 0.629 0.082 0.002 2. Cubeful 2-ply 11/8 6/4 Eq.: -0.430 (-0.026) 0.361 0.059 0.002 - 0.639 0.071 0.002 3. Cubeful 2-ply 10/7 6/4 Eq.: -0.438 (-0.034) 0.361 0.065 0.002 - 0.639 0.080 0.002 4. Cubeful 2-ply 11/8 10/8 Eq.: -0.456 (-0.051) 0.351 0.045 0.001 - 0.649 0.054 0.001 5. Cubeful 2-ply 11/6 Eq.: -0.458 (-0.053) 0.354 0.058 0.002 - 0.646 0.073 0.002


--- layout: page category: spec title: "Resource Hints" ---
| Current Status: | Working Draft (WD) |
|---|---|
| Canonical URI: |
http://www.w3.org/TR/resource-hints
|
| Abstract: | This specification defines the dns-prefetch, preconnect, prefetch, and prerender relationships of the HTML Link Element (<link>). These primitives enable the developer, and the server generating or delivering the resources, to assist the user agent in the decision process of which origins it should connect to, and which resources it should fetch and preprocess to improve page performance. |
Resource HintsUpdates:


Magnetic Mix 064: Pinz & Pelz
Sydney/Berlin duo, Pinz & Pelz drop in for a drum and bass mix.
by Ryan MiddletonSydney/ Berlin electronic music duo Pinz & Pelz released their new EP A Purer Life at the end of September. The six-tracker covers a lot of ground with some breakbeats, house music, ambient electronica and a touch of drum and bass. We asked them to make us a Magnetic Mix in honor of the new EP and they did something different. They pulled on the drum and bass thread that they rarely get to work with and made a full drum and bass mix.
“We’ve opened the set with our track ‘Distant Matter’ off our debut EP A Purer Life. We wanted to be able to have a mix revolve around this track in particular," explains the duo. "We’ve only been able to drop a handful of DnB tracks during our sets over the last month and we’ve always loved it so we thought we’d put together a mix exclusively of DnB & exclusively for Magnetic Mag. As always Pinz & Pelz are for all dance floors & all people."
See the full tracklist below and follow along as you listen.
TRACKLIST
1. Roche - Extending Peace Beyond The Stars
2. Pinz & Pelz - Distant Matter
3. Intense - Only You
4. Taso - Bussin’
5. Sully - Helios (Philip K Dick Remix)
6. Equinox - Feelin’ You
7. Moomin - Move You
8. Stones Taro - Full Train
9. Rhiov - Juice It
10. Doc Scott - Far Away
11. Wax Doctor - The Spectrum
12. J Majik & Sense - Originate
13. Adam Feingold - Rapcha
14. G. Markus - Sleepless Moon (queniv dnb remix)
15. Roche - Extending Peace Beyond The Stars