#inject
The enumerable module has been blowing my mind as a toolkit for creating meaningful code. In simpler times (one week ago) a method could only achieve a goal in a few clunky ways, and my pairing experiences resulted in like-minded approaches to tackling challenges.
This week peels back the curtain a bit on the potential for creativity in Ruby. Pairing is suddenly much more fun, because everyone I collaborated with had different ideas on what methods to use, or even how to structure the entire solution. Methods for iterating through arrays and hashes have been a large part of the focus for the week, but the enumerable module in particular is becoming the engine for how I perceive possible avenues of problem solving.
 Even when I was reasonably proud of my solution, someone else's would pop up and freak me out how terse they could make their code. Usually these occasions involved a combination of #inject and a regular expression - so it may as well have been just binary code - and was too much to untangle at that stage.
Fortunately, #inject is much simpler to understand in its basic form. Let's start with the easiest way to use it - we have an array of integers and we want to add them together. Usually I would create a new variable to store the sum values and iterate through the array incrementing sum, like this:
array = [1, 2, 3, 4]
sum = 0
array.each { |num| sum += num }
sum
=> 10
Not bad. Here's how #inject handles it:
array = [1, 2, 3, 4]
array.inject { |memo, element| memo + element }
=> 10
We didn't even bother with the placeholder variable. It's built in to #inject - that was the memo
argument in the block. Let's break that down:
- #inject is called by an object, in this case an array
- Two arguments are supplied in the block, the first is a placeholder, or accumulator value (Ruby docs call it a "memo"), the second is the element currently being indexed
- The block is processed once for each value, with the memo value being the result of evaluating the previous loop
- The block returns the value of the memo after completing
So in our adding method we started at array[0], which was 1
, moved to the array[1], and added the value of memo
(which is 1) to the next element, which is then stored in memo
for the next element to process. When we get to the end, we don't even have to return a sum variable because #inject has already implicitly done it.
So why didn't memo
do anything on the first loop through that block? There was no previous value stored because the loop hadn't run yet. It defaults to storing the first value then using it starting on the second pass. But want if you want it to have a value? Turns out #inject accepts an optional argument before it runs a code block:
(3..6).inject(2) { |memo, num| memo * num }
=> 720
So here the code block was supplied with a starting value for memo
, so starting with the first loop, it applied 2
. Instead of multiplying 3 * 4 * 5 * 6 it started with memo * num
being 2 * 3. After the first loop runs, memo
is now 6 instead of just 3. I want to point out 2 things: first, that this time we called #inject on a range instead of an array (totally fine), and second, the code block isn't running memo *= num
, it's memo * num
. That's because you don't need to explicitly reassign a value to the placeholder - it's built in to the function.
I want to end with a method I wrote for a challenge last week that takes an array of strings and returns the shortest string:
def shortest_string(list_of_words)
shortest = list_of_words[0]
list_of_words.each do |word|
if word.length < shortest.length
shortest = word
end
shortest
end
What does #inject have to say about that?
def shortest_string(list_of_words)
list_of_words.inject { |shortest, word| word.length < shortest.length ? word : shortest }
end
When I figured this out I was like
as opposed to when I learned that #collect was exactly the same as #map and I was like


Lotus Top Gun Singapore, 11 -15 May, 2009
Want to get up to speed on the whole Lotus Software Portfolio? Attend a Lotus TopGun (sorry IBM business partners only).
This intense, fast-paced class provides the very latest training on Lotus products and solutions, as well as direct access to some of the best sales leaders and offering managers in Lotus! We'll discuss solutions you can sell with Connections, Quickr, Sametime, Portal and Accelerators; the very latest information on Notes/Domino 8 solutions, as well as the latest news about Lotus Foundations, Lotus Protector, LotusLive, and more! Students will spend 4-1/2 days focusing intently on how to beat the competition, while acquiring the skills and knowledge to do it. Sign up now, seats are limited!
This intense, fast-paced class provides the very latest training on Lotus products and solutions, as well as direct access to some of the best sales leaders and offering managers in Lotus! We'll discuss solutions you can sell with Connections, Quickr, Sametime, Portal and Accelerators; the very latest information on Notes/Domino 8 solutions, as well as the latest news about Lotus Foundations, Lotus Protector, LotusLive, and more! Students will spend 4-1/2 days focusing intently on how to beat the competition, while acquiring the skills and knowledge to do it. Sign up now, seats are limited!
- Audience: IBMer, IBM Business Partners and anyone selling or recommending Lotus solutions.
- When: 11-15 May, 2009
- Where: Singapore (Venue To Be Announced)
- Cost: There is no tuition charge for the class. (NOTE: Your company or department is responsible for the cost of any meals, lodging, and transportation expenses, as applicable)
- Prerequisites:
- Have a basic knowledge of the Lotus product family, which can be obtained by attending Software Top Gun and a Lotus TOP GUN Virtual Learning class; on-the-job experience; or by reviewing the Lotus Strategy Notebook and the portal portion of the Websphere Strategy Notebook, which are online here.
- If applicable to your role, bring an active Lotus opportunity to class that you will work on with a team
- Have a basic knowledge of the Lotus product family, which can be obtained by attending Software Top Gun and a Lotus TOP GUN Virtual Learning class; on-the-job experience; or by reviewing the Lotus Strategy Notebook and the portal portion of the Websphere Strategy Notebook, which are online here.
Posted by Stephan H Wissel on 07 April 2009 | Comments (1) | categories: IBM - Lotus


