Default Activity Privacy ${privacy_options}
Preferred Units ${unit_options}
New Email Address:
Note: Your email address is only used for login authentication.
Current Password:
New Password:
Confirm Password:
Password:
Note: This cannot be undone.


Acquired 25 grams Mimosa Hostilis, 10 grams Syrian Rue (Peganum harmala) extract that was had 4:1 ratio. Prepared a pitcher of 1 part lemon juice, 2 parts water, 250mg ascorbic acid (vitamin C).
Dumped MH and Rue into cooking pot, covered with lemonmixture. Began praying Sanskrit mantras and sending positive energy to the brew from my third eye. Simmered at 190 F for 20 minutes, strained through new pantyhose. Squeezed out richest drops, repeated procedure a total of four times. Set overnight in pantry in sealed tupperware bowl. Thought about the brew all the nest day till I got home to it, giving it love and praying to it to take me for a walk. Through the 64 dimensions.
It took myself and someone else 30 minutes to drink the Ayahuasca, split into two drinks, of course. Within another halfhour of finishing the drinks, we purged, one after another. One must keep the drink down until you feel the effects or they will go nowhere at all. I suggest you do not take any other substances, no alcohol, and no food.
Once you feel the effects, go and purge. It is a positive experience to purge as all negativity is pushed out. As I got up from the toilet from my knees, I knew that the veil between the dimensions was thinner due to the DMT opening up the bandwidth to receive the signal from formless nameless god. I was aware of beings in my bathroom, and one I saw out of the corner of my eye and when I turned it was still there. It was bewildered at the sight of me, as if I looked like a smoky ghost in its dimension. I gave it love from my third eye and it sent me postivity and faded.
 You could OD on DMT, but it would be a literal death. You would actually evacuate your soul. One must find god in formlessness to know where to go at time of evacuation or else once the bandwidth is open, you will go through and instantly forget and merely be reassigned top another point on the life meridian grid.
I found that third eye meditation with pranayama breathing and Alex Gray mindfold goggles caused me to reach a wonderful understanding.
(BTW the trails are amazing, the colors blah blah blah.) I began to seek god through these myriad universes that I saw in my third eye. It came to me. Like a child in the presence of the sun I marveled at the millions of faces and eyes and soft colors.
I thought to it 'I have no questions at this point.'
It thought back 'you are one with me'
Then it multiplied exponentially, I began to fall from my seat on the edge of the tub, I came back before injury.
I returned to the vast nameless all encompassing god after I sat in
another room. As I arrived through the bandwidth, a message was running across the scene, like fast tickertape. I slowed it down and it said, 'the source of all creation is the flow of time itself'
I came back, got a pen and pad, and went through again. I asked for a symbol and my hand was taken and led through a design to symbolize what IT ALL IS, in that specific portion of time and space as it is ever changing, the formless nameless true god.
At this point an hour and a half had elapsed since ingestion.  The trip picked back up and this time, having felt that I had enough to dig on for awhile on the sober course in the afterward, I lay on the floor and just watched my mind for awhile.
 No wanting to sleep and can't. A cat on the internet said 'mushrooms are the dialect of the language of DMT.' DMT is a true entheogen in that it won't hurt you IF YOU HAVE NO DEMONS (in that I mean, you can accept the truth from your cosmic eternal encoding for physical life and follow it instead of suppressing because you think it would be too hard to change something to follow the true flow. when you deny the Truth of your self, coming through in signals from god, fear and rage form.  DMT pops your cestial antenna up and out in full array to receive the signal.
Any fool can pop some lysergic and live, but DMT is an eye opener.
I've taken lysergic maybe 200 times. No experience adds up to the epiphany of ayahuasca. I do not recommend anybody consume ayahuasca until they understand the Truth. This is knowledge, not the answer. Take this knowledge and form your own answer. Too many times in human history folks encounter a new concept or idea and take is as an answer or a lie, when in fact any new thing is just knowledge.
THIS IS JUST KNOWLEDGE. USE IT TO FORM AN ANSWER THAT WORKS FOR YOU.
I send love and peace to my fellow travelers.
The whole experience lasted about 2 and 1/2 hours, with peak after the first 45 minutes. No OTC meds were taken, fasting was done for one day prior. The someone else that was with me had a wonderful experience as well, but doe not wish to share it with the net.
Can you believe a tea made from tree bark, flower seeds and a lemon is illegal?
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


AMZI! INC. ("AMZI!")   IF YOU DO NOT AGREE TO THESE TERMS, AMZI! WILL NOT LICENSE THIS SOFTWARE TO YOU, AND YOU MAY NOT USE THE SOFTWARE.  OR YOUR PLACE OF PURCHASE FOR A REFUND.
SOFTWARE LICENSE
Ownership of the Software. The enclosed Amzi! software program ("Software") and the accompanying written materials ("Documentation") are owned by Amzi! [or its suppliers] and are protected by United States copyright laws and by international treaties. The Software is licensed, not sold.
The Software is used by a programmer ("Developer") to create executable software "Programs" and the "Distributable Runtime" is used to run the Programs on a Windows or Unix operating system ("Platform"). "Windows" is any Windows operating system from Microsoft. "Unix" is any Unix-based operating system and includes Linux, Solaris and HP/UX.
Amzi! reserves all rights not expressly granted.
License Rights--The "Grant of License" section that applies to you depends on the Edition you are running, and, under Windows, the license key you have entered. Under Windows, if you do not have a license key you are using the Free Edition. Under Unix, if you have not purchased a license, you are using the Free Edition. The name of the Edition you have installed is displayed when you run the Software.
Free Edition Grant of License--Amzi! grants you the right to install and use the Software on one or more computers owned by you for personal and/or educational use. If you are a professional, business or government organization, you may use the Software for 30-days for evaluation purposes. You may not redistribute the Amzi! Distributable Runtime or any other part of the Software.
Student Edition Grant of License--Amzi! grants you the right to use a copy of the Software on a single computer for personal and/or educational use. If you are a professional, business or government organization, you may use the Software for educational purposes only. You may not redistribute the Amzi! Distributable Runtime or any other part of the Software.
Student LAN Edition Grant of License--Amzi! grants you the right to use the number of copies of the Software specified in the license key in your computing facilities for educational use. If you are a professional, business or government organization, you may use the Software for educational purposes only. You may not redistribute the Amzi! Distributable Runtime or any other part of the Software.
Developer and Professional Edition Grant of License--For each Developer or Professional Developer License you have purchased, Amzi! grants to you, as an individual, the right to use a copy of the Software on a single computer. If you are an entity, Amzi! grants you the right to designate one individual within your organization to have the right to use the Software in the manner provided above. You may distribute your Programs according to the terms of the "Amzi! Prolog Redistributable Runtime Software" paragraph below.
Amzi! Prolog Distributable Runtime Software. For each Developer or Professional Runtime License you have purchased, Amzi! grants to you the royalty-free right to reproduce and distribute an unlimited number of copies on one platform (Windows, Linux, Solaris or HP/UX) of: (1) the executable files (Program) created using the Software and (2) the Amzi! Prolog runtime modules identified in the accompanying written materials as "Redistributable" provided that you: (a) write your Program with a licensed, registered copy of the Software, (b) do not include a Prolog compiler in your Program, (c) include the Redistributable modules only in conjunction with and as a part of your Program, (d) include a valid copyright notice, (e) do not permit further redistribution of the Redistributable modules by your end-users or customers and (f) agree to indemnify, hold harmless Amzi! and its suppliers from and against any claims or lawsuits, including reasonable attorney's fees, that arise or result from the use or distribution of your Program.
Under no conditions may you distribute the source code, listener, IDE, compiler, linker, libraries or Documentation included in this Software. For different licensing arrangements, please contact Amzi!
Evaluation Editions Grant of License (custom configurations for specific evaluation requirements)--Amzi! grants to you, as an individual, the right to use a copy of the Software on a single computer, for evaluation purposes only, for the number of days specified in the license key. You may not redistribute the Amzi! Distributable Runtime or any other part of the Software.
Updates. Upon receipt of future updates of the Software (an "Update"), you may use or transfer the Update only in conjunction with your then existing Software. The Software and all Updates are licensed as a single product, and the Updates may not be separated from the Software for use by more than one individual at any time.
Restrictions on Use and Transfer. You may not copy the Software or Documentation except solely for backup or archival purposes. You may not rent, lease, lend or provide commercial hosting services with the Software or otherwise transfer or assign the right to use the Software except as provided below. You may not reverse engineer, decompile, or disassemble the Software, except and only to the extent that such activity is expressly permitted by applicable law. notwithstanding this limitation. You may not create derivative works from the Software or the Documentation.
If you have purchased a Developer or Professional License, you may permanently transfer the Software and accompanying materials (including all Updates and prior versions) provided you retain no copies and the transferee agrees to be bound by the terms of this Agreement. Such a transfer terminates your license.
Sample Code. You have a royalty-free license to incorporate the source code for the modules designated as "Samples" into your own Programs and distribute the executable files created from that source code according to the terms stated above. You may not distribute any portion of the Samples source code in any form.
Export Restrictions. This Software is subject to U.S. Export Administration Regulations. You may not acquire, ship, transfer, or reexport the Software into any country or to any person or entity prohibited by the Regulations including, but not limited to, the countries of Cuba, Iran, Iraq, Libya, North Korea, Sudan, and Syria. You warrant and represent that neither the U.S.A. Bureau of Export Administration nor any other federal agency has suspended, revoked or denied your export privileges. This license is valid only for use within the country of the original purchaser or, if purchased in the EEC (European Economic Community), within any country in the EEC.
Termination. Amzi! may terminate this Agreement if you fail to comply with its terms and conditions. In such event, you must destroy all copies of the Software.
General. Whenever possible, each provision of this License Agreement shall be interpreted in a manner as to be valid and effective under applicable law. If any provision is found to be unlawful, void or for any reason unenforceable, then that provision shall be deemed severable from this License Agreement and shall not affect the validity and enforceability of the remaining provisions. This Agreement is governed by the laws of the State of North Carolina. For questions concerning this Agreement, please contact Amzi! inc. 47 Redwood Road, Asheville, NC 28804 U.S.A., Telephone +1-828-350-0350.
LIMITED WARRANTY
Amzi! warrants that the Software will perform substantially in accordance with the accompanying Documentation for a period of 90 days from the date of your receipt of the Software. Any implied warranties on the Software are limited to 90 days. Some states do not allow limitations on duration of an implied warranty, so the above limitation may not apply to you.
AMZI!  This limited warranty gives you specific legal rights. You may have others, which vary from state to state.
AMZI! INC.'S ENTIRE LIABILITY AND YOUR EXCLUSIVE REMEDY SHALL BE, AT AMZI! INC.'S CHOICE, EITHER (A) RETURN OF THE PRICE PAID OR (B) REPLACEMENT OF THE SOFTWARE THAT DOES NOT MEET AMZI! INC.'S LIMITED WARRANTY AND WHICH IS RETURNED TO AMZI!  Any replacement Software will be warranted for the remainder of the original warranty period or 30 days, whichever is longer.
IN NO EVENT WILL AMZI!  HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. Because some states do not allow the exclusion or limitation of liability for consequential or incidental damages, the above limitation may not apply to you.
U.S. GOVERNMENT RESTRICTED RIGHTS
The Software and documentation are provided with Restricted Rights. Use, duplication, or disclosure by the Government is subject to restrictions set forth in subparagraph (c)(1) of The Rights in Technical Data and Computer Software clause at DFARS<PHONE_NUMBER> or subparagraphs (c)(1) and (2) of Professional Computer Software-Restricted Rights at 48 CFR 52.227-19, as applicable. Manufacturer is Amzi! inc. 47 Redwood Road, Asheville, NC 28804 U.S.A.


Hello, Earth! I want to apologize for hurting you
I wish I could vanish your sufferings, but I can't
Every night I dream of you, beautiful as always
Thank you for your sacrifices
I hope to do the same one day


REFLECTION
What parts of your strategy worked? What problems did you face?
This was my first pairing session and I believe we followed the protocol to a T. Our strategy to have my partner drive through the first half, and I drove through the second. Strategically, I do not believe that either of us faced any problems.
What questions did you have while coding? What resources did you find to help you answer them?
We definitely had a few questions on the best way to move the menu from the side bar to top bar. Also, we had questions about how to get text to be fluid. We used various sources found through a google search.
What concepts are you having trouble with, or did you just figure something out? If so, what?
We initially have trouble with media query concepts but definitely gained a better understanding as the session progressed.
Did you learn any new skills or tricks?
I learned about using vw as a measurement for text to make it fluid. Very helpful.
How confident are you with each of the Learning Competencies?
I feel confident. But I definitely need more time on media queries.
Which parts of the challenge did you enjoy?
I enjoyed working with a partner and solving our issues together.
Which parts of the challenge did you find tedious?
Moving the navigation from the side bar to the top bar. It shouldn't have been that difficult! I found it tedious to continue trial and error until it finally worked.


On October 29, 2019, Lancaster was sentenced by Justice Simone Morris-Ramlall, at the Sexual Offenders Court at the High Court, for rape of a child under the age of 16 and sexual activity.
The first charge stated that, on October 6, 2018, in Linden, he engaged in sexual penetration with a child under the age of 16.
The second charge alleged that, on November 6, 2018, Lancaster engaged in sexual activity with the child, by touching her vagina.
He was sentenced to 15 years’ imprisonment on the first charge and 7 years’ imprisonment for the second charge. Justice Morris-Ramlall had ordered that the sentences run concurrently.
Lancaster’s attorneys, Gordon Gilhuys and Yondessa Welcome-Mercurius, moved to the appeal court and filed an appeal to challenge their client’s conviction and sentence.
One of the grounds of the appeal was that Justice Morris-Ramlall made an error in summing up the evidence to the jury.
Another ground stated that the trial judge misdirected the jury when she proposed to them that she would not read all the evidence while summing up.
Further, Lancaster’s attorneys are arguing that the Judge’s ‘summing up’ was not balanced and favoured to the prosecution.
The court of appeal is yet to set a date in this matter.
More Caribbean Stories
-
Jamaica: 16 businesses charged for breaching plastic ban – NEPA November 22, 2019
-
Jamaican held on drug charges in Antigua November 22, 2019
-
Trinidad motorists discover murdered man November 22, 2019
-
Trinidad: Matelot’s beloved community activist murdered November 22, 2019
-
Barbados PM: Power outage ‘embarrassing’ November 22, 2019
-
Mother, son shot dead in Trinidad November 22, 2019
-
Death at a wake in Trinidad November 22, 2019
-
Jamaican man lands on US most wanted list for girlfriend’s murder November 22, 2019
-
Custom plates for Trinidad & Tobago in January November 22, 2019


Our Story
The couple who won Tinder!
Our love story began back in 2016 when Erran sent a super-like to Annie on Tinder while putting his Tinder Plus subscription to good use.
The two matched shortly after but it was a while before they actually chatted. However, once they started, they were in non-stop and ever so slightly obsessive communication with each other.
While on a night out with her friend Shannon (now a bridesmaid) some weeks later, Annie had mentioned, again, this guy she was chatting to and going on about how nice he was. So Shannon messaged Erran off Annie’s phone asking him if he would like to come down and join them in Ollies Nightclub in Belfast.
They were both shocked when he replied YES and said he would be there in 15 minutes. PANIC! The butterflies were real and there were lots of smiles, hugs and giggles when the couple met for the first time in person and they danced the night away and went on to be inseparable since that evening. After some flirtatious banter and discovering a real mutual love of travel, design, technology and partying in late-night bars… the rest is history!
Many memories and moons later, A&E have travelled to Spain, France, America, the Netherlands and Ireland. Have moved in together and had the greatest little surprise to ever happen to them, Kai. A few months ago, Erran finally popped the question during his parents’ house-warming party in front of their friends and family, and Annie said yes. Now they can’t wait for this exciting new chapter in their lives to begin!


;
This is the first paragraph
This is the second paragraph
This is the third paragraph
This is the fourth paragraph


First Name:
Last Name:
First Name: {{order.firstName}} Last Name: {{order.lastName}}
Address:
City:
State:
Zip / Postal Code:
First Name: {{order.firstName}} Last Name: {{order.lastName}} Address: {{order.address}} City: {{order.city}} Zip: {{order.zip}} State: {{order.state}}


Working with JavaScript in Rails¶ ↑
This guide covers the built-in Ajax/JavaScript functionality of Rails (and more); it will enable you to create rich and dynamic Ajax applications with ease!
After reading this guide, you will know:
-
The basics of Ajax.
-
Unobtrusive JavaScript.
-
How Rails' built-in helpers assist you.
-
How to handle Ajax on the server side.
-
The Turbolinks gem.
An Introduction to Ajax¶ ↑
In order to understand Ajax, you must first understand what a web browser does normally.
When you type http://localhost:3000
into your browser's
address bar and hit 'Go,' the browser (your 'client') makes
a request to the server. It parses the response, then fetches all
associated assets, like JavaScript files, stylesheets and images. It then
assembles the page. If you click a link, it does the same process: fetch
the page, fetch the assets, put it all together, show you the results. This
is called the 'request response cycle.'
JavaScript can also make requests to the server, and parse the response. It also has the ability to update information on the page. Combining these two powers, a JavaScript writer can make a web page that can update just parts of itself, without needing to get the full page data from the server. This is a powerful technique that we call Ajax.
Rails ships with CoffeeScript by default, and so the rest of the examples in this guide will be in CoffeeScript. All of these lessons, of course, apply to vanilla JavaScript as well.
As an example, here's some CoffeeScript code that makes an Ajax request using the jQuery library:
$.ajax(url: "/test").done (html) -> $("#results").append html
This code fetches data from “/test”, and then appends the result to the
div
with an id of results
.
Rails provides quite a bit of built-in support for building web pages with this technique. You rarely have to write this code yourself. The rest of this guide will show you how Rails can help you write websites in this way, but it's all built on top of this fairly simple technique.
Unobtrusive JavaScript¶ ↑
Rails uses a technique called “Unobtrusive JavaScript” to handle attaching JavaScript to the DOM. This is generally considered to be a best-practice within the frontend community, but you may occasionally read tutorials that demonstrate other ways.
Here's the simplest way to write JavaScript. You may see it referred to as 'inline JavaScript':
Paint it red
When clicked, the link background will become red. Here's the problem: what happens when we have lots of JavaScript we want to execute on a click?
Paint it green
Awkward, right? We could pull the function definition out of the click handler, and turn it into CoffeeScript:
paintIt = (element, backgroundColor, textColor) -> element.style.backgroundColor = backgroundColor if textColor? element.style.color = textColor
And then on our page:
Paint it red
That's a little bit better, but what about multiple links that have the same effect?
Paint it red Paint it green Paint it blue
Not very DRY, eh? We can fix this by using events instead. We'll add a
data-*
attribute to our link, and then bind a handler to the
click event of every link that has that attribute:
paintIt = (element, backgroundColor, textColor) -> element.style.backgroundColor = backgroundColor if textColor? element.style.color = textColor $ -> $("a[data-background-color]").click (e) -> e.preventDefault() backgroundColor = $(this).data("background-color") textColor = $(this).data("text-color") paintIt(this, backgroundColor, textColor)
Paint it red Paint it green Paint it blue
We call this 'unobtrusive' JavaScript because we're no longer mixing our JavaScript into our HTML. We've properly separated our concerns, making future change easy. We can easily add behavior to any link by adding the data attribute. We can run all of our JavaScript through a minimizer and concatenator. We can serve our entire JavaScript bundle on every page, which means that it'll get downloaded on the first page load and then be cached on every page after that. Lots of little benefits really add up.
The Rails team strongly encourages you to write your CoffeeScript (and JavaScript) in this style, and you can expect that many libraries will also follow this pattern.
Built-in Helpers¶ ↑
Rails provides a bunch of view helper methods written in Ruby to assist you in generating HTML. Sometimes, you want to add a little Ajax to those elements, and Rails has got your back in those cases.
Because of Unobtrusive JavaScript, the Rails “Ajax helpers” are actually in two parts: the JavaScript half and the Ruby half.
rails.js provides the JavaScript half, and the regular Ruby view helpers add appropriate tags to your DOM. The CoffeeScript in rails.js then listens for these attributes, and attaches appropriate handlers.
form_for¶ ↑
form_for
is a helper that assists with writing forms. form_for
takes a
:remote
option. It works like this:
<%= form_for(@article, remote: true) do |f| %> ... <% end %>
This will generate the following HTML:
<form accept-charset="UTF-8" action="/articles" class="new_article" data-remote="true" id="new_article" method="post"> ... </form>
Note the data-remote="true"
. Now, the form will be
submitted by Ajax rather than by the browser's normal submit mechanism.
  To do that, bind to the ajax:success
event. On failure, use ajax:error
. Check it out:
$(document).ready -> $("#new_article").on("ajax:success", (e, data, status, xhr) -> $("#new_article").append xhr.responseText ).on "ajax:error", (e, xhr, status, error) -> $("#new_article").append "
ERROR
"
Obviously, you'll want to be a bit more sophisticated than that, but it's a start. You can see more about the events in the jquery-ujs wiki.
form_tag¶ ↑
form_tag
is very similar to form_for
. It has a :remote
option that you can use like this:
<%= form_tag('/articles', remote: true) do %> ... <% end %>
This will generate the following HTML:
<form accept-charset="UTF-8" action="/articles" data-remote="true" method="post"> ... </form>
Everything else is the same as form_for
. See its documentation
for full details.
link_to¶ ↑
link_to
is a helper that assists with generating links. It has a
:remote
option you can use like this:
<%= link_to "an article", @article, remote: true %>
which generates
an article
You can bind to the same Ajax events as form_for
. Here's
an example. Let's assume that we have a list of articles that can be
deleted with just one click. We would generate some HTML like this:
<%= link_to "Delete article", @article, remote: true, method: :delete %>
and write some CoffeeScript like this:
$ -> $("a[data-remote]").on "ajax:success", (e, data, status, xhr) -> alert "The article was deleted."
button_to¶ ↑
button_to
is a helper that helps you create buttons. It has a :remote
option that you can call like this:
<%= button_to "An article", @article, remote: true %>
this generates
<form action="/articles/1" class="button_to" data-remote="true" method="post">
<input type="submit" value="An article">
 </form>
Since it's just a <form>
, all of the information on
form_for
also applies.
Server-Side Concerns¶ ↑
Ajax isn't just client-side, you also need to do some work on the server side to support it. Often, people like their Ajax requests to return JSON rather than HTML. Let's discuss what it takes to make that happen.
A Simple Example¶ ↑
Imagine you have a series of users that you would like to display and provide a form on that same page to create a new user. The index action of your controller looks like this:
class UsersController < ApplicationController def index @users = User.all @user = User.new end # ...
The index view (app/views/users/index.html.erb
) contains:
Users
 <%= render @users %>

 <%= form_for(@user, remote: true) do |f| %> <%= f.label :name %>
 <%= f.text_field :name %> <%= f.submit %> <% end %>
The app/views/users/_user.html.erb
partial contains the
following:

<%= user.name %>

The top portion of the index page displays the users. The bottom portion provides a form to create a new user.
The bottom form will call the create
action on the
UsersController
. Because the form's remote option is set
to true, the request will be posted to the UsersController
as
an Ajax request, looking for JavaScript. In order to serve that request,
the create
action of your controller would look like this:
# app/controllers/users_controller.rb # ...... def create @user = User.new(params[:user]) respond_to do |format| if @user.save format.html { redirect_to @user, notice: 'User was successfully created.' } format.js {} format.json { render json: @user, status: :created, location: @user } else format.html { render action: "new" } format.json { render json: @user.errors, status: :unprocessable_entity } end end end
Notice the format.js in the respond_to
block; that allows the
controller to respond to your Ajax request. You then have a corresponding
app/views/users/create.js.erb
view file that generates the
actual JavaScript code that will be sent and executed on the client side.
$("<%= escape_javascript(render @user) %>").appendTo("#users");
Turbolinks¶ ↑
Rails 4 ships with the Turbolinks gem. This gem uses Ajax to speed up page rendering in most applications.
How Turbolinks Works¶ ↑
Turbolinks attaches a click handler to all
on the
page. If your browser supports PushState,
Turbolinks will make an Ajax request for the page, parse the response, and
replace the entire
of the page with the

of the response. It will then use PushState to
change the URL to the correct one, preserving refresh semantics and giving
you pretty URLs.
The only thing you have to do to enable Turbolinks is have it in your
Gemfile, and put //= require turbolinks
in your CoffeeScript
manifest, which is usually
app/assets/javascripts/application.js
.
If you want to disable Turbolinks for certain links, add a
data-no-turbolink
attribute to the tag:
No turbolinks here.
Page Change Events¶ ↑
When writing CoffeeScript, you'll often want to do some sort of processing upon page load. With jQuery, you'd write something like this:
$(document).ready -> alert "page has loaded!"
However, because Turbolinks overrides the normal page loading process, the event that this relies on will not be fired. If you have code that looks like this, you must change your code to do this instead:
$(document).on "page:change", -> alert "page has loaded!"
For more details, including other events you can bind to, check out the Turbolinks README.
Other Resources¶ ↑
Here are some helpful links to help you learn even more:


Overview
Package
Class
Use
Tree
Deprecated
Index
Help
PREV LETTER
NEXT LETTER
FRAMES
NO FRAMES
All Classes
A
B
C
D
E
F
G
H
I
J
L
M
N
O
P
R
S
T
U
V
W
M
MAGIC
- Static variable in class com.oregonscientific.meep.util.
DiskLruCache
match(Message<?>)
- Method in class com.oregonscientific.meep.msm.
MessageFilter
Test whether this filter matches the given message.
match(String, String, int)
- Method in class com.oregonscientific.meep.msm.
MessageFilter
Tests whether this filter matches the given data.
MATCH_OPERATION
- Static variable in class com.oregonscientific.meep.msm.
MessageFilter
The filter matched a message with the same operation.
MATCH_PROCESS
- Static variable in class com.oregonscientific.meep.msm.
MessageFilter
The filter matched a message with the same process.
MATCH_STATUS
- Static variable in class com.oregonscientific.meep.msm.
MessageFilter
The filter matched a message with the same status code.
matchOperation(String)
- Method in class com.oregonscientific.meep.msm.
MessageFilter
Match this filter against a message's operation code.
matchProcess(String)
- Method in class com.oregonscientific.meep.msm.
MessageFilter
Match this filter against a message's process code.
maxSize()
- Method in class com.oregonscientific.meep.util.
DiskLruCache
Returns the maximum number of bytes that this cache should use to store its data.
MEEPEnvironment
- Class in
com.oregonscientific.meep
Provides access to environment variables.
MEEPEnvironment()
- Constructor for class com.oregonscientific.meep.
MEEPEnvironment
memCacheSize
- Variable in class com.oregonscientific.meep.util.
ImageCache.ImageCacheParams
memoryCacheEnabled
- Variable in class com.oregonscientific.meep.util.
ImageCache.ImageCacheParams
Message
<
T
> - Class in
com.oregonscientific.meep.msm
Defines a message containing meta information and protocol data that can be sent to a MEEP server.
Message(String, String)
- Constructor for class com.oregonscientific.meep.msm.
Message
Constructor
MESSAGE_FIELD_NAME
- Static variable in class com.oregonscientific.meep.log.
Log
MESSAGE_FIELD_NAME
- Static variable in class com.oregonscientific.meep.notification.
Notification
MessageFilter
- Class in
com.oregonscientific.meep.msm
Structured description of message values to be matched.
MessageFilter()
- Constructor for class com.oregonscientific.meep.msm.
MessageFilter
New empty MessageFilter.
MessageFilter(String)
- Constructor for class com.oregonscientific.meep.msm.
MessageFilter
New MessageFilter that matches a single process with no operation.
MessageFilter(String, String)
- Constructor for class com.oregonscientific.meep.msm.
MessageFilter
New MessageFilter that matches a single message process and an operation code
Model
<
T
,
ID
> - Class in
com.oregonscientific.meep.database
The Model object that represents an object in the underlying datastore
Model()
- Constructor for class com.oregonscientific.meep.database.
Model
moveToNextValue(Object)
- Method in class com.oregonscientific.meep.database.
LocalCurrentTimeStampType
Overview
Package
Class
Use
Tree
Deprecated
Index
Help
PREV LETTER
NEXT LETTER
FRAMES
NO FRAMES
All Classes
A
B
C
D
E
F
G
H
I
J
L
M
N
O
P
R
S
T
U
V
W


Keep informed about the performance of your processes with the multiple indicators available on top of the process engine.
You can click on the different indicators to go straight to the target information about the process instances and tasks.
Click on any report table to see the details of a concrete process instance or task.
You can design table reports and export them to Excel or CSV files.


Using this WebApp you can predict whether a user will be able to repay the loan debt after the graduation.
{{ prediction_text }}


NEWS.md
Extensions:
save_settings_option
to ExPanD()
defaulting to TRUE
so that users can start the app without the settings dialog at the bottom (issue #8)Minor Issues:
lfe
for prepare_regression_table()
OLS regressions. lfe
is back on CRAN and allows for multiple fixed effects and multi-level clustering. It is now being run with cmethod='reghdfe'
to make clustered standard errors consistent with Stata’s reghdfe
Extensions:
Added a prepare_by_group_trend_graph()
function to plot time trends by grouping variable
Included grouped time trend plots in ExPanD()
Bug fixes:
Fixed notebook code for sub sampling (failed on sampling variables containing NA
s)
Fixed a small issue in the Notebook generation code for the time trend and quantile trend chunks
Fixed display of prepare_regression_table()
for logit model by group tables with fixed effects
Minor Issues:
Replaced lfe
with plm
package for fixed effect models as lfe
has been removed from CRAN
Removed wbstats
from Suggests as it is currently not on CRAN
Removed tidyquant
package from Suggests as it depends on a package that requires R >= 3.5.0
Spelling
Extensions:
ExPanD()
and the resulting notebookBug fixes:
ExPanD()
displays from rendering on user uploaded panel dataMinor Issues:
Updated World Bank data
Allowed ExPanD()
to be called with ts_id == NULL
and cs_id != NULL
so that data frame variables can be specified as cross-sectional identifiers in the cross-sectional mode
Removed some artefacts in cross-sectional mode where cross-sectional and time series identifiers were still provided as variable options in the ExPanD()
app
Included manual zip package import in NAMESPACE
to make devtoools::check()
happy on various CRAN systems
Changed shinyapps.io URLs in vignettes to plain HTTP as win-builder seems to have an issue with the SSL handshake of shinyapps.io
Extensions:
Modified ExPanD()
to process cross-sectional data with useful defaults
Implemented an export option that allows users to download a zip file containing the data and a R notebook based variant of the ExPanD analysis (export_nb_option = TRUE
)
Minor issues:
Added an option ‘binary’ to prepare_missing_values_graph()
to visualize whether any values are missing
Typo fixes
Extensions:
Introduced html_block
tag in components
to allow users to add self-designed html content to ExPanD()
Added sample_selection
, subset_factor
, grouping
and udvars
variables to components
in ExPanD()
so that these parts can also be re-arranged or omitted
Allowed user defined variables to be built on analysis variables and used in simple_mode
Added new vignette to explain new features
Bug fixes:
Made Stata import more robust
Fixed hover code in correlation and scatter plots to adjust for img_css_ratio
Minor issues:
Removed non-ASCII characters from NAMESPACE
Allowed more flexible handling of binary variables in ExPanD()
Added additional examples to Github repository (not in package)
Updated World Bank data
Switched to openssl package (Thank you to Jeroen Ooms for the PR)
Marginally improved error checking for config upload
Extensions:
Removed the requirement for at least one non-numerical variable
Added by group violin plot
Included !
and is.na()
as allowed functions for user defined variables
Introduced the option to change the order of reported components and to exclude selected components
Added clustered standard errors and fixed effects for logit models in prepare_regression_table()
Implemented binary response logit models in ExPanD()
Bug fixes:
Fixed a sorting bug in long variable definition construction
Fixed a bug in ExPanD()
extreme obs plot (was sorting on grouping variable)
Minor issues:
Removed the dependency with the CodeDepends package
Added rio package to the imports list
Added packages used by ExPanD()
to NAMESPACE
to make CRAN checks happy
UI cleanups
Fixed the definition of oint_ta
in r3
dataset
Added a check to verify that ts_id
is provided as an ordered vector
Fixed a typo in worldbank_var_def
Removed the drop_undersore
parameter in prepare_regression_table()
(no longer needed)
Work-around for special characters in stargazer column.labels
Marginally improved error handling for user provided data files
Allowed treat_outliers()
to route parameters through to stats::quantile()
(needed for type parameter)
Changed NA
handling in prepare_graph
type functions


Trump vows US Navy will not oust commando who posed with corpse from SEALs
WASHINGTON: US President Donald Trump on Thursday (Nov 21) blasted the US Navy's handling of a Navy SEAL whose rank he recently restored following a court martial, saying he would not allow the service to remove his SEAL status.
This marks the most recent intervention by Trump in a military case and comes despite senior Navy leadership supporting a decision to review Edward Gallagher's status as a SEAL.
"The Navy will NOT be taking away Warfighter and Navy Seal Eddie Gallagher’s Trident Pin. This case was handled very badly from the beginning. Get back to business!" Trump said in a post on Twitter.
A military jury convicted Gallagher of illegally posing with an Islamic State detainee's corpse while deployed to Iraq in 2017 but acquitted him of murder, prompting a demotion in rank and pay but not prison time.
Trump last week restored his rank and pay, and pardoned two Army officers who were separately accused of war crimes in Afghanistan.
Critics said Trump’s moves undermined military justice and sent a message that battlefield atrocities would be tolerated.
US officials and Gallagher's lawyer told Reuters on Tuesday that Navy officials were considering whether to remove him from the Navy's special operations force.
Gallagher and three other SEALs were notified on Wednesday that they must appear before a board that will decide whether they should be stripped of their SEAL status.
The Navy referred questions to the White house.


{% extends "base.html" %} {% block content%}
Merriam-Webster
- 1 : an ancient Greek jar or vase with a large oval body, narrow cylindrical neck, and two handles that rise almost to the level of the mouth
- broadly : such a jar or vase used elsewhere in the ancient world
- 2 : a 2-handled vessel shaped like an amphora


'Individual quality' - How Nottingham Forest ace has stepped up in teammate's absence
Reds legend Garry Birtles on how Joe Worrall has stepped up to the plate in recent weeks
by Sarah ClapsonIt will be great to have Michael Dawson back for Nottingham Forest, hopefully after the international break.
I can understand Sabri Lamouchi not wanting to risk him against Derby County, though.
Dawson has been missed. We all know what he brings and what he can do.
But I think Joe Worrall deserves a lot of credit for really showing what he is capable of this season.
Him and Dawson had established a really good partnership; they worked very well together and were superb earlier in the season.
But equally, I think you’ve got to give Worrall praise on his own. We’ve seen his individual quality while Michael has been out injured.
It would have been easy for him to drop off a bit without Dawson alongside him, but instead he’s really stepped up to the plate.
He’s played a big part over the last few weeks.
Worrall seems to have benefitted from that loan spell at Rangers last season, which is good to see.
I’ve always said I much prefer players to go out and get game time on loan if they need to. It’s better than being sat on your backside.

Going on loan can really work in your favour, as it seems to have done with Worrall.
Chema and Tobias Figueiredo have done well alongside him, but it will still be good to have Dawson back.
Even while he’s not been playing, Dawson will still have been a big influence off the pitch, though.
He’ll still have been making his voice heard, I’m sure. He’ll have made sure he’s still part of what’s going on.
I’m sure Lamouchi realises how he can play a part like that. The players respect Dawson; they respect his attitude and the way he goes about things.
 The more fit players you have in the squad, the better.
Garry Birtles was this week talking to Sarah Clapson.
Nottingham Forest latest
This is your round up of all things Forest; the one-stop shop that will keep you updated on the latest goings on at the City Ground and beyond.
Transfers, injuries, match-days and managers, we’ve got you covered.
We’ll be bringing the very latest on the Reds throughout the week and around the clock.
Make sure you keep yourself updated with our handy daily catch up...
Must reads...
- Lewis Grabban's message for Reds fans
- Forest linked with January move for Spurs winger
- Reds defender offers encouraging injury update
- Forest's priorities in January transfer window
For all your latest NFFC news, opinion, analysis and transfer gossip, click here
You can follow our Reds reporter Sarah Clapson on Twitter, and her email address is<EMAIL_ADDRESS>Sign up for our free Forest WhatsApp service for latest news
Keep up to date with the latest Nottingham Forest news, features and exclusives from Nottinghamshire Live via our free WhatsApp service.
Text NEWS to<PHONE_NUMBER>2 and then add the number to your phone contacts book as ForestLive to receive daily updates and breaking news from our Reds reporter Sarah Clapson.
Your phone number won't be shared with any other members of the group. Click here for more information on the service.


Angular-Bootstrap provides an intuitive way for you to embed icons in your applications.


{% extends "mumblr/themes/mytheme/base.html" %} {% block title %}Colin Howe{% endblock %} {% block content %}
This is a list of things that I think are worth having a play with!
Hi, I'm Colin.
I like coding and learning things. I like to share what I've learnt with everyone else.
I'm VP of engineering at Conversocial
This app for Django will sample a set percentage of SQL queries and collate them together. This allows you to see what queries are slowing down your site the most.
Ever wanted to get a MySQL dump of a single customers account? This little Python tool will do just that!
Visualises what is going on in Eventlet and can be useful in finding problems. Blog post with screenshot
A profiler that is aware of Eventlet.
A resurrection of an old project I wrote for Scala. Gleam is a view layer language that compiles down to Python and Javascript - freeing you from having to double code interfaces.
I submit patches to MongoEngine on a fairly frequent basis. Of note:


14 June 2005
As of 8th June, 2005, the cumulative total is now 405 cases with 48 deaths (CFR=11.9 %). 314 cases discharged from hospital.
Control measures are underway including contact tracing, chemoprophylaxis of household contacts, and immunization of high risk groups. Serogroup A has been confirmed by the National Institute of Communicable Diseases (NICD).
Public education, surveillance, vaccination of high risk population and chemoprophylaxis for close contacts within 48 hours of case detection continues. Adjacent districts and states have been alerted on the need to be vigilant for any suspected case and to take appropriate public health actions.
WHO is working closely with the national authorities and providing technical support to the health authorities in the form of guidelines and tools on meningococcal disease. WHO is providing inputs to the technical working group to assist with surveillance, early detection, laboratory, case management, prevention and control. WHO is assisting with the epidemiological analysis and in improving preparedness and response.


Music Vines
Sign Out
Listen To Your Sounds
Recommended Sounds
Upload Page
Friend Information
Search By Tag
%s


Hello, my name is Timothy Hyatt and I'm attending the Web Development Course on July 10th. I was born in Albuquerque, New Mexico and I've lived in the bay area for most of my life. I used to work as a baker at french bakery for over a year while I went to community college but I decided to quit both of those things to pursue web development. My closest friend lives in Michigan and I recently went on a roadtrip where I stopped in Michigan and we both went to the Anime Expo convention in LA. Making that drive in 5 days is honestly one of my biggest accomplishments.


Clues: A. Made easier meal before I spoke (11) B. Badly marked Sheeran as a second-rate celeb? (9) C. Ease into North Venice, once changes have been made (11) D. Syd's return to West End piano-playing is terrible! (9) E. Peers exit with skill (9) F. Very important for amusing mother to have leant out (11) G. Current producer overturns part of rota renegotiation (9) H. Search out a favourite place (5) I. UK financial arrangement put before Asimov (5) J. Sweet Jemima Young starts taking in English students (5) K. Massage naked characters (5) L. Endlessly allege order may be kosher! (5) M. A manic nun flees from the city! (9) N. Even embedded force may be ordered to desert! (5) O. Do we become outstanding!? (4) P. Difficult wordplay is hard in Gateshead (9) Q. Important spoken part of On The Waterfront (4) R. Terrible virus came into ecstatic genre (4 5) S. Bob Blair is hard! (5) T. Belief in X-film? (5) U. Odder guns may become British favourites (9) V. After six, in Paris, you may be ringing round and getting supplies (11) W. Disciplinarians wish to run around Peterhead (5) X. Beam and kiss fish (1-3) Y. Stay round about Egyptian capital to find cause of rising (5) Z. Life for last character to adulterate gin! (4)


The previous bonus part introduced Event Engine Flavours, especially the FunctionalFlavour. Biggest change was the replacement of generic Event Engine messages with dedicated message types.
Event Engine emphasizes the usage of a functional core. That's true for the PrototypingFlavour and unfolds completely with the FunctionalFlavour. A functional core has huge advantages compared to its object-oriented counterpart. At least compared to the way we tend to work with objects in our projects the last twenty years or so.
Dr. Alan Kay (who has coined the term) had quite a different idea of object-oriented programming back in 1967.
I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages
Let that sink in - only able to communicate with messages.
If you look at what we've built so far, you might recognize that we are very close to that statement. Resolver, Event Listener, Process Manager and Projector all are invoked with messages. They don't interact with each other directly. Event Engine takes over coordination. It's like the network Alan Kay is talking about. But what about aggregate functions? The functions are stateless and don't have side effects. They are pure. Immutable data types and messages (commands or events) are passed to them. With coordination performed by Event Engine pure functions work great.
We are not used to work with pure functions in PHP. It's not a functional programming language, right? Autoloading functions doesn't work so we are either forced to require all files manually or use the workaround shown in the tutorial to turn pure functions into static methods of otherwise useless classes.
Personally, I don't have a big problem with the latter approach. I see those classes as the last part of the namespace or even similar to an ES6 module (if you're familiar with JavaScript). The module (PHP class) can export functions (public static functions) and use internal functions (private static functions). But I have to admit that it is a workaround.
What can we do if the workaround is not acceptable for a project or personal taste? Exactly, we can pick another Flavour :D
The OopFlavour in a nutshell:
Aggregate functions (command handling and apply functions) are combined with state into one object. Each aggregate manages its own state internally. Commands trigger state changes. A state change is first recorded as an event and then applied by the aggregate.
You know what this means, right?
I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages
As I said, we're very close to that statement. That's the reason why the OopFlavour uses the FunctionalFlavour internally. It works on top of it only to combine aggregate functions and state. More on that in a minute. First we need a solid foundation for event sourced objects.
Similar to the Functional\Port
we need to implement an Oop\Port
to use the OopFlavour. Let's start again by looking at the required methods.
Create a new class EventSourcedAggregatePort
in src/System/Flavour
:
<?php
declare(strict_types=1);
namespace MyService\System\Flavour;
use EventEngine\Runtime\Oop\Port;
final class EventSourcedAggregatePort implements Port
{
/**
* @param string $aggregateType
* @param callable $aggregateFactory
* @param $customCommand
* @param array $contextServices
* @return mixed Created aggregate
*/
public function callAggregateFactory(string $aggregateType, callable $aggregateFactory, $customCommand, ...$contextServices)
{
// TODO: Implement callAggregateFactory() method.
}
/**
* @param mixed $aggregate
* @param mixed $customCommand
* @param array $contextServices
*/
public function callAggregateWithCommand($aggregate, $customCommand, ...$contextServices): void
{
// TODO: Implement callAggregateWithCommand() method.
}
/**
* @param mixed $aggregate
* @return array of custom events
*/
public function popRecordedEvents($aggregate): array
{
// TODO: Implement popRecordedEvents() method.
}
/**
* @param mixed $aggregate
* @param mixed $customEvent
*/
public function applyEvent($aggregate, $customEvent): void
{
// TODO: Implement applyEvent() method.
}
/**
* @param mixed $aggregate
* @return array
*/
public function serializeAggregate($aggregate): array
{
// TODO: Implement serializeAggregate() method.
}
/**
* @param string $aggregateType
* @param iterable $events history
* @return mixed Aggregate instance
*/
public function reconstituteAggregate(string $aggregateType, iterable $events)
{
// TODO: Implement reconstituteAggregate() method.
}
/**
* @param string $aggregateType
* @param array $state
* @param int $version
* @return mixed Aggregate instance
*/
public function reconstituteAggregateFromStateArray(string $aggregateType, array $state, int $version)
{
// TODO: Implement reconstituteAggregateFromStateArray() method.
}
}
This time we don't work top to bottom but start in the middle. popRecordedEvents
and applyEvent
are the first targets.
Same basic rules apply here as we discussed for the Functional\Port
.
Event Engine does not require a specific strategy to work with event sourced aggregates. You can implement them in any way as
long as the Oop\Port
is able to fulfill the contract. That said, the approach shown in the tutorial is just a suggestion.
We're going to use a simple and pragmatic implementation with publicly accessible methods that are actually internal methods.
You might want to hide them in your project using a decorator or PHP's Reflection API. Anyway, that would be overkill for the tutorial.
A state change is first recorded as an event and then applied by the aggregate.
Let's create an interface for the port to rely on:
src/Domain/Model/Base/AggregateRoot.php
<?php
declare(strict_types=1);
namespace MyService\Domain\Model\Base;
interface AggregateRoot
{
/**
* @return DomainEvent[]
*/
public function popRecordedEvents(): array;
public function apply(DomainEvent $event): void;
}
We don't have a DomainEvent
type yet. Add it next to the AggregateRoot
interface in the same directory.
src/Model/Base/DomainEvent.php
<?php
declare(strict_types=1);
namespace MyService\Domain\Model\Base;
interface DomainEvent
{
//Marker interface
}
With those two interfaces we can implement the first methods of the Oop\Port
:
src/System/Flavour/EventSourcedAggregatePort.php
<?php
declare(strict_types=1);
namespace MyService\System\Flavour;
use MyService\Domain\Model\Base\AggregateRoot;
use EventEngine\Runtime\Oop\Port;
final class EventSourcedAggregatePort implements Port
{
/* ... */
/**
* @param mixed $aggregate
* @return array of custom events
*/
public function popRecordedEvents($aggregate): array
{
if(!$aggregate instanceof AggregateRoot) {
throw new \RuntimeException(
sprintf("Cannot pop recorded events. Given aggregate is not an instance of %s. Got %s",
AggregateRoot::class,
(is_object($aggregate)? get_class($aggregate) : gettype($aggregate))
)
);
}
return $aggregate->popRecordedEvents();
}
/**
* @param mixed $aggregate
* @param mixed $customEvent
*/
public function applyEvent($aggregate, $customEvent): void
{
if(!$aggregate instanceof AggregateRoot) {
throw new \RuntimeException(
sprintf("Cannot apply event. Given aggregate is not an instance of %s. Got %s",
AggregateRoot::class,
(is_object($aggregate)? get_class($aggregate) : gettype($aggregate))
)
);
}
$aggregate->apply($customEvent);
}
/* ... */
}
Next two methods we are looking at are callAggregateFactory
and reconstituteAggregate
. The former starts the lifecycle of a new aggregate and the latter brings it
back into shape by passing aggregate event history (all events previously recorded by the aggregate) to the method.
Traits are a great way to reuse code snippets without inheritance. It's like copy and pasting methods from a blueprint into a class. Let's define one for common event sourcing logic that we can later use in aggregates.
src/Domain/Model/Base/EventSourced.php
<?php
declare(strict_types=1);
namespace MyService\Domain\Model\Base;
trait EventSourced
{
/**
* @var DomainEvent[]
*/
private $recordedEvents = [];
/**
* @param DomainEvent[] $domainEvents
* @return EventSourced aggregate
*/
public static function reconstituteFromHistory(DomainEvent ...$domainEvents): AggregateRoot
{
$self = new self();
foreach ($domainEvents as $domainEvent) {
$self->apply($domainEvent);
}
return $self;
}
private function __construct()
{
//Do not override this!!!!
//Use named constructors aka public static factory methods to create aggregae instances!
}
private function recordThat(DomainEvent $event): void
{
$this->recordedEvents[] = $event;
}
/**
* @return DomainEvent[]
*/
public function popRecordedEvents(): array
{
$events = $this->recordedEvents;
$this->recordedEvents = [];
return $events;
}
public function apply(DomainEvent $event): void
{
$whenMethod = $this->deriveMethodNameFromEvent($event);
if(!method_exists($this, $whenMethod)) {
throw new \RuntimeException(\sprintf(
"Unable to apply event %s. Missing method %s in class %s",
\get_class($event),
$whenMethod,
\get_class($this)
));
}
$this->{$whenMethod}($event);
}
private function deriveMethodNameFromEvent(DomainEvent $event): string
{
$nameParts = \explode('\\', \get_class($event));
return 'when' . \array_pop($nameParts);
}
}
The trait provides implementations for popRecordedEvents
and apply
defined by AggregateRoot
. But it contains some more stuff!
A convention is used that says: An aggregate should have an apply method for each domain event following the naming pattern "when<EventName>", whereby <EventName> is the class name of the event without namespace.
An aggregate should use recordThat
to record new domain events. The trait takes care of storing recorded events internally until the Oop\Port
calls popRecordedEvents()
.
While a trait cannot enforce a private empty __construct
(it could be overridden by a class), it's still included in the trait as a reminder for future developers to not
use __construct
in aggregate roots but rather use named constructors. This rule is important for Oop\Port::callAggregateFactory()
. More on that in a minute.
reconstituteFromHistory
should be called by the Oop\Port
. But the port works against our AggregateRoot
interface, so we should add such a method signature there, too.
src/Domain/Model/Base/AggregateRoot.php
<?php
declare(strict_types=1);
namespace MyService\Domain\Model\Base;
interface AggregateRoot
{
public static function reconstituteFromHistory(DomainEvent ...$domainEvents): self;
/**
* @return DomainEvent[]
*/
public function popRecordedEvents(): array;
public function apply(DomainEvent $event): void;
}
Cool, we can implement the next port method now!
src/System/Flavour/EventSourcedAggregatePort.php
<?php
declare(strict_types=1);
namespace MyService\System\Flavour;
use EventEngine\Runtime\Oop\Port;
use MyService\Domain\Api\Aggregate;
use MyService\Domain\Model\Base\AggregateRoot;
use MyService\Domain\Model\Building;
final class EventSourcedAggregatePort implements Port
{
/* ... */
/**
* @param string $aggregateType
* @param iterable $events history
* @return mixed Aggregate instance
*/
public function reconstituteAggregate(string $aggregateType, iterable $events)
{
$arClass = $this->getAggregateClassOfType($aggregateType);
/** @var AggregateRoot $arClass */
return $arClass::reconstituteFromHistory(...$events);
}
private function getAggregateClassOfType(string $aggregateType): string
{
switch ($aggregateType) {
case Aggregate::BUILDING:
return Building::class;
default:
throw new \RuntimeException("Unknown aggregate type $aggregateType");
}
}
}
The Oop\Port
contract requires another reconstitute method: reconstituteAggregateFromStateArray
. It's pretty much the same as reconstituteAggregate
but this time
the aggregate needs to be reconstituted from a state array. Event Engine needs the functionality when it loads aggregate snapshots either taken by the MultiModelStore
or the AggregateProjector
.
Another method is required in the AggregateRoot
interface:
src/Domain/Model/Base/AggregateRoot.php
<?php
declare(strict_types=1);
namespace MyService\Domain\Model\Base;
interface AggregateRoot
{
public static function reconstituteFromHistory(DomainEvent ...$domainEvents): self;
public static function reconstituteFromStateArray(array $state): self;
/**
* @return DomainEvent[]
*/
public function popRecordedEvents(): array;
public function apply(DomainEvent $event): void;
}
and the corresponding port implementation:
<?php
declare(strict_types=1);
namespace MyService\System\Flavour;
use EventEngine\Runtime\Oop\Port;
use MyService\Domain\Api\Aggregate;
use MyService\Domain\Model\Base\AggregateRoot;
use MyService\Domain\Model\Building;
final class EventSourcedAggregatePort implements Port
{
/* ... */
/**
* @param string $aggregateType
* @param iterable $events history
* @return mixed Aggregate instance
*/
public function reconstituteAggregateFromStateArray(string $aggregateType, array $state, int $version)
{
$arClass = $this->getAggregateClassOfType($aggregateType);
// Note: $version is ignored, our aggregate implementation
// relies on the version managed by Event Engine internally
/** @var AggregateRoot $arClass */
return $arClass::reconstituteFromStateArray($state);
}
private function getAggregateClassOfType(string $aggregateType): string
{
switch ($aggregateType) {
case Aggregate::BUILDING:
return Building::class;
default:
throw new \RuntimeException("Unknown aggregate type $aggregateType");
}
}
}
Obviously, this won't work. We did not touch Building
yet. Let's do that next.
Our Building
aggregate consists of a set of pure functions grouped in a class and immutable data types. Turning it into an event sourced
object is less work than you might expect:
src/Domain/Model/Building.php
<?php
declare(strict_types=1);
namespace MyService\Domain\Model;
use MyService\Domain\Model\Base\AggregateRoot;
use MyService\Domain\Model\Base\EventSourced;
use MyService\Domain\Model\Building\Command\AddBuilding;
use MyService\Domain\Model\Building\Command\CheckInUser;
use MyService\Domain\Model\Building\Command\CheckOutUser;
use MyService\Domain\Model\Building\Event\BuildingAdded;
use MyService\Domain\Model\Building\Event\DoubleCheckInDetected;
use MyService\Domain\Model\Building\Event\DoubleCheckOutDetected;
use MyService\Domain\Model\Building\Event\UserCheckedIn;
use MyService\Domain\Model\Building\Event\UserCheckedOut;
final class Building implements AggregateRoot
{
use EventSourced;
/**
* @var Building\State
*/
private $state;
public static function reconstituteFromStateArray(array $state): AggregateRoot
{
$self = new self();
$self->state = Building\State::fromArray($state);
return $self;
}
public static function add(AddBuilding $addBuilding): AggregateRoot
{
$self = new self();
$self->recordThat(BuildingAdded::fromArray($addBuilding->toArray()));
return $self;
}
public function whenBuildingAdded(BuildingAdded $buildingAdded): void
{
$this->state = Building\State::fromArray($buildingAdded->toArray());
}
public function checkInUser(CheckInUser $checkInUser): void
{
if($this->state->isUserCheckedIn($checkInUser->name())) {
$this->recordThat(DoubleCheckInDetected::fromArray($checkInUser->toArray()));
return;
}
$this->recordThat(UserCheckedIn::fromArray($checkInUser->toArray()));
}
private function whenUserCheckedIn(UserCheckedIn $userCheckedIn): void
{
$this->state = $this->state->withCheckedInUser($userCheckedIn->name());
}
private function whenDoubleCheckInDetected(DoubleCheckInDetected $event): void
{
//No state change required
}
public function checkOutUser(CheckOutUser $checkOutUser): void
{
if(!$this->state->isUserCheckedIn($checkOutUser->name())) {
$this->recordThat(DoubleCheckOutDetected::fromArray($checkOutUser->toArray()));
return;
}
$this->recordThat(UserCheckedOut::fromArray($checkOutUser->toArray()));
}
private function whenUserCheckedOut(UserCheckedOut $userCheckedOut): void
{
$this->state = $this->state->withCheckedOutUser($userCheckedOut->name());
}
private function whenDoubleCheckOutDetected(DoubleCheckOutDetected $event): void
{
//No state change required
}
}
Here are the refactoring steps:
MyService\Domain\Model\Base\DomainEvent
Building
implements AggregateRoot
Building
uses EventSourced
Building
stores Building\State
internally in a state
propertyBuilding::add()
creates an instance of itself and records BuildingAdded
instead of yielding itBuilding::reconstituteFromStateArray
sets up internal state using Building\State::fromArray()
static
, they become instance methodsvoid
Building\State
is no longer an argument, but accessed internallystatic
and make them private
, they become internal methodsvoid
Building\State
is no longer an argument, but accessed internallyBuilding::add()
is the aggregate factory for Building
. The Oop\Port
can simply call it.
src/System/Flavour/EventSourcedAggregatePort.php
<?php
declare(strict_types=1);
namespace MyService\System\Flavour;
use MyService\Domain\Model\Base\AggregateRoot;
use EventEngine\Runtime\Oop\Port;
final class EventSourcedAggregatePort implements Port
{
/**
* @param string $aggregateType
* @param callable $aggregateFactory
* @param $customCommand
* @param array $contextServices
* @return mixed Created aggregate
*/
public function callAggregateFactory(string $aggregateType, callable $aggregateFactory, $customCommand, ...$contextServices)
{
return $aggregateFactory($customCommand, ...$contextServices);
}
/* ... */
}
The callable $aggregateFactory
passed to the port, is still the one we've defined in the Event Engine Description:
src/Domain/Api/Aggregate.php
<?php
declare(strict_types=1);
namespace MyService\Domain\Api;
use MyService\Domain\Model\Building;
use EventEngine\EventEngine;
use EventEngine\EventEngineDescription;
class Aggregate implements EventEngineDescription
{
const BUILDING = 'Building';
/**
* @param EventEngine $eventEngine
*/
public static function describe(EventEngine $eventEngine): void
{
$eventEngine->process(Command::ADD_BUILDING)
->withNew(self::BUILDING)
->identifiedBy(Payload::BUILDING_ID)
->handle([Building::class, 'add']) //<-- Aggregate Factory
->recordThat(Event::BUILDING_ADDED)
->apply([Building::class, 'whenBuildingAdded']);
/* ... */
}
}
$contextServices
is not an argument of Building::add()
but PHP does not care. We can use that to our advantage.
The port does not need to know if an aggregate factory or command handling function is interested in a context or requires dependencies.
It just passes it always to the function. If $contextServices
is empty and the function doesn't care, everything is fine.
Oop\Port::callAggregateWithCommand()
is next on the list. Let's see ...
/**
* @param mixed $aggregate
* @param mixed $customCommand
* @param array $contextServices
*/
public function callAggregateWithCommand($aggregate, $customCommand, ...$contextServices): void
{
// TODO: Implement callAggregateWithCommand() method.
}
We get the $aggregate
instance, a $customCommand
and optionally a list of $contextServices
. We could use a switch (command) -> call $aggregate->method
approach,
but we are lazy. We don't want to touch the port each time we add a new command to the system. Conventions work great to get around the issue.
An aggregate root should have a method named like the command, whereby command name is derived from its class name without namespace. The first letter of the name is lowercase.
Looking at Building
methods, it's exactly what we already have in place ;) We just need to implement the convention in the port.
src/Infrastructure/Flavour/EventSourcedAggregatePort.php
<?php
declare(strict_types=1);
namespace MyService\System\Flavour;
use MyService\Domain\Model\Base\AggregateRoot;
use EventEngine\Runtime\Oop\Port;
final class EventSourcedAggregatePort implements Port
{
/* ... */
/**
* @param mixed $aggregate
* @param mixed $customCommand
* @param array $contextServices
*/
public function callAggregateWithCommand($aggregate, $customCommand, ...$contextServices): void
{
$commandNameParts = \explode('\\', \get_class($customCommand));
$handlingMethod = \lcfirst(\array_pop($commandNameParts));
$aggregate->{$handlingMethod}($customCommand, ...$contextServices);
}
/* ... */
}
Low hanging fruits, right? But the Event Engine Aggregate Description is broken! Handle and apply functions are no longer callable (except aggregate factory),
because they are instance methods now. To get around the issue, we can replace the definition with a FlavourHint
.
src/Domain/Api/Aggregate.php
<?php
declare(strict_types=1);
namespace MyService\Domain\Api;
use EventEngine\Runtime\Oop\FlavourHint;
use MyService\Domain\Model\Building;
use EventEngine\EventEngine;
use EventEngine\EventEngineDescription;
use MyService\Domain\Resolver\BuildingResolver;
class Aggregate implements EventEngineDescription
{
const BUILDING = 'Building';
/**
* @param EventEngine $eventEngine
*/
public static function describe(EventEngine $eventEngine): void
{
$eventEngine->process(Command::ADD_BUILDING)
->withNew(self::BUILDING)
->identifiedBy(Payload::BUILDING_ID)
->handle([Building::class, 'add'])
->recordThat(Event::BUILDING_ADDED)
->apply([FlavourHint::class, 'useAggregate'])
->storeStateIn(BuildingResolver::COLLECTION);
$eventEngine->process(Command::CHECK_IN_USER)
->withExisting(self::BUILDING)
->handle([FlavourHint::class, 'useAggregate'])
->recordThat(Event::USER_CHECKED_IN)
->apply([FlavourHint::class, 'useAggregate'])
->orRecordThat(Event::DOUBLE_CHECK_IN_DETECTED)
->apply([FlavourHint::class, 'useAggregate']);
$eventEngine->process(Command::CHECK_OUT_USER)
->withExisting(self::BUILDING)
->handle([FlavourHint::class, 'useAggregate'])
->recordThat(Event::USER_CHECKED_OUT)
->apply([FlavourHint::class, 'useAggregate'])
->orRecordThat(Event::DOUBLE_CHECK_OUT_DETECTED)
->apply([FlavourHint::class, 'useAggregate']);
}
}
That's a bit of a drawback of the OopFlavour. It relies less on Event Engine, but Event Engine still wants to make
sure that you don't forget to handle a command or apply an event (handle and apply definition is mandatory). With the
FlavourHint
we basically tell Event Engine: "Don't worry, we know what we're doing!". It's a small extra step, but trust
me, it still saves you time. Forgetting to add a route for a message to some config or have a typo somewhere is one of the
most silly bugs that can cost you hours for nothing!
One method left in the port: serializeAggregate()
.
A simple toArray()
on the aggregate is sufficient. We add it to the AggregateRoot
interface to enforce its implementation.
src/Model/Base/AggregateRoot.php
<?php
declare(strict_types=1);
namespace MyService\Domain\Model\Base;
interface AggregateRoot
{
/**
* @return DomainEvent[]
*/
public function popRecordedEvents(): array;
public function apply(DomainEvent $event): void;
public function toArray(): array;
}
Building
can call the toArray
method of Building\State
...
src/Domain/Model/Building.php
<?php
declare(strict_types=1);
namespace MyService\Domain\Model;
use MyService\Domain\Model\Base\AggregateRoot;
use MyService\Domain\Model\Base\EventSourced;
use MyService\Domain\Model\Building\Command\AddBuilding;
use MyService\Domain\Model\Building\Command\CheckInUser;
use MyService\Domain\Model\Building\Command\CheckOutUser;
use MyService\Domain\Model\Building\Event\BuildingAdded;
use MyService\Domain\Model\Building\Event\DoubleCheckInDetected;
use MyService\Domain\Model\Building\Event\DoubleCheckOutDetected;
use MyService\Domain\Model\Building\Event\UserCheckedIn;
use MyService\Domain\Model\Building\Event\UserCheckedOut;
final class Building implements AggregateRoot
{
use EventSourced;
/**
* @var Building\State
*/
private $state;
/* ... */
public function toArray(): array
{
return $this->state->toArray();
}
}
... and the Oop\Port
does the same:
src/System/Flavour/EventSourcedAggregatePort.php
<?php
declare(strict_types=1);
namespace MyService\System\Flavour;
use MyService\Domain\Model\Base\AggregateRoot;
use EventEngine\Runtime\Oop\Port;
final class EventSourcedAggregatePort implements Port
{
/* ... */
/**
* @param mixed $aggregate
* @return array
*/
public function serializeAggregate($aggregate): array
{
if(!$aggregate instanceof AggregateRoot) {
throw new \RuntimeException(
sprintf("Cannot serialize aggregate. Given aggregate is not an instance of %s. Got %s",
AggregateRoot::class,
(is_object($aggregate)? get_class($aggregate) : gettype($aggregate))
)
);
}
return $aggregate->toArray();
}
/* ... */
}
Of course, you can use a totally different serialization strategy. Organising aggregate state in a single immutable state object is also only a suggestion. Do whatever you like. It's your choice!
As a last step (before looking at the tests 🙈) we should activate the OopFlavour in src/System/SystemServices.php
:
src/Service/ServiceFactory.php
<?php
declare(strict_types=1);
namespace MyService\System;
use EventEngine\Data\ImmutableRecordDataConverter;
use EventEngine\Logger\LogEngine;
use EventEngine\Logger\SimpleMessageEngine;
use EventEngine\Messaging\MessageBag;
use EventEngine\Prooph\V7\EventStore\GenericProophEvent;
use EventEngine\Runtime\Flavour;
use EventEngine\Runtime\FunctionalFlavour;
use EventEngine\Runtime\OopFlavour;
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
use MyService\Domain\Api\Event;
use MyService\System\Api\EventEngineConfig;
use MyService\System\Api\SystemQuery;
use MyService\System\Api\SystemType;
use MyService\System\Flavour\EventSourcedAggregatePort;
use MyService\System\Flavour\MyServiceMessagePort;
use Prooph\Common\Messaging\NoOpMessageConverter;
use Prooph\ServiceBus\Message\HumusAmqp\AmqpMessageProducer;
use Psr\Log\LoggerInterface;
trait SystemServices
{
/* ... */
//Flavour
public function flavour(): Flavour
{
return $this->makeSingleton(Flavour::class, function () {
return new OopFlavour(
new EventSourcedAggregatePort(),
new FunctionalFlavour(new MyServiceMessagePort(), new ImmutableRecordDataConverter())
);
});
}
/* ... */
}
As stated at the beginning, the OopFlavour uses the FunctionalFlavour mainly to make use of custom message handling.
At least the BuildingTest
should fail after latest changes. Let's see if we need to work some extra hours or can go out for a beer with a friend:
docker-compose run php php vendor/bin/phpunit
As expected, BuildingTest
is broken, but should be easy to fix:
<?php
declare(strict_types=1);
namespace MyServiceTest\Domain\Model;
use MyService\Domain\Api\Command;
use MyService\Domain\Api\Event;
use MyService\Domain\Api\Payload;
use MyServiceTest\UnitTestCase;
use Ramsey\Uuid\Uuid;
use MyService\Domain\Model\Building;
final class BuildingTest extends UnitTestCase
{
private $buildingId;
private $buildingName;
private $username;
protected function setUp(): void
{
$this->buildingId = Uuid::uuid4()->toString();
$this->buildingName = 'Acme Headquarters';
$this->username = 'John';
parent::setUp();
}
/**
* @test
*/
public function it_checks_in_a_user()
{
//Prepare expected aggregate state
$state = Building\State::fromArray([
Building\State::BUILDING_ID => $this->buildingId,
Building\State::NAME => $this->buildingName
]);
/** @var Building $building */
$building = Building::reconstituteFromStateArray($state->toArray());
//Use test helper UnitTestCase::makeCommand() to construct command
$command = Building\Command\CheckInUser::fromArray([
Building\State::BUILDING_ID => $this->buildingId,
Building\State::NAME => $this->username,
]);
$building->checkInUser($command);
$events = $building->popRecordedEvents();
//Another test helper to assert that list of recorded events contains given event
$this->assertRecordedEvent(Event::USER_CHECKED_IN, [
Payload::BUILDING_ID => $this->buildingId,
Payload::NAME => $this->username
], $events);
}
}
We can use methods from AggregateRoot
to set up our Building
with state, invoke the command handling method and use
popRecordedEvents()
to access newly recorded events. That's it!
At this point the tutorial ends. Thank you for taking the tour through the world of CQRS and Event Sourcing with Event Engine. We started our tour with a rapid development approach. Event Engine really shines here. The skeleton application is preconfigured including some best practices like splitting Event Engine Descriptions by functionality. We learned how to react on domain events and how to project them into a read model, that we can access using queries and resolvers. All that with a minimum of boilerplate. Finally, Event Engine Flavours gave us a way to write more explicit code and harden the domain model. Every team can find its own style by mixing Flavours, conventions and serialization techniques.
What's next?
You can start to work on your own project. Event Engine docs cover advanced topics and a lot more details, but get some practice first and revisit them every now and then.


Want to try out unikname.network?
Enter your Unikname Sandbox Crypto Account address in the field above.
You will receive some SUNIK tokens.
Understanding unikname.network
Note: you can request SUNIK tokens from this faucet once per week.
Total gifted SUNIK tokens: {{ giftedTokensTotal }} SUNIK.
SUNIK tokens left in faucet's Crypto Account: {{ remainingTokens }} SUNIK.


 Stoma bags A catheter Something else You manage without help, but with difficulty How often do you have trouble controlling your bladder or bowels? All the time At least once a week At least once a month Less than once a month Explain more about the difficulty you have controlling your bladder or bowels. {% include "../includes/help.html" %} {% endblock %}
or


This step tells Let's Encrypt that you're serving
the correct data for this challenge on your server.
When Let's Encrypt receives this submission, they
will make a request to your server to verify you are
serving the data correctly.
How to generate this signature:
-
Copy and paste the command below into your terminal (if your
account private key isn't at "./account.key", change "./account.key"
in the command to wherever it exists).
-
Copy and paste the hex encoded signature output from the command
into the text field below that command.


Street Fighter V: Champion Edition arrives on February 14
by Mike MinottiCapcom has announced Street Fighter V: Champion Edition, which will come out on February 14 for PlayStation 4 and PC.
The Champion Edition of Street Fighter V will include most of the DLC Capcom has released for the fighter, excluding fighting Chance costumes, brand collaboration costumes, and Capcom Pro Tour DLC. This version will include 40 characters, 34 stages, and over 200 costumes.
Champion Edition will also add Gill as a new character for the game. Gill was originally the boss of Street Fighter III. Gill will also be available to those who own the normal version of Street Fighter V starting in December.
The original version of Street Fighter V released in 2016. It has sold over 3.7 million copies.


energy women firewood access use rural climate wood sources research electricity Botswana sustainable {border-style services px;} #ffffff;} Energy poverty change respondents natural people villages areas development household local poor used activities economic social (%) cooking especially group making resources Access article change. clean collab: collection issues majority reduce stoves women’s However, affected collect heating households impact traditional New Tswapong United affordable areas. focus interviews leading need products px; species trees using {font-family (p.  :). Nations World York. area assisted buy challenge connection consumption contribute data depend double; energy. including knowledge long low main mainly national new particularly population power regarding solar study time viewed Data Firewood International Research Women affecting analysis border-color border-width bread challenges children communities depletion distant education environmental experiences faced firewood, gender helped income increase interaction land means method obtained policies poverty. produce production resilience resources. risks solid; strategies understanding {font-style {font-weight Action Botswana. Burns Collecting Government Ketlhoilwe Omari Serowe-Palapye Social Table UNFPA adverse aim background basic billion biomass bold build bush carried change: commercial constructivist cooking, courier; degradation dependent distances domestic em; emerged families field fuel fuels high important improving inadequate insights involved is, lamps learning marula members observation open preparation preparing process promote pt;} qualitative rainfall reality result sites socially spend spent systems transport wood,


March 7, 2014 | 07:20
Waartaa applies GSoC 2014
We are elated to inform you that Waartaa has been accepted as a project idea for GSoC under Fedora’s umbrella.
For those who are new to Waartaa, Waartaa is an open-source communication tool for teams and groups. It is built on top of IRC. Currently, Waartaa is an IRC client as a service and it supports centralized logging, 24x7 idling, notifications and unique identity to a user on IRC. The source code is available at https://github.
Read more


--- layout: default title: Commercial Landscape Maintenance description: "Terracare Associates provides innovative commercial landscape maintenance services tailored to the individual needs of each client." parent: Commercial Services sidebar: Commerical Landscape Contractor class: landscape banner: denver_broncos.jpg banner-heading: "Denver Broncos Facility - Englewood, Colorado" banner-sub-heading: "" banner-cta: "" relevant_links: - link: "/landscape/water%20management/2014/03/20/outdoor-pests-2.html" title: "Outdoor Pests 2" - link: "/team%20members/landscape/2014/05/02/ty-wilson.html" title: "Terracare Associates Ty Wilson receives landscape certification highest status" - link: "/employees/2014/07/22/effective-teams.html" title: "Effective Teams - 3 ways to grow a team" - link: "/water%20management/responsibility/landscape/team%20members/2014/06/10/water-management-2.html" title: "“Smart” Irrigation Controllers - What Property Managers need to know" ---
Our mission is to ensure your landscape reaches its maximum potential. The true benefit to you: increased property value and a safe and healthy environment that promotes and attracts a vibrant business community and neighborhoods. Our experienced staff of highly trained professionals will personally assist you in meeting your landscape goals and outdoor maintenance needs.
We bring you the breadth of resources that a large landscape company has to offer with a very personalized approach. Our team members are dedicated to your property.


[page:Object3D] → [page:Light] →
[name]
A light source positioned directly above the scene.
Example
[example:webgl_lights_hemisphere lights / hemisphere ]
[example:misc_controls_pointerlock controls / pointerlock ]
[example:webgl_decals decals ]
[example:webgl_loader_collada_kinematics loader / collada / kinematics ]
[example:webgl_materials_lightmap materials / lightmap ]
[example:webgl_shaders_ocean shaders / ocean ]
var light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );
scene.add( light );
Constructor
[name]( [page:Integer skyColor], [page:Integer groundColor], [page:Float intensity] )
[page:Integer skyColor] — Numeric value of the RGB sky color.
[page:Integer groundColor] — Numeric value of the RGB ground color.
[page:Float intensity] — Numeric value of the light's strength/intensity.
Properties
See the base [page:Light Light] class for common properties.
[property:Float groundColor]
Light's ground color.
Methods
See the base [page:Light Light] class for common methods.
[method:HemisphereLight copy]( [page:HemisphereLight source] )
Copies value of *source* to this HemisphereLight object.
Source
[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]


Minister demands explanation for national teams’ poor outing - The Nation Newspaper
The Minister of Youth and Sports Development Sunday Dare yesterday met the Nigerian Football Federation (NFF) to demand a written explanation as to the exit of Nigerian teams from football tournaments.
In a meeting that lasted less than 30 minutes, the minister directed that NFF should “provide the federal government with written explanation on why Nigerian teams exited four major tournaments in quick succession.
“From stocktaking, it is now time to render account to Nigerians,” he said even as he warned that “We need to take very difficult decisions.”
Read ALSO: NFF won’t impose NPFL players on Rohr, says Pinnick
The NFF secretariat particularly came under scrutiny for the technical failings of the board.
“We need to run a reality check. Nigerians are not happy with our state of football. We must start with the football administration. Nigerians want to see us working proactively to get things working again.”
The Minister also demanded for the nominal roll of the NFF as it was revealed that the federation has continued to pay some people whose contract has expired. He said the Ministry’s is also concerned about the domestic league.
NFF Chairman, Amaju Pinnick lamented that federation was faced with a toxic situation that affected it.