the and with for drug were was The viral cell SARS-CoV- compounds assay cells {background that VeroE bexarotene []. load margin reduction {border-style COVID- anti-SARS-CoV- from px;} treatment #ffffff;} virus clinical performed screening culture which abiraterone compound coronavirus viability activity four study used (Fig. CPE Hong antiviral infection novel system Î¼M FDA-approved RNA are data each previously replication selected two-tier Fig. [,]. against ahead concentrations exhibited hpi infected patients print] respiratory then Â°C ELISA Kong cetilistat, described diiodohydroxyquinoline, effective followed identified library shown these this Î¼l Infect. acetate, different inhibition number other plates potential px; results severe showed supernatant syndrome vitro {font-family Cetilistat acetate acute after also but disease expression font-size hpi, human incubated inhibitor protein receptor signal standard using >. < -well Bexarotene Briefly, MOI SARS-CoV--N SARS-CoV--infected Viral [], addition and/or assay, concentration determined double; drugs established had has hydroxychloroquine, not potent screen Î¼M, Abiraterone Coronavirus Elsevier MERS-CoV Research These all another antibody approved before border-color border-width chloroquine, demonstrated effects emerging evaluation experiments further have including indicates its logs medium plaque primary solid; than their time treated without {font-style {font-weight (A) (B) (C) (EC) (MOI (PubChem (âˆ¼ All CID: Caco Cell CellTiterGloÂ® Diiodohydroxyquinoline Disease Drug Limited, Med. RT-PCR Res. Table This USA) [Epub [[], []]. about activities analogue any assay. authors being bexarotene, bold broad-spectrum cancer centre clinically collection, compounds, compounds. control. courier; cycle cytotoxicity detection dose-dependent dosing em; entry higher identify implications included inhibited levels lipase luminescent maximal modifications most normalized oral peak pt;} qRT-PCR resource robust seeded serum such therefore Î¼L/well


| Website | |
|---|---|
| Profile Name | Stephen Pelot |
| Github | stephenpelot |
| Personal Web Project | https://stephenpelot.github.io/ |
I'm more inclined towards logic than creativity. Inspiration comes only when it wants, but perspiration is always within our grasp. I've always liked things that can be quantified, more so than that whose value is subjective. It is important to remember, though, that both sides are necessary to make the best technology.
For my first week, it's been as enjoyable of schooling as I imagine it can be. The source material holds such splendid interest for me, and that alone makes this the best class I've ever attended. Throw in classmates of such fine temperaments, and another Kenyan, and things could not be better. I'm getting pretty decent with html files, though I've the feeling that CSS will be my downfall. Javascript seems rather fascinating, so I'll have to look into that when I have the time. But that just about wraps up this week's reflection.
Bootstrap seems to make sense to me on a fundamental level, but it's implementation I still have trouble with. CSS I believe I understand. The capstone that we've done so far I understand. Personas and interaction flow I understand. The board game helped me understand a bit more of my team, and the way they will approach challenges and tasks during our time at the bootcamp.
This week was informative. I've learned quite a bit from doing the capstone project, and it's been interesting working on the same code with others. Admittedly, I'm still not sure what we want our capstone to look like when all is said and done, but I reckon most projects look nothing like their initial concept. As long as we stay careful about overwriting each other's code, I think we'll be ok.
I like animals. I think that though I understand a solid amount of programming, a job is about far more than mere technical knowledge. I need to make sure I can collaborate with others, and fit in to whatever the way the company works.
RS21 is an interesting company, at least to me. I saw them initially at the Demo Day just before our class began. They had given a demonstration on disaster preparedness, which seemed both interesting, and useful. They had brought three employees, and each one of them seemed to enjoy their jobs. I decided to go with Brandon Pachuca as my contact. His number is<PHONE_NUMBER>. I'll try and arrange a visit with them next week.
Tusk focuses on conservation, of protecting and preserving our world.  I'm not yet sure who to contact, but conservation efforts always seem to have a place for good software people, so I'm not terribly worried. Perhaps I'll give them a call sometime next week.
Howdy. I'm Stephen. I do front end with a focus on website construction using php, bootstrap, and CSS. I specialize in making sites that people love to visit. How do you feel about your current site? Pump Up Music


The converters which convert various java objects into other java objects (e.g. string => int, array => string, etc.)


Ader
TemplateEngine is a .NET class library (written in C#) for generating text output from source template and input parameters.
It can be used in many scenarios: website page building, email generation, xml generation, source code generation, etc.
It's idea is based on antlr stringTemplate (http://www.stringtemplate.org/), but the syntax is based on cold fusion language.
Currently only .NET AderTemplateEngine works with .NET 2.0 only, but I have plans on making it work with .NET 1.0/1.1 and maybe Java.
This document is for version 2.1 of the engine. You can see version 1
here.
Ader TemplateEngine is released under GNU General Public License.
Here is a very simple template:
Thank You for your order #order.billFirstName# #order.billLastName#.

Your Order Total is: #format(order.total, "C")#

<ad:if test="#order.shipcountry isnot "US"#">
Your order will arrive in 2-3 weeks
<ad:else>
Your order will arrive in 5-7 days
</ad:if>
The templates can have expressions, if/elseif/else statement, foreach statement, for statement, set statement and other templates.
Templates API:
There are 2 classes mainly used in Template Engine: Template and TemplateManager.
Template holds a single instance of a template and TemplateManager is used for executing templates.
Easiest way of creating Templates is by using static methods of Template or TemplateManager:
Template template = Template.FromString(string name, string data)
Template template = Template.FromFile(string name, string filename)
then you use it to instantilate TemplateManager.
TemplateManager mngr = new TemplateManager(template);
or even easier:
TemplateManager mngr = TemplateManager.FromFile(filename);
TemplateManager mngr = TemplateManager.FromString(template);
when using FromString method, the string passed contains template code. This method can be used
to dynamically generate text without having templates in files.
You use SetValue(string name, object value); to add values that can be used within the templates.
Ex:
mngr.SetValue("customer", new Customer("Tom", "Jackson"));
then you can refer to customer within the template. You can use any type of object for value.
When the value of variable is to be output ToString() method will be called.
- Expressions
Expressions are enclosed with # (hash or pound) characters:
ex.
#firstName#
This example will output value of first name. If you need to output # character, just escape it with another #.
ex.
Your SS## is #ssnumber#
Inside of expression block you can output any variable:
#somevar#
access property or field of a variable:
#somestring.Length#
property name is not case senstivie. So you can call: #string.length# or #string.LENGTH#
or call a function:
#trim(somename)#
You can nest property accesses:
#customer.firstname.length#
You can also call methods on any objects:
#firstname.substring(0, 5)#
or
#customer.isValid()#
Version 2.1 also allows you to use array access from indexed variables:
#somearray[3]# - gets 3rd element of array
#hastable["somekey"]# - gets value of "somekey" from hashtable.
You can use array access with any object that has indexer property.
There are several built in functions and additional functions can be easily added.
The built in functions are:
equals(obj1, obj2) - invokes equals method on obj1 with obj2 as parameter. Returns boolean value.
notequals(obj1, obj2) - Returns !equals(obj1, obj2). Is equavilant to calling: not(equals(obj1, obj2))
iseven(num) - tests whether number is an even number
isodd(num) - tests whether number is an odd number
isempty(string) - test whether string has 0 characters. Same as equals(string.Length, 0)
isnotempty(string) - tests whether string has at least 1 character.
isnumber(num) - tests whether num is of numeric type
toupper(string) - converts string to upper case
tolower(string) - converts string to lower case
isdefined(varname) - tests whether variable named varname is defined
ifdefined(varname, value) - returns value if varname is defined. Especiall useful: #ifdefined("name", name)# - will output value of name if it's defined, otherwise will output nothing
len(string) - returns length of string
tolist(collection, property, delim) - will convert collection to string with delim as seperator. If you pass property,
the value of the property will be evaluated on each element of collection. If you omit property, then the object itself
will be used.
Ex:
suppose you have list as:
ArrayList list = new ArrayList();
list.Add("one");
list.Add("two");
list.Add("three");
template.SetValue("mylist", list);
then in your template:
#toList(mylist, " & ")#
the output will be: one & two & three
suppose you have list as:
list.Add(new Customer("Tom", "Whatever"));
list.Add(new Customer("Henry", "III"));
list.Add(new Customer("Tom", "Jackson"));
template.SetValue("mylist", list);
then in template:
#toList(mylist, "firstName", ",")#
the output will be: Tom,Henry,Tom
isnull(obj) - tests whether obj is null
not(boolvalue) - returns not (!) of boolean value
iif(booleanExpression, iftruevalue, iffalsevalue) - same as
booleanExpression ? iftruevalue : iffalsevalue in C#
Ex:
#iif(isodd(i), "bgcolor=yellow", "bgcolor=red")#
will output bgcolor=yellow if i is odd number and bgcolor=red if i is not odd number
format(object, formatstring) - will call ToString(formatstring) on object. Object has to implement
IFormattable interface, otherwise ToString() will be called.
Ex:
(suppose total is decimal with value 1208.45)
#format(total, "C")#
will output: $1,208.45
trim(string) - will trim string object
filter(collection, booleanproperty) - will return new List from collection for those objects
whose booleanproperty property evaluates to true
gt(obj1, obj2) - will return true if obj1 > obj2 (obj1 and obj2 must implement IComparable. All numeric types do)
lt(obj1, obj2) - will return true if obj1 < obj2 (obj1 and obj2 must implement IComparable. All numeric types do)
compare(obj1, obj2) - will return -1 if obj1 < obj2, 0 is obj1 == obj2, and 1 if obj1 > obj2 (obj1 and obj2 must implement IComparable. All numeric types do)
or(bool1, bool2) - will return true if either bool1 or bool2 are true
ex:
#or(equals(state, "IL"), equals(state, "NY"))# - returns true if state is either IL or NY
and(bool1, bool2) - will return true if both bool1 and bool2 are true
comparenocase(string1, string2) - will do case insenstive comparison of string1 and string2 and return true if they are equal
stripnewlines(string) - will return all \r\n instances and replace them with space
typeof(object) - will return string representation of the type of object. Ex: typeof("hello") return "string". typeof(3) returns int
cint(value) - converts value to integer (internally used Convert.ToInt32 from .net library)
cdouble(value) - converts value to double
cdate(value) - converts value to DateTime type. You can use this function if you want to create datetime objects.
Ex: #cdate("2005-5-1")#
createtypereference(type) - you can use this function to create references to static types so that you can access static properties or call methods of a static object.
It's most useful when combind with <ad:set tag (explained below)
#createtypereference("System.Math").Round(3.39789)#
#createtypereference("System.Math").PI#
or
<ad:set name="MyMath" value="#createtypereference("System.Math")#" />
#MyMath.Round(3.3)#
#MyMath.PI#
Version 2.1 also adds some operators for common expressions:
is - same as calling function equals. Ex: #obj1 is obj2# will return true if obj1 is equal to obj2.
isnot - same as calling function notequals. Ex: #obj1 isnot obj2#
and - used in if expressions tests (same as && in C#)
or - same as || in c#
lt,
lte,
gt,
gte - less than ("<" in C#), less than or equal ("<="),
greater than (">") and greater than or equal (">="). Both operands have to implement IComparable interface. When using numeric types, they have to be of the same type.
If you want to compare int to double, you have to convert int to double first using cdbl function.
#varOne lt 3#
#varTwo lte cdbl(3)#
#varThree gt varFour and varFive gte 5.0#
Built In Tags:
IF
You can also conditionally output text based on some expression using special if tag:
<ad:if test="#booleanexpression#">
<ad:elseif test="#bool#">
<ad:else>
</ad:if>
elseif and else are optional. If test of "if" evaluates to true, then block inside of "if" will be output, otherwise
elseif will be tested (if exists) and then else.
Ex:
<ad:if test="#cust.country is "US"#">
You are US customer.
<ad:else>
You are from: #cust.country# country.
</ad:if>
If cust.country is "US" then the output will be: You are US customer.
FOREACH
You can loop through collection of elements (any object that implements IEnumerable interface) using FOREACH tag.
<ad:foreach collection="#collection#" var="cust" index="i">
#i#: #cust.lastname#, #cust.firstname#
</ad:foreach>
Suppose customers is array of customer objects: customers = Customer("Tom", "Jackson"), Customer("Mary", "Foo")
The output will be:
1. Jackson, Tom
2. Foo, Mary
During execution, variable name that is passed as var attribute will be assigned with element from the collection.
Index attribute can be omitted, and is used to represent index variable for the loop. It starts with 1 and gets
increments with each iteration.
FOR
You can use FOR tab to loop through integer values by one.
<ad:for from="1" to="10" index="i">
#i#: #customers[i].name#
</ad:for>
SET
Set tag allows you to set values based on other expressions:
<ad:set name="var" value="#someexpression#" />
After set statement is executed you can use var as if it was a local variable.
It might be useful when accessing complex object values.
Instead of writing:
#customers[i].address.firstname# #customers[i].address.lastname# #customers[i].address.address1#
You can do:
lt;ad:set name="add" value="#customers[i].address#" />
#add.firstname# #add.lastname# #add.address1#
It's especially useful with createtypereference function (see above)
Custom Templates:
You can also create your own templates inside of template file that you can call.
You do that using template tag:
<ad:template name="ShowCustomer">
#customer.lastname#, #customer.firstname#
</ad:template>
<ad:showcustomer customer="#cust#" />
You can pass any attributes to the template, and you can use those inside of the template.
The template can also access all variables that are defined outside of the template.
When calling template you have to put trailing slash at the end, or put closing tag:
<ad:showcustomer />
or
<ad:showcustomer></ad:showcustomer>
The template also received special variable: innerText that is the content of executing the inner elements of calling template.
<ad:template name="bold">
#innerText#
</ad:template>
<ad:bold>#cust.lastname#, #cust.firstname#</ad:bold>
the output will be:
Jackson, Tom
(if customer is Tom Jackson)
You can also nest those:
<ad:template name="italic">#innerText#</ad:template>
<ad:bold><ad:italic>This will be bold and italic</ad:italic></ad:bold>
You can also invoke templates based on the name using apply tag:
<ad:apply template="#usetemplate#">this is content</ad:apply>
If usetemplate is "bold" then "bold" template will be called.
Templates can be nested inside other template:
<ad:template name="doit">
<ad:template name="colorme">
#innerText#
</ad:template>
<ad:colorme color="blue">colorize me</ad:colorme>
</ad:template>
colorme template can only be used within doit template.
Templates can also be added programmatically:
TemplateManager mngr = ...;
mngr.AddTemplate(Template.FromString("bold", "#innerText#"));
now bold template can be used anywhere within processing.
Version 2.0 adds ability to create custom tags in C# (or any .net language) that can extend the TemplateManager with additional functionality.
Together with the sources is Example 2 which includes 2 custom tags
email for sending email and
base64 for base64 encoding content.
Once those tags are registered with TemplateManger you can call them like:
<ad:email<EMAIL_ADDRESS><EMAIL_ADDRESS>subject="Hello" server="<IP_ADDRESS>">
Hello #customer.firstname# #customer.lastname#
</ad:email>
Version 2 also added ITemplateHandler interface for better interaction with template execution. You can than set templateManager's Handler property to a handler,
and this handler will be called before and after manager is done processing the template. This handler is also available as
this object, and you can access
any property or call methods of the handler from within the template. Example 2 includes "MyHandler.cs" as an example on how to use it.
-------------------------
Here is a sample based on order confirmation.
class Order
{
string firstname, lastname, address1, city, state, zip, country;
public string Address1
{
get { return this.address1; }
}
public string City
{
get { return this.city; }
}
public string Country
{
get { return this.country; }
}
public string Firstname
{
get { return this.firstname; }
}
public string Lastname
{
get { return this.lastname; }
}
public string State
{
get { return this.state; }
}
public string Zip
{
get { return this.zip; }
}
}
Order order = GetOrder();
TemplateManager mngr = TemplateManager.FromFile("order-confirmation.st");
mngr.SetValue("order", order);
System.IO.StringWriter writer = new System.IO.StringWriter();
mngr.Process(writer);
string emailBody = writer.ToString();
-------------------------------------------
order-confirmation.st
-------------------------------------------
<ad:showitem>
#item.sku# - #item.name#

<ad:if test="#equals(item.qty, 1)#">
Price: #format(item.price, "C")#

<ad:else>
You bought #item.qty# items for #format(item.price, "C")#
(total: #format(item.total, "C")#)
</ad:if>
</ad:showitem>
#order.firstname# #order.lastname#

#order.address1#

<ad:if test="#isnotempty(order.address2)#">#order.address2#
</ad:if>
#order.city#, #order.zip# #order.state#

<ad:foreach collection="#order.orderitems#" var="orderitem" index="i">

#i#.

<ad:showitem item="#orderitem#" />

</ad:foreach>

Shipping: #format(order.shipping, "C")#

Taxes: #format(order.tax, "C")#

Order Total: #format(order.total, "C")#

--------------------------------------------
Description of order-confirmation.st
First showitem template is defined which shows a single line item of the order.
item is passed as attribute to showitem.
Then address is shown. Note how if is used to conditionally display second line of address with ending
 tag.
Then each line item of order is looped through using ad:forech tag.
iif function is used to color everyother line with #DEDEDE color.
--------------------------------------------------
Example #2 for constructing complex SQL queries:
--------------------------------------------------
string[] cols = new string[]{"id", "name", "email"};
TemplateManager mngr = TemplateManager.FromFile(file);
mngr.SetValue("colums", cols);
mngr.SetValue("tablename", "customer");
string query = mngr.Process();
and the template file is:
select #toList(columns, ",")# from #tablename#
---------------------------------
Example 1 project has 2 sample templates that are used to process the same data.
First it outputs it as a C# class to the screen, then it uses html template to create
html file.
There are more examples in the includes source code distribution. Look at directories: Example 1, Example 2 and Tester.
If you have any questions, you can use AderTemplates forums at
http://www.adersoftware.com/adertools/
Download Source Code (440KB)
- includes full source code for the library, example program and simple GUI for testing templates.
Solution is for VS2005 beta 2.
Download Library Only (18KB)
- includes only dll for library. Works with .NET 2.0 only.


{{ partial "header" . }}
Hmm.. Seems something is missing, 'cause you just hit a 404. Eh, oh well; check out this other stuff.


Inari Cutscene Editor
Ask Inari (left) for help!
Loading
Action Type:
Loading
Action Subtype:
Loading
Selection Properties


Home
About
Model
About Us
Start your journey with the help of machine learning.
We will compare some machine learning models.
Learn more
Models
Logistic Regression
SVM
Random Forest
Decision Tree
Prepared by: Md. Ruhen Hossain Bhuiyan


QuickFlick Document
index
0. initializing
1. How to Input
2. Keymap
3. Modifier keys
4. Settings
Translated:
日本語/Japanese
Contact:
GitHub Issue: https://github.com/rkbk60/QuickFlick/issues
Twitter: @rkbk60


Hello from Myself
FullStack Web Programmer + Open Source Fanatic + Web Tech Enthusiast
" I introduce myself as a self-taught, passionate and determined Web Application Developer. I Love to code with JavaScript, Php, Python and also interested in frameworks like Django, Laravel, Node.Js etcetera. I have tried various database tools like MySql, MongoDB and Redis. "
" Currently I am researching and learning to become an Advanced Javascript Developer and studying over different frameworks like Angular.Js and Node.js. I prefer working in the back-end though I have a good grasp over the front-end part.  "
I personally prefer to work in the back-end section but I have a pretty good grasp over the front-end section. Hence I can manage to create a complete system by myself. I don't call myself a Web Designer though.
I am able to handle basic database management and integrating them with my favorite languages such as Javasscript. Php or Python etc. I have basic knowledge over MySql, MongoDB, Redis, Oracle PlSql etcetera.
Basically I have studied over some languages along with some frameworks and also some great API's provided by large Web Development communities like Google and Facebook.
Involved in Back-End Web Programming along with some experience in the Front-End Section.
Clear understanding over Html5 and Css3 and Bootstrap.
Grasp over Front-End Frameworks like Semantic-UI, Foundation, Materialize, Google's Material design.
Can play with Jquery and Ajax calls in the Front-End sections.
Have clear concepts over Object Oriented programming and fluent grasp over Php and JavaScript.
Have experience over frameworks like Laravel, Django, Angular, Express.js, Node.Js.
Experienced with database tools like MySql, MongoDB, Redis and Oracle's Pl-Sql.
Have some knowledge over some most popuplar API's provided by Facebook and Google. Like Firebase.
Expertise in creating logical functionalities of any kind of applications.
Understanding over Back-End Front-End relationships and expreienced in project management.
Have the ability to learn and adopt faster and also have a great team player mentality.


A little bit about me
As you've seen my name is Amy Davids and I grew up in Retreat. I attend The Cape Academy of Maths, Science and Technology and I am in grade 10. I would consider myself a natural hair enthusiast and I really enjoy all things that allow for creativity like: music, art, dance, fashion and even photography.


{{gettext("Infrastructure")}}
{{gettext("Services enabling functionality that is either impossible or impractical to do directly on-chain, such as indexing, messaging, and notifications")}}
{{gettext("Core Packages")}}
{{gettext("A suite of smart contracts and standards for creating listings, offers, and identities on decentralized marketplaces")}}


Unlocking the secrets of badger dispersal to minimize the spread of bovine TB
| Source: | Trinity College Dublin |
| Summary: | By understanding how, when, and why badgers move from one social group to another, researchers hope information gleaned from GPS devices will help them tailor vaccination programs to reduce the spread of bovine tuberculosis. |
Zoology researchers from Trinity College Dublin, working with the Department of Agriculture, Food and The Marine (DAFM) and the National Parks and Wildlife Service (NPWS), have unlocked the secrets of dispersing badgers.
Their research has major implications for implementing vaccination programmes to limit the spread of bovine tuberculosis (TB).
The findings come at an opportune time, as DAFM has commenced rolling out a national programme to vaccinate badgers in its efforts to eradicate TB.
Badgers are a protected species and are one of Ireland's most iconic wild creatures, but they can harbour TB and inadvertently transfer it to cattle. Infected cattle must be culled, which results in the loss of millions of euro each year in the agricultural sector, which can devastate individual farmers and their families.
Vaccinating badgers against TB provides an excellent option to mitigating these risks, but to do that effectively, it is imperative to understand how badgers move around in the wild and to target those most likely to spread disease. Badgers are social animals, living together in a shared territory. Dispersal is when a badger "moves house" e.g. it goes from living with one social group to living with an entirely different social group in a new location.
In the research, just published in leading international journal Ecology and Evolution, the zoologists describe the process of dispersal in greater detail than ever before after trapping and vaccinating 139 badgers, and monitoring their movements closely.
Aoibheann Gaughran, Postdoctoral Researcher in Trinity's School of Natural Sciences, was the lead author on the paper. She said:
"We found that only 17% of the badgers we tracked dispersed, so it's fair to say most badgers don't leave home — they remain living in the territory where they are born. However, some of those that did move away went on unexpectedly long and complex journeys."
"By using GPS satellite trackers to take a uniquely personal look at the nightly comings and goings of 80 of these badgers in the wild, we discovered that some — particularly the females — could cover over 100km while wandering around large areas looking for their new home. Our record-holder was a female that settled down only 1.5km away from where she was born, but travelled 308km back and forth before she joined her new social group. Male badgers, on the other hand, liked to stay close to their Mammy, and typically just moved next door."
"Dispersal begins when badgers are aged one year or older, but by vaccinating them as cubs we can avoid the disease-spreading implications of this behaviour."
The zoologists hope that by better understanding when and how badgers move between territories, they will be able to pinpoint where the greater risks for TB transmission lie, which would be extremely valuable information from a disease control perspective.
Nicola Marples, Professor of Zoology at Trinity, said:
"This research on badger movement should help to maximise the efficiency and effectiveness of the impending badger vaccination programme, which is great news. From both conservation and disease-control perspectives, a well-designed vaccination programme should provide a win-win situation."
The research was part of a collaboration between the Department of Food, Agriculture and the Marine, the National Parks and Wildlife Service and the Trinity zoologists, and was funded by DAFM.
make a difference: sponsored opportunity
Story Source:
Materials provided by Trinity College Dublin.
Note: Content may be edited for style and length.
Journal Reference:
- Aoibheann Gaughran, Teresa MacWhite, Enda Mullen, Peter Maher, David J. Kelly, Margaret Good, Nicola M. Marples. Dispersal patterns in a medium‐density Irish badger population: Implications for understanding the dynamics of tuberculosis transmission. Ecology and Evolution, 2019; DOI: 10.1002/ece3.5753
Cite This Page:
| MLA | Trinity College Dublin. "Unlocking the secrets of badger dispersal to minimize the spread of bovine TB." ScienceDaily. ScienceDaily, 19 November 2019. <www.sciencedaily.com/releases/2019/11/191119105522.htm>. |
| APA | Trinity College Dublin. (2019, November 19). Unlocking the secrets of badger dispersal to minimize the spread of bovine TB. ScienceDaily. Retrieved November 19, 2019 from www.sciencedaily.com/releases/2019/11/191119105522.htm |
| Chicago | Trinity College Dublin. "Unlocking the secrets of badger dispersal to minimize the spread of bovine TB." ScienceDaily. www.sciencedaily.com/releases/2019/11/191119105522.htm (accessed November 19, 2019). |


Introduction
So far in my data science journey I have mostly met reasonably small datasets, i.e. they always fit in my machine’s memory without any issue, so I was able to handle them without even having to think about enhancing my code for performance.
Recently I was working on a pet project aiming at performing customers segmentation on a dataset from a major sport retailer. The data contained 8+ million rows and whilst it still fit in memory, I soon noticed that performing exploratory data analysis was becoming too slow to allow me experiment freely.
Therefore I had to find ways to optimize my code, and I found two great ways to do so:
- leverage vectorized operations
- use cython, i.e. C-extension for python
Details about both options are described below.
But first let’s say a few words about profiling
Profiling
Profiling is a way of finding out how much resources/time is required for your code to run.
It’s useful to either compare two pieces of code that perform identical tasks in order to identify which one runs the fastest, or to identify bottlenecks in your code that you can then improve to speed up execution.
Jupyter magic %timeit
The simplest profiling tool comes with jupyter notebook, it’s a magic called %timeit.
Here is a simple use case. Let’s find out how long it takes to sort one million integers randomly picked between 0 and 999
%timeit np.sort(np.random.randint(0,1000,10**6))
#10 loops, best of 3: 58.6 ms per loop
How to understand this? The timeit magic performed 3 times in a row 10 runs of the comand. It found out that for the fastest of the 3 runs, the command took 58.6 ms to execute in average (so it took the total 10 runs time and divided it by 10).
Why 3 times?
Because your computer might be busy doing something else that will impact the command performance. Therefore you want to reduce bias by executing the command a few times and take the best of it.
Why 10 loops?
If your command it very simple and extremly fast to execute, the timing measure won’t be very precise. In that case, better run 10 or 100 loops and output the average, this provides better accurary. Timeit chooses by itself how many loops to perform based on the command complexity.
For instance if my list contains only 10 000 integers instead of one million, the sort is faster, therefore loops of 100 instead of 10 are executed:
%timeit np.sort(np.random.randint(0,1000,10**5))
#100 loops, best of 3: 5.51 ms per loop
These parameters can be configured (‘-r’ specified the number of runs, ‘-n’ the number of loops), see the timeit manual for more.
Also here i want to hightlight that we didn’t only calculate the sorting time, but the list generation time, since both were inculded in the same command. So if we want to understand exactly the performance of the sort algorithm, then we need to move the list generation out of the command which we profile.
listy = np.random.randint(0,1000,10**5)
%timeit np.sort(listy)
#100 loops, best of 3: 5.16 ms per loop
As expected, we now get a faster result! The main learning is that we should be careful of what exactly we are measuing !
The cProfile package
The cProfike package provides more advanced features for profiling. It actually gives details about which part of your code is consumming most resources.
Getting back to our random list generation and sorting, this is what we obtain:
import cProfile
cProfile.run('np.sort(np.random.randint(0,1000,10**6))')
9 function calls in 0.082 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.082 0.082 <string>:1(<module>)
1 0.000 0.000 0.062 0.062 fromnumeric.py:717(sort)
1 0.000 0.000 0.000 0.000 numeric.py:484(asanyarray)
1 0.000 0.000 0.082 0.082 {built-in method builtins.exec}
1 0.000 0.000 0.000 0.000 {built-in method numpy.core.multiarray.array}
1 0.004 0.004 0.004 0.004 {method 'copy' of 'numpy.ndarray' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.020 0.020 0.020 0.020 {method 'randint' of 'mtrand.RandomState' objects}
1 0.058 0.058 0.058 0.058 {method 'sort' of 'numpy.ndarray' objects}
The tottime column shows that the randint command took 20 milliseconds to run, and the sort 58.
With these tools at hand, we are ready to start our optimization work!
Vectorized operations
Python is nice because it’s a relatively high level programming language, i.e. a lot of details are taken care of for you which makes programming faster, however the drawback is that you don’t always know what happens behind the scene.
For quite some time I have been using vanilla lists, not really understanding what exactly numpy arrays were designed for.
Finally came the day were I tried to perform simple operations on my 8+ millions rows dataset. When it takes about 10 seconds to execute a simple command, it may still seem acceptable until you try to run tens of these commands one after the other!
And then I tried to perform more complex operations, and I finally hit “out of memory” issues.
This is where numpy comes in handy. Numpy has been optimized to run vectorized operations, i.e. apply them to a whole array at a time, as opposed to applying the operation to each element of the array separately. And it makes a whole lot difference!
Consider adding 1 to each value of a list. We will reuse our list of one million element from earlier. If you do that manually:
%timeit [x+i for x in listy]
#1 loop, best of 3: 204 ms per loop
Now look at the vectorized version of this code:
%timeit listy+1
#1000 loops, best of 3: 1.02 ms per loop
Yes that’s right, 1.02 ms for vectorized operation versus 204 ms for non vectorized. 200 times faster!
How do you know when you perform vectorized versus non vectorized? From my experience, if you manipulate numpy objects (or pandas, which is build on top of numpy) and don’t use any loop (“for”, “while”…) or access subelements individually then you are probably using vectorized operations. Loops are killing you performance!
Also usually when you write a function and pass a whole array, series or dataframe to it, you’re on the right track. But if it takes as argument just one element, or a slice (such as a row), and you call it using apply on your dataframe/array, then expect poorer performances.
It can get pretty cumbersome to write vectorized operations… but when performance is at stake, and sometimes even the simple fact to complete your command, than you have no choice.
See in appendix two cases I had to face, one relatively simple, and the other one more complicated.
Cython
Cython is a way to compile part of your code in C in order to accelerate its execution, or even to embed C-like code in python.
I have been playing with cython in order to build various functions that beat numpy performance… And it’s a lot of fun!
I present below the cumulative sum example, where I managed to beat numpy. However this is not always easy… try beating numpy at quicksort… good luck with that!
Cumulative sum example
Let’s study the performance difference for several implementations of the cumulative sum function, i.e we want a function a function that computes the cumulative sums of consecutive elements in a given numeric “x”, i.e., a vector “r” with
Vanilla python
import numpy as np
def cumSum1(listy):
""" This function computes the cumulative sum of elements of a list"""
lengthy = len(listy)
listz = np.empty(lengthy)
listz[0] = listy[0]
for i in np.arange(1,lengthy):
listz[i] = listy[i]+listz[i-1]
return(listz)
-
Python, compiled in C
We only add the “%%cython” command at the beginning
%%cython
import numpy as np
def cumSum2(listy):
""" This function computes the cumulative sum of elements of a list"""
lengthy = len(listy)
listz = np.empty(lengthy)
listz[0] = listy[0]
for i in np.arange(1,lengthy):
listz[i] = listy[i]+listz[i-1]
return(listz)
-
Cython
This time we have a bit more work to do. All variables must be defined with proper types using the cdef command, and in order to optimize the code the “for” loop has been replaced by a “while” loop. Apart from that there is little difference with the previous version of the code.
%%cython
import numpy as np
cimport numpy as np
cpdef cumSum3(np.ndarray[np.int64_t] listy):
""" This function computes the cumulative sum of elements of a list"""
cdef int lengthy = listy.size
cdef int i = 1
cdef np.ndarray[np.double_t] listz = np.empty(lengthy)
listz[0] = listy[0]
cdef int previous = listy[0]
cdef int current = 0
while i < lengthy:
current = listy[i]+previous
listz[i] = current
previous = current
i += 1
return(listz)
I won’t go into more details of cython code here as pretty much by copying this example and others in appendix, you can get started. More on cython.org
Numpy
Numpy has a built-in “cumsum” function so we don’t need to write any code here.
Performance comparison
l = np.random.randint(1,100,10**7)
%timeit cumSum1(l)
%timeit cumSum2(l)
%timeit cumSum3(l)
%timeit np.cumsum(l)
#1 loop, best of 3: 20 s per loop
#1 loop, best of 3: 19.8 s per loop
#10 loops, best of 3: 20.8 ms per loop
#10 loops, best of 3: 34 ms per loop
And the winner is… our cython function cumSum3 !!!
Whilst there is little difference between vanilla and compiled (I have seen sometimes more impressive gains), the move to cython simply drives a drastic improvement of nearly 1000 times!
And numpy runs 70% slower than our cython function.
Checking the actual C code
When running the %%cython command, you can add a “-a” flag that shows the C code generated for each line of cython. For instance:
If lines are highlighted in yellow it means they lead to many lines of code (high complexity) and if this code is repeated many times (embedded in a loop), it’s a sign you may want to optimze it.
This tool is great to spot what part of your code are not optimal and need enhancement. For instance, if you write this same code with a “for” loop instead of “while”, you can see that it’s translated into many more lines of C code (dark yellow highlight):
In that case the difference is probably small, but if you start embedding “for” loops, it will drive performance degradation, much more than embedded “while” loop.
This is one example amongst many. I have not finished exploring all the optimization opportunities, and I encourage you to try on your own!
Conclusion
This blog post showed two relatively easy ways to optimze python code. Undoubtly there are other tehniques, and in some cases data is so large that it won’t fit in memory, in which case you need to move to distributed processing, with spark for instance.
However these two techniques are a must know for anyone serious about writting fast and efficient code.
Enjoy!
Appendix
In this appendix I provide a few more examples of code optimization: 2 with vectorized operations, 2 with cython.
Vectorized example 1
In this case I simply wanted to map categorical values to numbers.
Non vectorized
gender_dict = {
'Male':0,
'Female':1,
'UNDEFINED':np.nan
}
%timeit df["Gender"].apply(lambda x: gender_dict[x])
#1 loop, best of 3: 2.65 s per loop
Vectorires
def set_gender(col):
res = pd.Series(['MALE' for _ in range(col.size)])
res = np.where(col == "UNDEFINED",np.nan,res)
res = np.where(col == "Female",1,res)
return res
%timeit set_gender(df["Gender"])
#1 loop, best of 3: 2.04 s per loop
The time difference may not seem so impressive here, but it’s already 30% less. And in fact other more complicated examples of the same type (with more categories for instance) have shown a much greater improvement by using vectorization.
Vectorized example 2
My data set contains 8+ million purchase records. I wanted to calculate how many days took place between each purchase, and put that information in a new column. In order to perform this as a vector operation, then only way I found was to duplicate the customer id (index) and purchase dates, and to shift them by one row. As a result you can compare dates from the original date column and from the new date column on the same row, and therefore no loop or complicated individual element access is required!
def days_between_purchases(df):
# Create a shifted copy of indices (=customer ids)
indices = df["index"]
first = indices[0]
new_indices = indices[1:]
new_indices[indices.size] = first
new_indices.index = indices.index
# Create a shifted copy of purchase dates
dates = df["Date of purchase"]
first = dates[0]
new_dates = dates[1:]
new_dates[dates.size] = first
new_dates.index = dates.index
# Add date when customer match
res = np.where((indices == new_indices),np.floor((new_dates - dates).astype('timedelta64[D]')),np.NaN)
return res
Without vectorization, creating the new row was simply craashing my jupyter notebook. With vectorization, it’s executed within a fraction of a second.
Cython example 1: is a list a palindrome
Python compiled in C
%%cython
def palindrome(listy):
res = True
i=0
while True & (i<=len(listy)//2):
res = res & (listy[i] == listy[-i-1])
i+=1
return res
Cython
%%cython
import numpy as np
cimport numpy as np
from cpython cimport bool
cpdef cpalindrome(np.ndarray[np.int64_t] listy):
cdef bool res = True
cdef int i = 0
cdef int lengthy = listy.size//2
cdef int remainder = listy.size%2
cdef np.ndarray[np.int64_t] list1 = listy[:lengthy]
cdef np.ndarray[np.int64_t] list2 = listy[remainder+lengthy:]
list2 = list2[::-1]
return np.array_equal(list1,list2)
Results
l1 = np.random.randint(1,100,10**7)
l2 = l1[::-1]
l = np.append(l1,l2)
%timeit palindrome(l)
%timeit cpalindrome(l)
#1 loop, best of 3: 2.63 s per loop
#100 loops, best of 3: 13.6 ms per loop
-
Cython example 2: reverse elements of a list
Python compiled in C
%%cython
import numpy as np
def invert(listy):
""" This function reverses the order of elements of a list"""
lengthy = len(listy)
listz = np.empty(lengthy)
for i in np.arange(lengthy):
listz[-i-1] = listy[i]
return(listz)
Cython
%%cython
import numpy as np
cimport numpy as np
from cpython cimport bool
cpdef cinvert(np.ndarray[np.int64_t] listy):
""" This function reverses the order of elements of a list"""
cdef int lengthy = listy.size
cdef int i = 0
cdef int j = lengthy-1
cdef np.ndarray[np.double_t] listz = np.empty(lengthy)
while i<lengthy:
listz[j] = listy[i]
i += 1
j -= 1
return(listz)
Results
l = np.random.randint(1,100,10**7)
%timeit invert(l)
%timeit cinvert(l)
#1 loop, best of 3: 4.42 s per loop
#10 loops, best of 3: 25.7 ms per loop


Master the Mainframe
Dear ACM chapter representative,
Registration for the 2013 IBM Master the Mainframe Contest is now open! This year, the IBM Academic Initiative System z team is giving away over $53,000 in prizes, including Google Nexus 10 tablets, expenses-paid trips, custom T-shirts, and a ton of swag! Plus, tons of great technical challenges to give students hands-on experience and sought-after skills. No experience necessary!
Visit our 2013 Master the Mainframe Contest homepage for details: https://contest-reg.dfw.ibm.
We also put a link to a printable PDF flyer on the homepage - the perfect accessory for any bulletin board!
The contest, which begins on October 7, is an educational tool that progresses in difficulty and prize value as contestants complete a variety of tasks, logging into a remote mainframe system from their own workstations.
This year, the custom Master the Mainframe Contest T-shirt (the prize for being among the first 2,600 contestants to complete Part 1) will feature "tour dates" on the back, which will match the hometowns of the 50 schools that have the most registrants as of October 7.
You can connect with other students and educators, and keep up with the latest contest announcements, on our Facebook page: http://www.facebook.com/
Students will also be encouraged to use their mainframe skills to help them apply for the jobs on our System z Job Board at systemzjobs.com.
The only requirement for students to join the contest is that one educator at their school is enrolled in the IBM Academic Initiative. If any of your members are unsure about an Academic Initiative member at your school, please have them follow the simple advice that we posted on our Facebook page. (Just put a * in the "Professor" field when you register, and we'll follow up with you later if we need to -- and there's not much chance that we'd need to. Most schools already have an educator enrolled.)
Our team hopes to see many ACM students Mastering the Mainframe this fall!
Best regards,
Mike


Lab 09 - Create Test Scenarios
Lab Goal
To create test scenarios to validate our rules, events, and process for the Cool Store
Creating Test Scenarios
- Designing rules, events, and process has completed
- Now it is time to test what we have created
- JBoss BRMS provides you with an online test scenario creation
- we will guide you through the first test
- you will design a few more based on detailed descriptions
- extra credit if you come up with more tests...
Creating Test Scenarios
- Design a test to validate our Domain Specific Language (DSL)
- Our 'Guided Rule with DSL' is about giving free shipping
Free Shipping Promotion DSL Test:
- if the shopping cart total value is $75 or more, free shipping
Creating Test Scenarios
- We will create a new test scenario
AUTHORING -> PROJECT AUTHORING -> NEW ITEM -> TEST SCENARIO
RESOURCE NAME: Free Shipping Promotion DSL Test
Creating Test Scenarios
- Tab at bottom of test scenario to access designers:
'Test Scenario'
- editor for test designer
'Config'
- editor to manage test data model
Creating Test Scenarios
- First we need to add a Shopping Cart object to populate our test
- using the 'Config' tab, we add the object
- click on the'NEW ITEM' button
- select 'ShoppingCart' from the menu
- select 'OK'
Creating Test Scenarios
- Now in Test Scenario tab we focus on these sections:
'Given'
- define input fact objects
'Expect'
- define method to call on given fact objects
Creating Test Scenarios
- Provide the tests given fact objects
- Click on 'GIVEN' button in left top corner
- assign field
'Activate rule flow group: promo-rules'
- click on'ADD' button next to field
Creating Test Scenarios
- Click on
'+GIVEN'
button in left top corner
- assign field
'Insert a new fact: ShoppingCart'
- assign field
'Fact name: $sc1'
- click on
'ADD'
button next to field
Creating Test Scenarios
- Add cartItemTotal & shippingTotal fields to shopping cart ($sc1):
- click on
'Add a field'
for 'ShoppingCart'[$sc1]
- using menu, select
'cartItemTotal'
and click on 'OK'
button
- click on
'ShoppingCart'[$sc1]
to add a second field
- using menu, select
'shippingTotal'
and click on 'OK'
button
Creating Test Scenarios
- Add values to cartItemTotal & shippingTotal fields to shopping cart ($sc1):
- click on pencil icon to add
'Literal value'
to 'cartItemTotal'
- enter values of 75
- click on pencil icon to add
'Literal value'
to 'shippingTotal'
- enter values of 10.99
Creating Test Scenarios
- Add a second shopping cart ($sc2) with following fields & values:
'cartItemTotal'
with a value of 74.99
'shippingTotal'
with a value of 10.99
Creating Test Scenarios
- Detail what we expect as the outcome of our test:
- click on
'+EXPECT'
- we want to add a rule expected to fire
- insert this
RULE: 'Free Shipping Promotion DSL'
- click on
'OK'
- Now restrict rule to just one time
Creating Test Scenarios
- Now we have an expectation as to the outcome of first shopping cart ($sc1)
- click on
'+EXPECT'
- select from
'Fact value:'
menu, '$sc1'
- click on
'Add'
Creating Test Scenarios
- Then add field
'shippingTotal'
by clicking little green arrow icon
- add field
'shippingTotal'
- click on
'OK'
- as shopping cart value is
75
we expect value of 0
Creating Test Scenarios
- Now put in our expectation for the second shopping cart ($sc2)
- add the fact
'$sc2'
- add field
'shippingTotal'
- as shopping cart value is
74.99
we expect value of 10.99
(see decision table)
Creating Test Scenarios
- We can now save and run our test scenario:
- ensure configuration set to
'All rules may fire'
- click on
'Save'
button and 'Run scenario'
- looking for green
'Success'
in 'Report'
pane, otherwise fix test
Creating Test Scenarios
- Note that there is little feedback on test failures
- This makes finding problems difficult at this time
- Strong hint is to design a test at a time
- if test works, move to next test
- run
'All Test Scenarios'
when more tests available
- ensures no breakage of other tests in suite
Creating Test Scenarios
- Save your test scenario each time you create a new one
OPEN PROJECT EDITOR -> BUILD & DEPLOY
(should see green pop-up 'Build Successful')
Creating Test Scenarios
- Now create each of the following tests
Shipping Rules Test - One Cart
Shipping Rules Test
Total Shopping Cart Items Test
Total Shopping Cart Test
Creating Test Scenarios
- Outline for
Shipping Rules Test - One Cart
test:
- use
shipping-rules
as rule flow group
- add
ShoppingCart
data object
- Given:
ShoppingCart
($sc) with cartItemTotal
of 0.00
- Expect:
- expect rules
Row 1 Shipping Rules
to fire just 1
time
ShoppingCart [$sc]
has shippingTotal
value of 2.99
- (continued on next slide...)
Should look like this so far...
Creating Test Scenarios
- Use the
MORE
button to extend this test
- Given:
- modify existing fact
ShoppingCart [$sc]
- set
cartItemTotal
to 24.00
& shippingTotal
to 0
- Expect:
- expect rules
Row 1 Shipping Rules
to fire just 1
time
ShoppingCart [$sc]
has shippingTotal
value of 2.99
- (continued on next slide...)
It should look like this so far...
Creating Test Scenarios
- Add tests based on images using `MORE` button:
- (continued on next slide...)
Creating Test Scenarios
- Add tests based on images using `MORE` button:
- then save and run the test
Creating Test Scenarios
- Outline for
Shipping Rules Test
test:
- use
shipping-rules
as rule flow group
- add
ShoppingCart
data object
- Given:
- add
ShoppingCart ($sc1)
through ShoppingCart ($sc9)
- add
cartItemTotal
with values 0.00
, 24.99
, 25
, 49.99
, 50
, 74.99
, 75
, 99.99
, 100
Creating Test Scenarios
- Expect:
- setup rules to fire as shown in image below
Creating Test Scenarios
- Finish the Expect section:
- the carts $sc1 through $sc9 to have the results as show in image below, save and test rules
Creating Test Scenarios
- Outline for
Total Shopping Cart Items Test
test:
- use
pricing-rules
as rule flow group
- add
ShoppingCart
and ShoppingCartItems
data objects
- Given:
- setup given section of this rule based on image below
Creating Test Scenarios
- Outline for
Total Shopping Cart Items Test
test:
- Expect:
- setup given section of this rule based on image below
Creating Test Scenarios
Total Shopping Cart Test
test:
- use
total-rules
as rule flow group
- add
ShoppingCart
data object
- Given:
- setup given section of this rule based on image below
Creating Test Scenarios
Total Shopping Cart Test
test:
- Expect:
- setup given section of this rule based on image below
Creating Test Scenarios
- Run
'Total Shopping Cart Test'
test, it fails!? fix it!
Creating Test Scenarios
- Now all test scenarios are finished
- Also ensure your package builds:
OPEN PROJECT EDITOR -> BUILD & DEPLOY
(should see green pop-up 'Build Successful')
Lab results...
- JBoss BRMS & BPM Suite Articles
- JBoss BPM Suite Demos
- JBoss bpmPaaS Demos


Preparation time
less than 30 mins
Cooking time
10 to 30 mins
Serves
6
Dietary
Butter 6 x 7.5cm/3in dariole moulds (or a 22cm/9in ovenproof dish if you want to make one large pie).
Roll out two-thirds of the pastry on a floured work surface using a rolling pin. With a pastry cutter the size of the dariole moulds, cut out six discs large enough to line the dariole moulds; line the bottom and sides of the buttered moulds with the pastry discs (or if making one pie, cut out a large circle of pastry to line the buttered dish). Transfer to the fridge to chill.
Place the sugar, lemon juice and lemon zest into a bowl.
Peel, quarter and core the apples, then slice them thickly into the bowl with the lemon and sugar. Mix together.
Heat a pan over a medium heat. Add the apple mixture, the butter and the cinnamon (if using) and stew for 3-4 minutes. Add the blueberries and cook for a few more minutes, before removing from the heat to cool.
Preheat the oven to 200C/400F/Gas 6.
Fill the pastry-lined dariole moulds or pie dish with the cooled apple and blueberry mixture.
Roll out the remaining pastry on a floured work surface and cut out discs a little bigger than the dariole moulds or pie dish. Place the pastry on top of the the dariole moulds or pie dish and seal the edges well. Make a small hole in the top to allow the steam to escape.
 Brush the pastry lids with a little lightly beaten egg then dredge with caster sugar.
Bake for 15 minutes, until the fruit is tender and the top is golden-brown. Serve hot with clotted cream


Dynamic Visualisation for Clarke and Park Transforms¶
The purpose of this project is to dynamically visualise the Clarke Transform and the Park Transform.
The Clarke Transform was invented by Edith Clarke , who was a remarkable female engineer.
The Park Transform was invented by Robert H. Park .


Pakistan Reportedly Foils Attempt by US Military Aircraft to Enter its Airspace
Media reports suggest that the US plane was forced to turn back toward Muscat shortly after it tried to enter Pakistani airspace.
Pakistan's Civil Aviation Authority reportedly thwarted an attempt by a US military plane to enter its airspace on Wednesday.
The authority claimed that the US jet had tried to enter into Pakistani airspace from the Karachi region without having the relevant clearances and codes.
According to reports, the US plane was coming from Muscat and Pakistan’s civil aviation authority claimed the air traffic controller in the area immediately sent out a warning, so the aircraft was forced to head back.
The US side has yet to comment on the reports.
Pakistan had closed its airspace in February this year after an Indian Air Force (IAF) strike on an alleged Jaish-e-Mohammed (JeM) terror training camp in the country's Balakot region.
The IAF strike on 26 February came a fortnight after a suicide bomber purportedly affiliated with JeM killed 40 Indian security personnel travelling in a convoy through Jammu and Kashmir's Pulwama region.
India and Pakistan have contested the Kashmir region, the southern part of which lies in the Indian state of Jammu and Kashmir, since the end of British rule in 1947. Despite a ceasefire reached in 2003 after several armed conflicts, instability in the region has showed no signs of abating and has led to the emergence of various extremist groups.


curl --url "http://<IP_ADDRESS>:7783" --data "{"userpass":"156ewr","method":"my_swap_status","params":{"uuid":"637099d9a96a7ef7b8f6782d5ea342275ce64059e47a9563478adc6174c077c7"}}"
{"error":"lp_swap:1276] EOF while parsing a value at line 1 column 0"}
jl777cToday at 8:07 PM
i guess could be my coins repo where there is a "mm2":1 field that would be needed and such a field in a pull request along with mm2proofs


ZLib is an abstraction of the DEFLATE compression algorithm. It can (losslessly) compress and decompress data. DEFLATE uses a combination of the LZ77 sliding window and Huffmann coding to achieve compression.
ZLib is a third party module, and as such, the finer details of the zlib implementation are sometimes not known. Thus, the documentation of the zlib module is at times sparse.
ZLib can compress data to and extract data from the zlib
format. This format is somewhat a
The API Documentation is generated by Doxygen.
Taken from zconf.h:
The memory requirements for deflate are (in bytes):
(1 << (windowBits+2)) + (1 << (memLevel+9))
that is: 128K for windowBits=15 + 128K for memLevel = 8 (default
values) plus a few kilobytes for small objects.
Taken from zconf.h:
The memory requirements for inflate are (in bytes):
1 << windowBits
that is, 32K for windowBits=15 (default value) plus a few kilobytes
for small objects.
ZLib has a load of static const int
data on the
stack. Most of it is static huffmann trees, lengths and distances.
ZLib has three OperaGlobals, m_static_l_desc
,
m_static_d_desc
and m_static_bl_desc
. All
have the type static_tree_desc_s
.
ZLib functions that may run out of memory will return
Z_MEM_ERROR
if an allocation fails. (Notable exception is
updatewindow
, that returns 1. However, ZLib functions
that call updatewindow
will still return
Z_MEM_ERROR
if this happens.) Handling OOM is left to
caller.


Number Guessing Game
Enter a number between 1-100 and click the button...
Guess
Your Previous Guesses


Our Services
Mortgage Repayment Calculator
This calculator shows what monthly payments would approximately be for a particular loan amount and interest rate.
First Time Buyers
Buying your first home is exciting. Right now you may only be thinking about it, casually browsing houses online
Re-Mortgaging your Home
You’ve decided to re-mortgage because your existing mortgage product has expired or you need to release funds from your home
Equity Release
If you are aged 55 or over, own your own home worth at least £70,000 and have found yourself asset rich but cash poor.


Functions | |
| int | qfitsloader_init (qfitsloader *ql) |
| Initialize a qfitsloader control object. | |
| int | qfits_loadpix (qfitsloader *ql) |
| Load a pixel buffer for one complete image. | |
| int | qfits_loadpix_window (qfitsloader *ql, int llx, int lly, int urx, int ury) |
| Load a pixel buffer for one image window. | |
| int | qfits_pixdump (qfitsdumper *qd) |
| Dump a pixel buffer to an output FITS file in append mode. |
|
|
Load a pixel buffer for one complete image.
|
|
|
Load a pixel buffer for one image window.
This function will fill up the ibuf/fbuf/dbuf field, depending on the requested pixel type (resp. int, float or double). If llx lly urx and ury do not specify the whole image, ql->map must be 0, we do not want to mmap a file an load only a part of it. |
|
|
Dump a pixel buffer to an output FITS file in append mode.
The minimum fields to fill are:
One of the following fields must point to the corresponding pixel buffer:
This is a fairly low-level function, in the sense that it does not check that the output file already contains a proper header or even that the file it is appending to is indeed a FITS file. It will convert the pixel buffer to the requested BITPIX type and append the data to the file, without padding with zeros. See qfits_zeropad() about padding. If the given output file name is "STDOUT" (all caps), the dump will be performed to stdout. |
|
|
Initialize a qfitsloader control object.
You can go ahead with these fields only if you only want to get file information for this plane in this extension. If you want to later load the plane, you must additionally fill the 'ptype' field to a correct value (PTYPE_INT, PTYPE_FLOAT, PTYPE_DOUBLE) before calling qfits_loadpix() so that it knows which conversion to perform. This function is basically a probe sent on a FITS file to ask qfits if loading these data would be Ok or not. The actual loading is performed by qfits_loadpix() afterwards. |


index
module components.preprocessing.wrapper
ChunkerWrapper
PreprocessorWrapper
TagId
TaggerWrapper
TokenizerWrapper
TreeTagger
Wrapper
Contains the wrappers for all preprocessing components.
class ChunkerWrapper
Inherits from: Wrapper
Wrapper for the chunker.
Public Functions
__init__(self, tarsqidocument)
Set component_name, add the TarsqiDocument and initialize the chunker.
process(self)
Generate input for the chunker from the lex and s tags in the document,
run the chunker, and insert the new ng and vg chunks into the TagRepository
on the TarsqiDocument.
Private Functions
_export_chunks(self, text)
Export ng and vg tags to the TagRepository on the TarsqiDocument.
_import_tokens(self, element)
Import sentence and lex tags and create the datastructure that the chunker
needs as input.
class PreprocessorWrapper
Inherits from: Wrapper
Wrapper for the preprocessing components.
Public Functions
__init__(self, tarsqidocument)
Set component_name, add the TarsqiDocument and initialize the
TreeTagger.
process(self)
Retrieve the element tags from the TarsqiDocument and hand the text
for the elements as strings to the preprocessing chain. The result is a
shallow tree with sentences and tokens. These are inserted into the
TarsqiDocument's tags TagRepositories.
Private Functions
_export(self, text)
Export preprocessing information to the tag repository. Updates the
TagRepository using the preprocessing result.
_merge_tags(self, tokens, taggedItems)
class TagId
Inherits from: object
Class to provide fresh identifiers for lex, ng, vg and s tags.
class TaggerWrapper
Inherits from: Wrapper
Wrapper for the tagger.
Public Functions
__init__(self, tarsqidocument)
Set component_name, add the TarsqiDocument and initialize the
TreeTagger.
process(self)
Generate input for the tagger from the lex and s tags in the document, run
the tagger, and insert the new information (pos and lemma) into the
TagRepository on the TarsqiDocument.
Private Functions
_export_tags(self, tagged_tokens)
Take the token tuples and add their pos and lemma information to the
TagRepository in the TarsqiDocument.
_merge_tags(self, tokens, taggedItems)
Merge the tags and lemmas into the tokens. Result is a list of tokens
where each token is a 5-tuple of text, tag, lemma, begin offset and end
offset. Sentence information is not kept in this list, which makes this
method different from it's sister on PreprocessorWrapper.
class TokenizerWrapper
Inherits from: Wrapper
Wrapper for the tokenizer.
Public Functions
__init__(self, tarsqidocument)
Set component_name and add the TarsqiDocument.
process(self)
Retrieve the element tags from the TarsqiDocument and hand the text for
the elements as strings to the tokenizer. The result is a list of pairs,
where the pair is either (<s>, None) or (SomeString, TokenizedLex). In
the first case an s tag is inserted in the TarsqiDocument's tags
TagRepository and in the second a lex tag.
Private Functions
_export_sentence(self, s_begin, s_end)
Add an s tag to the TagRepository of the TarsqiDocument.
_export_tokens(self, tokens)
Add s tags and lex tags to the TagRepository of the TarsqiDocument.
class TreeTagger
Inherits from: object
Class that wraps the TreeTagger.
Public Functions
__del__(self)
When deleting the wrapper, close the TreeTagger process pipes.
__init__(self, treetagger_dir)
Set up the pipe to the TreeTagger.
tag_text(self, text)
Open a thread to the TreeTagger, pipe in the text and return the results.
Private Functions
_get_executable(self)
Get the TreeTagger executable for the platform.
class Wrapper
Inherits from: object
Abstract class for shared functionality of the proprocessing wrappers.
Public Functions
__init__(self, name, tarsqidoc)
Private Functions
_chunk_text(self, text)
Takes a list of sentences and return the same sentences with chunk
tags inserted.
_init_chunker(self)
_init_tagger(self)
_init_tokenizer(self)
_tag_text(self, tokens)
Takes a string and returns a list of sentences. Each sentence is a
list of tuples of token, part-of-speech and lemma.
_tokenize_text(self, string)
Takes a unicode string and returns a list of objects, where each
object is either the pair ('<s>', None) or a pair of a tokenized string
and a TokenizedLex instance.
module functions
adjust_lex_offsets(tokens, offset)
The tokenizer works on isolated strings, adding offsets relative to the
beginning of the string. But for the lex tags we need to relate the offset
to the beginning of the file, not to the beginning of some random
string. This procedure is used to increment offsets on instances of
TokenizedLex.
initialize_treetagger(treetagger_dir)
normalize_POS(pos)
Some simple modifications of the TreeTagger POS tags.


LOAD
Section: SQL Commands (7)Updated: 2012-08-14
Index Return to Main Contents
NAME
LOAD - load a shared library fileSYNOPSIS
LOAD 'filename'
DESCRIPTION
This command loads a shared library file into the PostgreSQL server's address space. If the file has been loaded already, the command does nothing. Shared library files that contain C functions are automatically loaded whenever one of their functions is called. Therefore, an explicit LOAD is usually only needed to load a library that modifies the server's behavior through ``hooks'' rather than providing a set of functions.
The file name is specified in the same way as for shared library names in CREATE FUNCTION [create_function(7)]; in particular, one can rely on a search path and automatic addition of the system's standard shared library file name extension. See in the documentation for more information on this topic.
Non-superusers can only apply LOAD to library files located in $libdir/plugins/ --- the specified filename must begin with exactly that string. (It is the database administrator's responsibility to ensure that only ``safe'' libraries are installed there.)
COMPATIBILITY
LOAD is a PostgreSQL extension.
SEE ALSO
CREATE FUNCTION [create_function(7)]
Index
This document was created by man2html, using the manual pages.
Time: 05:34:15 GMT, December 24, 2015


EOC
End Of Course - A summary of JavaScript!

Backend + Frontend. NodeJS.
readfile.js
Dynamic with Functional Scope
There is no { block scope. }
Functions make scope.
scope.js
Variable Hoisting
"... declaring a variable anywhere in the code is equivalent to declaring it at the top."
hoisting.js
1st class functions and Functional Programming
JavaScript supports Functional paradigms. This is the natural way of doing things in JS!
logger.js
We code without for-cycle!
Too verbose. There is a higher-order function for that - [].forEach
foreach.js
One Thread + Event Loop
eventloop.js
Shit people say: JavaScript doesn't have *INSERT_SOMETHING*
Standard Library!
Look at Python, for example! JavaScript sux.
DOM API SUX!
You don't know what is happening. Where is the documentation? WTF?
CALLBACK HELL 1!@!!ONE!
asyncStep1(function() {
asyncStep2(function() {
asyncStep3(function() {
// ...
});
});
});
Promises! They help, I promise!
Abstraction that provides return value from async functions.
callbackhell.js, promises.js
You cannot manage dependencies!
Download them .js files and include them. It's ugly!
And they are one of the best out there ;)
You cannot import files! There are no modules!
No import, module, require keywords. Only script tags.
You have AMD and CommonJS.
Model-View-Whatever patterns, just for you!
JavaScript = Tool Based Language
Bower + RequireJS + undersore + jQuery + BackboneJS
Things that we didn't have time for:
Things that we didn't have time for:
Things that we didn't have time for:
Things that we didn't have time for:
Things that we didn't have time for:
Things that we didn't have time for:
Things that we didn't have time for:
You have a solid JavaScript foundation!
Build on it - You will learn new things faster.
Refactor State of Mind
If you see bad JavaScript code, make it better!
Don't Hate!
Stay open minded & Go code the future!
Thanks for being part of this course ^_^


This was a hardware project implemented at University of Illinois hackathon where we used an Intel Edison chip to host a multi-user function racing game using a Django Server. The game running on the client side used an accelerometer to control the player movements and these accelerometer signals were sent as distinct signals to the javascript applet that controlled the user direction.
This project won Intel's Most Innovative Use of Intel Microcontrollers at UIUC HackIllinois 2016
This was a class project that involved connecting users in a network based on attributes such as university year, likings, interests, and calculated a distance number. If the number spanned a range then he/she was considered a friend and the two friends represented by nodes in a graph were connected.
Dijsktra's Algorithm Implementation
The users that were connected as second friends or third friends were traversed using dijkstra's algorithm. So, for example if a query were made to find if User A were connected to User B then a BFS would allow us to find the shortest path and the route would be returned by the algorithm.
This was a class project to implement a MIPS 32-bit ISA supported processor.
Single Cycle
The first implementation was to build a single cycle execution processor with access to elements in the execution cycle once per instruction per cycle. The ideal CPI of this processor was 1. It was modified to work for high latency RAM where the data and instruction hit's were stalled until the RAM let data into the memory controller. The datapath consisted of 32 word registers with an ALU and a program counter to increase the instruction count and fetch the next instruction.
5 stage Pipeline
As with every design, the first implemetation is the most naieve one. Using a 5 stage pipeline register model, instruction parallelism was achieved by having an instruction fetch, decode, arithmetic execution, memory and write back stage. The names of these stages clearly demonstrate their functionality. The important part was handling the hazards that were associated with instructions dependent on each other. These were solved using a forwarding unit. Load Word(lw) hazards were solved using stalls. And branch prediciton for single loop program execution was achieved.
Cache Integration and Dual Core Scale
To optimize for speed, a two way set associative cache with an LRU scheme was implemented to support instruction and data fetches quickly. This was integrated with a coherence controller that helped execute instructions on a dual core model. Data coherence was established using the MSI protocol. Finally Load Linked and Store Conditional operations were implemeted that allowed locking and unlocking mechanism for restricted access.
Stack
The entire design was coded in System Verilog and tested on DE-2 FPGA Altera board
Date:
Jan 2016 - May 2016
Project Glass
Heads up wearable display
A successful attempt to recreate a cheaper version of existing market products that show information on a heads up display. This project was designed to display time, weather and news notifications as updated on an Android phone. The update events on the phone were subscribed by a Bluetooth Low Energy module(Microchip RN4020) hosted on an M0 Atmel SAMD microcontroller which together were a part of the heads up display's core functionality. This entire product along with the BLE, microcontroller all of which were hosted on a custom PCB costs around 25$ a piece and that is with respect to low production quantity.
This particle module powered device renders user preference screens on two 0.96'' screens showing the most pertinent information precluding the usage of the phone for checking trivial but crucial details like date, time, temperature, stocks and others based on preference settings defined per device ID in a MongoDB framework.
The events shown on the screen are subscribed to by the particle photon and the Node JS service satisfies the GET requests sent out by this very module.
My Contributions:
The rendering on the screens is done via the SSD 1331 libraries using SPI interfacing.
It also shows bank account information received in a secure format using Capital One's API calls.
Packaging of the product is done keeping size and cost as a factor. The stand-alone equipment without any mass production costs $25 a piece. It could do wonders if mass produced.
DJarvis - You're very own personal music assistant was made with the noble purpose of helping you cheer up or continue you're mood of relaxation. It integrates with the Microsoft Cognitive API to give the user a careful analysis of his/her feeling's and then alleivates, calms, or continues the current state of mind by playing music with respect to a parameter called valence which is integrated with the Spotify Web API. A valence parameter brought in using the Spotify Web API, which ranges from 0-1 helps convey the positivity of the song and compares with the Cognitive APIs detection of emotions of the person and this coherency helps achieve the ideal playlist whether the user is sad or happy.
My Contributions:
Thought of the idea, and the product design and architecture.
Building the Node.js server side infrastructure.
Integrating webcam picture application using getUserMedia and displaying on a canvas and using Microsoft BlobStorage to save it to the cloud.
Using Microsoft Cognitive Emotions API to get the user clicked image's happiness level to send to server for Spotify song selection.


DELETE {{ data.name }}?
Supergiant depends on Prometheus for various metrics and reporting services. Removing it may cause sub-optimal performance. Are you sure you want to delete this app?
Are you sure you want to delete this app?


NFL Insider Offers Injury Update For Steelers RB James Conner
by Andrew McCartyLast Thursday night, the Cleveland Browns hosted the Pittsburgh Steelers in a pivotal match-up between AFC North foes. All of the attention after the game was focused on the incident between Myles Garrett and Mason Rudolph.
While that held significant consequences for both teams, there were three key injuries to the Steelers offense that were overlooked.
Star running back James Conner, wide receiver JuJu Smith-Schuster and fellow wide receiver Diontae Johnson all left the game with injuries.
Conner, who suffered a shoulder injury four weeks ago against the Miami Dolphins, re-injured the shoulder. Smith-Schuster and Johnson also both left the game with concussions.

Rapoport suggested Conner will NOT play this weekend and it doesn’t look good for JuJu either.
Conner and Smith-Schuster have not practiced at all this week. However, the rookie wide receiver has been at practice this week. Johnson still needs to pass the concussion protocol before he can take the field this weekend.
The good news for the Steelers is they play a horrific Cincinnati Bengals team searching for its first win.
Can the Steelers overcome their injuries and get the win? Stay tuned.


Note:In the next lecture among other things you're also going to learn how to load Excel (.xlsx)files in Python with pandas. Pandas may require the xlrd library as a dependency. If you get an error such asModuleNotFoundError: No module named 'xlrd'
you can fix that byinstalling xlrd:
pip install xlrd
or
pip3 install xlrd


POOBLAST
Use the Left
and Right
Arrows or A
and D
keys to move, Spacebar
to shoot.
Click here to play in full mode, click the game to pause and take a break. Follow me on POOforPOO.github.io
Use the Left
and Right
Arrows or A
and D
keys to move, Spacebar
to shoot.
Click here to play in full mode, click the game to pause and take a break. Follow me on POOforPOO.github.io


Hi, this is header1!
My favorite sites are below...
mozilla.org
GitHub
freecodecamp.org
learntosolveit.com
udemy.com


--- categories: python, pil date: 2004/06/17 20:13:20 guid: /?p=73 permalink: http://bob.pythonmac.org/archives/2004/06/17/checking-the-current-directory-for-progressive-jpegs/ tags: '' title: Checking the current directory for progressive JPEGs ---
This is a quick hack, you'll need PIL with JPEG support installed to use it.
import glob, Image print 'n'.join([fn for fn in glob.glob('*.jpg') if Image.open(fn).info.get('progression')])


{% include "people/chew.html" %}
{% include 'people/karr.html' %}
{% include 'people/mak.html' %}
{% include 'people/sekar.html' %}
{% include 'people/shaikh.html' %}
{% include 'people/yang.html' %}
{% include 'people/xu.html' %}
{% comment %}
Honorary lab members
{% include 'people/meyer.html' %}
{% endcomment %}
Alumni
Gabrielle Altman: Then: Summer Intern, Now: Undergraduate Student at Washington University in St. Louis


Use of
\par
is redundant when there already are 2 newlines.
Multiple newlines already denote the start of a new paragraph, so the use of
\par
is redundant.


Radicchio Makes A Superior Holiday Salad
by Claire LowerI am an unapologetic champion of serving a salad with holiday dinners. Even though I am completely here for the casseroles, a pile of raw leaves can cleanse the palate and invigorate, allowing one to continue shoving potatoes and gravy into one’s face with gusto. Any salad can fill this role, but a radicchio salad excels in it.
There are three main reasons radicchio belongs in your holiday spread: aesthetics, flavour, and ease. In a sea of beige that is (sometimes) punctuated with pops of green, a vibrant bowl of purple is a welcome sight. Radicchio’s flavour is also a much-needed departure from the norm. Bitter isn’t a taste associated with holidays, but believe me, serving a side that breaks up all of the umami-packed, fat-forward offerings is a clutch move.  Radicchio is also a dead-easy leaf to prep. Just tear it with your hands, or have a (clean) child do so.
Even though this is a salad, it’s still a holiday salad, and little toasty bits of brown butter bread crumbs, along with a maple apple cider vinaigrette, keep it from feeling completely disjointed. Both the crumbs and the dressing can be prepped the day before, then stored in the fridge. (Take them out about an hour before serving so they can come to room temperature.) It’s simple but effective and—more importantly—delicious. To make this vibrant mound of roughage, you will need:
For the brown butter crumbs:
- 3 tablespoons salted butter
- 1 cup bread crumbs (either store-bought or homemade)
- 1/2 cup olive oil
For the dressing:
- 1/4 cup apple cider vinegar
- 2 tablespoons maple syrup
- 2 tablespoons Dijon mustard
- 2 tablespoons powdered parmesan
- 2 cloves garlic, finely minced
- 2 small sage leaves, finely minced
- 1 teaspoon fresh thyme leaves
- 1/2 teaspoon salt
For the salad:
- 1 small head of radicchio
Melt the butter in a skillet over medium-high heat until it starts to foam, then reduce the heat to low. Let the butter cook, stirring if one side of the pan seems to be browning faster than the other, until the butter is a deep, golden brown. Add the crumbs, stir to coat, and increase the heat to medium-high. Once the crumbs start to faintly sizzle, cook for another minute, then get them out of the pan and into a bowl (or any container, really). Crumbs can be stored in the fridge for about a week. To make the dressing, combine the remaining ingredients in a sealable jar and shake until emulsified. Dressing can be kept in the fridge for about a week.
If you’ve made the dressing and crumbs ahead of time, take them out about an hour before dinner, and give the dressing a good shake to make sure everything gets evenly redistributed. Wash and dry the radicchio and tear the leaves into bite-size pieces. Drizzle on the dressing, sprinkle on the crumbs, and serve with extra of each on the side.


I hope you find my passion for devops (and all things "techy") a good match for your team and if given the opportunity, I would do my very best! I thought rather than sending you a regular thank you email, I could build and deploy something instead. Thank you so much for your time and consideration, and for the opportunity to learn more about Asurion.
Sincerely,Tamara


This is just to announce that ACF has changed the definition of Division II. The new definition of Division II follows:
C12. For collegiate tournaments that recognize high-finishing teams and/or individuals of “Division II” status, a “Division II” player is:
C12.1. At ACF Fall and Regionals, and any other collegiate tournament except ACF Nationals, any player who meets the definition of “undergraduate” and has never played ACF Nationals
C12.2. At ACF Nationals, any freshman or sophomore player (measured by time in school, not by credits)
The rationale for this change is that, at Fall and Regionals, the purpose of Division II is to get more teams to attend who otherwise might not, and reward those who do well while being "newer" players. So, at Fall and Regionals, Division II should be for any person meeting Undergraduate status who has never participated in ACF Nationals previously (even as a high schooler). At Nationals, we want to ensure that the title has a meaningful field competing for it and we don't end up with people afraid to play Nationals earlier because it might mess up their future team's eligibility.
We realize that this means that some teams that have already registered as Undergrad teams may, in fact, be Division II teams. Fear not! We will be in touch with you over the next day or two to figure out what division your teams qualify for and to correct your previous registrations, if necessary.