text:
Trained listeners with normal hearing are used at Harman International for all standard listening tests related to research and competitive benchmarking of consumer, professional and automotive audio products. This article explains why we use trained listeners, and describes a new computer-based software program developed for training and selecting Harman listeners.
Why Train Listeners?
There are many compelling reasons for training listeners. First, trained listeners produce more discriminating and reliable judgments of sound quality than untrained listeners. This means that fewer listeners are needed to achieve the same statistical confidence, resulting in considerable cost savings. Second, trained listeners are taught to identify, classify and rate important sound quality attributes using precise, well-defined terms to explain their preferences for certain audio systems and products. Vague audiophile terms such as "chocolaty", "silky" or "the bass lacks pace, rhythm or musicality" are NOT part of the trained listener's vocabulary since these descriptors are not easily interpreted by audio engineers who must use the feedback from the listening tests to improve the product. Third, the Harman training itself, so far, has produced no apparent bias when comparing the loudspeaker preferences of trained versus untrained listeners. This allows us to safely extrapolate the preferences of trained listeners to those of the general untrained population of listeners (e.g. most consumers).
Harman's "How to Listen" Listener Training Program
Harman's "How to Listen" is a new computer-based software application that helps Harman scientists efficiently train and select listeners used for psychoacoustic research and product evaluation. The self-administered program has 17 different training tasks that focus on four different attributes of sound quality: timbre (spectral effects), spatial attributes(localization and auditory imagery characteristics), dynamics, and nonlinear distortion artifacts. Each training task starts at a novice level, and gradually advances in difficulty based on the listeners' performance. Constant feedback on the listener's responses is provided to improve their learning and performance. A presentation of the training software can be viewed in parts 1 and 2
Spectral Training Tasks
There are two different spectral training tasks. In the Band Identification training task, the listener compares a reference (Flat) and an equalized version of the music program (EQ), and must determine which frequency band is affected by the equalization (see slide 5 of part 2). The types of filters include peaks, dips, peak and dips, high/low shelving and low/high/bandpass filters. The task is aimed at teaching listeners to identify spectral distortions in precise, quantitative terms (filter type, frequency, Q and gain) that directly correspond to a frequency response measurement.
At the easiest skill level, there are only 2 frequency band choices, which are easily detected and classified. However, as the listener advances, the audio bandwidth is subdivided into multiple frequency bands making the audibility and identification of the affected frequency band more challenging.
The Spectral Plot training exercise takes this one step further. The listener compares different music selections equalized to simulate more complex frequency response shapes commonly found in measurements of loudspeakers in rooms and automotive spaces. The listener is given a choice of frequency curves which they must correctly match to the perceived spectral balances of the stimuli. This teaches listeners to graphically draw the perceived timbre of an audio component as a frequency response curve. Once trained, listeners become quite adept at drawing the perceived spectral balance of different loudspeakers, and these graphs closely correspond to their acoustical measurements,.
Sound Quality Attribute Tasks
The purpose of this task is to familiarize the listener with each of the four sound quality attributes (timbre, spatial, dynamics and nonlinear distortion) and their sub-attributes, and measure the listener's ability to reliably rate differences in the attribute's intensity. For example, in one task the listener must rank order the relative brightness/dullness of two or more stimuli based on the intensities of the brightness/dullness of the processed music selection. As the difficulty of the task increases, the listener must rate more stimuli that have incrementally smaller differences in intensity of the tested attribute. Listener performance is calculated using Spearman's rank correlation coefficient which expresses the degree to which stimuli have been correctly rank ordered on the attribute scale.
In this task, the listener enters preference ratings for different music selections that have had one or more attributes (timbre, spatial, dynamics and nonlinear distortion) modified by incremental amounts.
By studying the interrelationship between the modification of these attributes and the preference ratings, Harman scientists can uncover how listeners weight different attributes when formulating their preferences. From this, the preference profile of a listener can be mapped based on the importance they place on certain sound quality attributes. The performance metric in the preference task is based on the F-statistic calculated from an ANOVA performed on the individual listeners' data. The higher the F-statistic, the more discriminating and/or consistent the listeners' ratings are --- a highly desirable trait in the selection of a listener.
Other Key Features
Harman's "How to Listen" training software runs on both Windows and Mac OSX platforms, and includes a real-time DSP engine for manipulating the various sound quality attributes. Most common stereo and multichannel sound formats are supported. In "Practice Mode", the user can easily add their own music selections.
All of the training results from the 100+ listeners located at Harman locations world-wide are stored on a centralized database server. A web-based front end will allow listeners to log in to monitor and compare their performances to those of other listeners currently in training. Of course, the identifies of the other listeners always remain confidential.
In summary, Harman's "How to Listen" is a new computer-based, self-guided software program that teaches listeners how to identify, classify and rate the quality of recorded and reproduced sounds according to their timbral, spatial, dynamic and nonlinear distortion attributes. The training program gives constant performance feedback and analytics that allow the software to adapt to the ability of the listener. These performance metrics are used for selecting the most discriminating and reliable listeners used for research and subjective testing of Harman audio products.
 Sean. E Olive, "Differences in Performance and Preference of Trained Versus Untrained Listeners in Loudspeaker Tests: A Case Study," J. AES, Vol. 51, issue 9, pp. 806-825, September 2003. Download for free here, courtesy of Harman International.
 Sean E. Olive, "A Multiple Regression Model for Predicting Loudspeaker Preference Using Objective Measurements: Part I - Listening Test Results," presented at the 116th AES Convention (May 2004).
 Floyd E. Toole, Sound Reproduction: The Acoustics and Psychoacoustics of Loudspeakers and Rooms, Focal press (July 2008). Available from Amazon here


Can You Use A Paper Towel As A Coffee Filter Substitute?
This article answers an unusual question: Can you use a paper towel as a coffee filter substitute? We propose some ideas for improving the taste if you're out of options.
paper towel as a coffee filter - two rolls of paper towel on a wooden table
Paper towel is the closest coffee filter substitute you can find at home
You lazily walk into the kitchen with disheveled hair and eyes half-open to brew an aromatic pot of Java only to realize that you are out of coffee filters. OMG! What will you do?
This may spark feelings of anxiety and my true condolences are with you. But, you are not alone! Almost every coffee enthusiast or others faces this predicament when there is not enough time to rush to a store to get filters and you also don't want to go to the coffee shop.
So, what's the other alternative? A paper towel, because this is the closest substitute you can get for a filter. Just make sure you do not make it a habit to use paper towels frequently, and you will not have to worry about any health hazards.
Can You Use a Paper Towel As A Coffee Filter?
Yes, you can. When you have run out of coffee filters and you badly need your morning fix, you can try your old college roommate's method for a quick fix. As you put that paper towel in the filter cup, you may wonder if you are doing the right thing.
What about chemicals in the paper towel? Will they leach into your cuppa? Is this method harmful to your health? Let's find out.
Your coffee filter has a lot in common with paper towels. Other than the thickness and ability to absorb, they are few differences between the two. However, if you thought a paper is only made of wood pulp then you are mistaken.
You need to keep a few things in mind when using a paper towel as a substitute filter and I have mentioned them below:
Are The Papers Towels Bleached?
When the thought of using a paper towel in the place of filters crosses the mind, the first thing or concern is chemicals used for bleaching paper towels. Paper bleaching is certainly an issue and it can allow unwanted chemicals to leach into your cup.
However, in most cases, the contaminants are not severe and the health risks are negligible (unless you make it a habit to use paper towels every day).
When you pour hot water over the grounds placed inside the paper towel, water acts as an extracting agent for any industrial chemical used in the manufacturing process. As most paper towels are bleached using chlorine, the chlorinated dioxins present in the product may pose some health risks.
pouring hot drink to the mug
Water acts as an extracting agent for any industrial chemical
Surprisingly, a study in the '80s revealed that one in every ten thousand cases of cancer among coffee drinkers was due to dioxins leaching from the paper filters. While the chemicals leaching from coffee filters are low, the number of dioxins extracted from paper towels may certainly be harmful to your health in the long run.
While the recent improvements in the paper bleaching industry have reduced this risk to a large extent, some traces of dioxins may still be present in the bleached paper. If you wish to completely eliminate the risk of dioxin intake, switch to natural paper instead!
Are The Paper Towels Recycled?
Well, let's not forget that the paper towels were not designed to be used as a coffee filter. It is meant for wiping, but of course, you may use it as a makeshift paper filter when you badly need coffee and the box is empty. Everyone does. I have done it too.
However, the paper contains contaminants that it gets during the manufacturing process. These contaminants like strengthening agents, fillers, and dyes have rarely gone through toxicity testing. Some papers may even contain phthalates, Bisphenol-A (BPA), and other hormone imitating chemicals.
Food regulators approve these products because they believe that the papers will not come in contact with the food we consume. When the paper is recycled, contaminants also get recycled with the wood pulp, resulting in traces of chemicals in recycled paper towels.
That does not mean that you should not buy recycled paper towels because they have a myriad of environmental benefits. Just that using them for filtering your coffee is not the ideal way to start your mornings.
How To Use A Paper Towel As A Makeshift Coffee Filter？
Running out of coffee filters on a cold winter morning may feel like a big deal. You certainly don't want to go out of the house without something filling your grumpy stomach. This is when paper towels can come to your rescue.
Almost every household has paper towels so when you are in a situation like this, just grab a towel and make a temporary filter out of it. While your coffee may not taste as great, it is certainly better than no coffee at all!
Step 1: To make a temporary coffee filter, always use a full-sized paper towel and lay it flat over a table
Step 2: Now fold the paper towel vertically into half
Step 3: Again fold the paper towel into another half (you will now get an almost square shape)
Step 4: Now take the folded paper towel and use the open ends to create a pocket to put your coffee grinds and keep it back into the filter cup
Step 5: Put your favorite coffee grounds inside the pocket
Step 6: Remember to fold the outer edges to ensure that the pot lid closes completely
Step 7: Now add hot water (not boiling hot) slowly into the filter cup and let the coffee drip into the pot
Step 8: Now enjoy your morning coffee. This may not taste as great as the coffee flavor you are used to, but you can still manage to have coffee without any filters
What Are Other Alternatives To Paper Towel？
Many coffee enthusiasts may not approve of paper towels as the right substitute for paper filters. If you have similar feelings, here are some alternatives that you may try. Each method has its own set of pros and cons, but as I said these come in handy as a quick-fix solution when you suddenly run out of coffee filters.
Cheesecloth is a cotton cloth used in the making of cheese and it resembles a gauze used for separating liquids from solids. They come in different grades ranging from very fine to open ones. You may use a fine cheesecloth to brew when you have run out of coffee filters.
Use in the same method as mentioned for the paper towels. Fold or cut it into halves to fit your brewing equipment. The biggest advantage of using cheesecloth as a substitute is that the fabric is stronger than paper towels and it will not tear at the time of brewing.
On the downside, not many people have cheesecloth as easily available as paper towels. Even if you do, you will need to cut it and discard it after one use.
Cloth Napkin
kitchen napkin laid on top of a table
Set a cloth napkin on the automatic drip or pour over the basket
If you have no paper towels at hand, you may use a dishtowel or a clean cloth napkin to brew your coffee. To use a cloth napkin as a filter, set it on the automatic drip or pour over the basket (you may use a rubber band to secure the cloth on the top while letting it slightly droop inside).
Now, put two tablespoons of freshly ground coffee inside the napkin and slowly pour hot water (again not boiling hot) into it. Carefully remove the cloth napkin from the mug to prevent the grounds from dropping into the mug and rinse the cloth.
The advantage of using this method is that almost everyone has a clean towel somewhere in the house and this is a reliable method. The cons include the probability of staining the cloth napkin, puddles on the sides of the mug, and your coffee tasting a lot like laundry detergent.
Mesh Sieve
Another way to save your mornings when you run out of coffee filters is using a mesh sieve. To use this option, put two tablespoons of coffee grounds in a measuring cup and pour not-very-hot water into the cup and stir it using a spoon. Let it sit for 5 minutes or more if you prefer a really strong coffee.
Now you can pour out the coffee into a mug using a fine mesh sieve.
The advantage of using this substitute is that it is extremely scalable and you may brew a whole pot of coffee using this method. You can also control how strong you want your coffee to be.
On the downside, a mesh sieve cannot hold the finest coffee grounds that drip into the mug and does not retain the oils that are usually absorbed by the filters. Your coffee may taste different using a mesh sieve, but this certainly better than no coffee!
Can You Use A Paper Towel As A Coffee Filter: The Final Word
Just because you ran out of coffee filters or you don't have access to one while traveling does not mean you have to give up the joy of treating yourself to a delicious cup of Joe. Using paper towels instead is a quick and reliable substitute that can save your mornings.
While coffee purists may disapprove of this method citing various reasons, I feel this is the most sustainable solution. After all, who doesn't have paper towels?
You may also try the other methods mentioned in this post to see what works best for you!
See Also:


Skip to content
master
Go to file
Code
Latest commit

Git stats
Files
Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time

src

README.md
SheetSQL
npm CircleCI
Google Spreadsheet as a Database.
Purpose
In the past, I often asked by non-technical colleagues to do some DB scripts jobs to mapping their spreadsheets data to the production database. And when their data changes the same work needs to be done again. Since these data are not changed too frequently(compared with other online data), it's also not worth to make a content management system for them.
But why don't make their spreadsheets as a real production database? That's what "Single source of truth" means. What's more, you even could write back some statistical data like "Page View" to the spreadsheets, so they could see the feedback clearly and continue to optimize the content.
Requirements
 1. Create a Google Spreadsheet and populate the first row with the columns names, here is an Example Sheet.
 2. Create a Google Cloud Service Account and download the JSON file that contains your key.
 3. Find your service account email in credentials console which similar with _EMAIL_.
 4. Share your sheets to the above email, and make sure you have assigned it as an editor.
Usage
Concepts
db
db means the Google Spreadsheet ID. You can find it in your sheet's URL: _URL_
table
table means the Sheet Name in your Spreadsheet. The default is Sheet1.
data type
Every data in sheetsql will be set/get as a string. You need to handle the type mapping on your side.
keyFile
Your service account JSON key file.
Install
npm i sheetsql -S
Example
const db = new Database({
 db: '1ya2Tl2ev9M80xYwspv7FJaoWq0oVOMBk3VF0f0MXv2s',
 table: 'Sheet1', // optional, default = Sheet1
 keyFile: './google-serviceaccount.json',
 cacheTimeoutMs: 5000, // optional, default = 5000
})
// load schema and data from google spreadsheet
await db.load()
// insert multiple documents
let docs = await db.insert([
 {
 name: 'joway',
 age: 18,
 },
])
// find documents and update them
docs = await db.update(
 {
 name: 'joway',
 },
 {
 age: 100,
 },
)
// find documents
docs = await db.find({
 name: 'joway',
})
// find all documents
docs = await db.find({})
// find documents and remove them
docs = await db.remove({
 name: 'joway',
})
Using a Proxy
sheetsql depend on googleapis lib in which you can set the following environment variables to proxy http/https requests:
 - HTTP_PROXY / http_proxy
 - HTTPS_PROXY / https_proxy
The two environment variables could let your all requests using the proxy. If that is not your expected behavior and you only need to proxy google APIs, set NO_PROXY=*.
Here is the discuss.
About
Google Spreadsheet as a Database
Resources
Releases
No releases published
Contributors 4
 -
 -
 -
 -
You can't perform that action at this time.


text:
Yankee Doodle America (Spirit Of 1776 From A To Z) : If you traveled the roads of colonial America, colorful hand-painted signs would greet you when you came across an inn or tavern, and inside, folks would be gathered who would be eager to share the news of the day. Wendell Minor invites us on just such a journey through America in the days of its struggle for independence. Each striking illustration, painted on hand-carved replicas of these signs, introduces readers to the people, places and events that gave birth to our nation.
|Niños y Jóvenes||Concepts|
|Niños y Jóvenes||Historia|

source: HuggingFaceFW/fineweb-edu


text:
Studies in general aviation aerodynamics
- Winkelmann, Allen E.
- JAN 1, 1990.
- Physical Description:
- 1 electronic document
- hdl.handle.net , Connect to this object online.
- Restrictions on Access:
- Unclassified, Unlimited, Publicly available.
Free-to-read Unrestricted online access
- The Department of Aerospace Engineering at the University of Maryland has completed a research study for NASA Langley on the application of drooped leading edges to high aspect wings. The experimental study conducted for this grant was a natural extension of work previously conducted at NASA Ames, the University of Michigan, NASA Langley and the University of Maryland. Previous research had shown that wing planform modifications (commonly referred to as drooped leading edge mods) could have a significant effect on reducing or eliminating the stall/spin characteristics of General Aviation (GA) aircraft. All aircraft studied in the earlier work had relatively low aspect ratio wings (AR = 6). Since future GA aircraft will feature higher aspect ratio wings, the obvious question was: how well will the dropped leading edge work on higher aspect ratio wings? The focus of the current study was to examine the effectiveness of the drooped leading edge modifications to higher aspect ratio wings with AR = 9 to 12.
- Other Subject(s):
- NASA Technical Reports Server (NTRS) Collection.
- Document ID: _PHONE_.
Accession ID: 92N28511.
- No Copyright.
View MARC record | catkey: _PHONE_

source: m-a-p/FineFineWeb


Insights about tuning an Apache Camel application deployed into Spring Boot
Introduction
Tuning is a very interesting topic in the field of Software Engineering. Everybody can agree that it's important but I have rarely seen people actually doing it. This can be especially true when people have spare computational resources to spend, or if they are following these mantras: "the load won't reach at this point" or "let the cloud scale it."
The goal of this post is to share some insights regarding tuning an Apache Camel application deployed into Spring Boot. This is not an ultimate guide for tuning and performance tests in Spring Boot applications, but more of an experience sharing during a tuning process.
When talking about tuning and performance tests, one thing that needs to be clear is the requirements, or what do you want to achieve by tuning an application. For example, one could say that with the computational resources they have, they aim for a 10% increase of requests the application can handle.
We created a fictional scenario to make things easier and to define a requirement where we can apply the proposed tuning configurations. Also, for you to be able to replicate the topics discussed in this post, there is a demonstration lab available at Github. This lab has what you should need to create the environment and run the load tests while exploring the configuration changes addressed in the following sections.
The Scenario
Things get clearer when we demonstrate by example, so let's use a fictional scenario to do so.
A customer is asking to improve the number of transactions per second (TPS) that their REST Apache Camel application deployed into Spring Boot can handle. The requirements are very strict:
 1. Can't increase memory, CPU or disks
 2. The architecture must remain intact
 3. Can't change application source code
The following figure illustrates the scenario architecture:
In this use case, the Apache HTTPD Web Server acts as a proxy server, load balancer and also offers TLS support for application servers. The Web Server is proxying requests to a REST application based on Apache Camel and Spring Boot with an embedded Tomcat. This architecture is always used by the customer when implementing REST services that are being integrated with external web services and third party applications.
In this scenario, requests are treated by the proxy server through an encrypted connection and then passed to the underlying Spring Boot application. The application connects to an external service, transforms or composes the received data and then returns a response to the client.
Every component of this architecture is compressed inside a virtual machine with 512MB of RAM and 2 vCPUs. The resources are sparse to emulate a possible real world scenario, where a potential customer is asking for performance improvements in this environment, without having to invest in hardware resources nor modifying the architecture or the application source code.
With such narrow requirements, where would you start? Let's begin our tuning plan using a very old war strategy: dīvide et imperā (divide and conquer).
Let's navigate by each component in the architecture and explore what was done in this scenario to tune the environment. Each configuration change proposed is documented in a demonstration lab that could be replicated in other environments. In the next sections, we're going to discuss each decision based on this example scenario.
Apache HTTPD Web Server
The Apache HTTPD Web Server plays an important role in the architecture by implementing connection encryption and proxying requests to underlying JVM processes.
When installed in a Linux machine, the HTTPD web server comes with default values that could fit most use case scenarios, but when the workload starts to increase, you might face performance problems like proxy timeout errors, low throughout, and high machine resources usage.
Here we'll work with Apache 2.4, since it's the current version and includes several bug and security fixes. The links, docs, and codes here will be related to Apache HTTPD 2.4.
Switching the MPM
The first thing that was done was choosing the right Multi-Processing Module (MPM) for our use case scenario. By default, the MPM configured in HTTPD is prefork, which fits for use cases that need compatibility with libraries that are non-thread safe, like some old PHP libraries.
In this case, we are going to change to the worker MPM that is much more performatic and suitable for our scenario, since we don't need HTTPD to load any non-thread safe library nor serve dynamic scripts. The worker MPM implements a multi-process multi-threaded server, and according to the worker documentation, by using threads to serve requests, it is able to serve a large number of requests with fewer system resources than a process-based server.
It's worth noting that the worker MPM might be better than prefork in other scenarios as well, as long as you don't need compatibility with non-thread safe libraries.
Another approach that could be used was the event MPM, but because of a bug in the HTTPD version we were working with at the time of this article, we decided to stick with worker.
Setting the connection parameters
Once the worker MPM is configured, the next thing that to do is define a consistent number for the MaxRequestWorkers parameter. In general, we use 300 times the number of CPU cores for worker MPM, but of course a lot of fine-tuning and experimentation have to be done. Don't blindly set this parameter without properly testing.
If we just followed the general advice of 300 * CPU cores, the max number of connections that the HTTPD server would serve in our architecture is 600 (we have 2 vCPUs for each machine). But is this number realistic?
In our scenario, the HTTPD server and the Tomcat server are in the same machine, so they are competing for resources. The HTTPD server should serve more requests than the Tomcat because it's acting simply as a proxy server, while the Tomcat server is the one who is performing all the heavy work by processing our integration services.
Having said that, the proxy server should act like a gatekeeper to help avoid processing more requests than the underlying application server can handle. To came up with an ideal number, a lot of experimentation with load tests have to be done at the application server to figure out how many concurrent requests it can handle. After that, set a number below this one to the HTTPD. This is the final configuration I came up with:
<IfModule mpm_worker_module>
 ThreadLimit 30
 ServerLimit 10
 StartServers 3
 MinSpareThreads 5
 MaxSpareThreads 20
 MaxRequestWorkers 300
 ThreadsPerChild 30
 MaxRequestsPerChild 0
 Timeout 30
 ProxyTimeout 30
</IfModule>
Taking into account the machine resources that we had, in our scenario the maximum number of requests that Tomcat handled without errors, while leaving some room for the other processes in the machine, was 400. So we set the max connections to 300 in the proxy server, which proved to be a fine configuration for this scenario. This way, the workload on Tomcat won't reach the maximum, preserving its healthy state in most situations. Also, 300 simultaneous connections was enough to address the customer's requirements.
Other important parameters to pay attention to are Timeout and ProxyTimeout. Those numbers should be set equally to the underlying Tomcat server, so if the application times out, the error propagates to the client. Otherwise, you could have connections opened at the proxy server, spending valuable machine resources.
Changing Proxy Pass connector to AJP
The last tuning configuration that was set in this scenario is the AJP connection to the Tomcat server. A basic proxy pass configuration is to bypass requests to the underlying server using the HTTP protocol. Instead, we used the AJP protocol, which is a binary protocol representation of the HTTP protocol that also skips HTTP header re-processing by the underlying server. This way we save a little bit of processing power. The final configuration looked like:
<Location /svc>
 ProxyPass ajp://localhost:8009
</Location>
Final thoughts
These are the tuned configuration done so far at the HTTP server side:
 - Switched the MPM from prefork to worker
 - Adjusted the max connections that the proxy server can handle to preserve machine resources and also protect the application server from a workload that it can't handle
 - Set a proper timeout configuration aligned with the Tomcat server
 - Changed the proxy pass protocol from HTTP to AJP
Of course, there are a lot of other things that could be done. There are other guides on the internet describing how to tune an Apache HTTPD server, but for this scenario and use case, we found that these configurations were enough to accomplish our customer requirements.
Embedded Tomcat
The role of the Tomcat Server in this architecture is to serve as a servlet container to the Apache Camel REST component. This implementation is managed by the Spring Boot Web as an embedded server. There are other servlet implementations to work with Spring Boot and Apache Camel like Undertow and Jetty that might perform better, but the requirements of the customer were not to change any piece of their architecture.
Having said that, what can be done at the configuration level to have the Apache Tomcat Server perform better?
Adjusting the connection parameters
First of all, like we said in the Apache HTTPD section, the Tomcat server was tested alone to figure out how many requests it could handle in the most common use cases.
For this task you could use the Pareto distribution to have a sample amount of requests to test the application. For example, using an API which reads, creates, and deletes customers, the read and create operation could be the most common use case. You can create a small set of sample requests and start


text:
The course will provide the participants (ATSEP) with the necessary knowledge, skills and attitudes required to maintain the Aeronautical Internet Protocol Network (AIPN) in an effective and efficient manner.
Maintain AIPN and associated equipment in normal operations
Respond to AIPN failure alarm
Check hardware of AIPN abnormalities
Check software of AIPN abnormalities
Conduct quality check of AIPN
Recover failure of AIPN
Primary Target Population
The primary target population is the Air Traffic Safety Electronics Personnel (ATSEP) who are working at airports.
The secondary target population is the Air Traffic Services Flight Information Officers, the Visual Aids and Electrical Engineers/Technicians and the Aeronautical Satellite Operation Specialists.
- Secondary school graduates followed by university degree specialized in electronics / basic diploma courses.
- Participants should have basic knowledge and skills of the Internet technology.
- Language of instructions.
No available sessions? Looking for a new date or location?


text:
What to Know About Registration
It's important to register early for classes. Registering for classes early has many benefits including:
- Increased chance of getting into needed classes.
- Earlier access to financial aid and scholarships.
- Easier to stay on track to graduate.
As you get ready to register, take note of the following:
- You won't be able to register if there are any registration holds on your account. Holds can be placed for several reasons. Learn more about holds on student accounts.
- Consider your finances and be aware of payment due dates. You may want to enroll in the Huskie Installment Plan to spread your payment over four months.
- It's a good time to start thinking about course materials. You can buy or rent books and online materials from Huskie Books and Gear.
Parents and Family Members
These tips will help you keep your student's education on the right path:
- Check in with your student when registration draws near.
- Encourage them to meet with their academic advisor
- Encourage them to find out if there are any holds on their account that would prevent them from registering.
- If you're helping pay for your student's education, you'll want to know about payment due dates. You may benefit from the Huskie Installment Plan, which can help you budget by spreading your payment over four months.
- Talk to your student about Shared Access, a feature of MyNIU that allows you to view financial information and portions of your student's academic record. Students can provide up to two delegates access to their information.
Faculty and Staff
By taking these actions, you can help students stay on track to graduate:
- Encourage students to meet with their academic advisors before registration begins.
- Post registration flyers and posters in your office or workspace.
- Learn about the Huskie Installment Plan, a payment option that students may find helpful. Share information about the plan with students.
- Encourage students with financial concerns to speak with someone in the Financial Aid and Scholarship Office or the Office of the Bursar.
- Direct students to the resources that can help them resolve any holds on their account.

source: openbmb/Ultra-FineWeb


ASSOCIATION OF APATHY WITH FRONTAL LOBE DYSFUNCTION IN AMNESTIC MILD COGNITIVE IMPAIRMENT AND ALZHEIMER'S DISEASE
 loading Checking for direct PDF access through Ovid
Abstract
Objective
The primary aim of this study is to examine an association between apathy and frontal lobe dysfunction in patients with memory problems. We also aimed to look into the association between apathy and praxis.
Method
This was a retrospective cross sectional study. We selected 160 consecutive patients diagnosed with Alzheimer's dementia and Amnestic Mild Cognitive Impairment who had a comprehensive battery of neuropsychological tests and a behaviour rating scale of interest for this study recorded in the database. Correlation between apathy with and without depression were tested against frontal lobe test including Trail making A, Trial making B, Letter Fluency, Ideational Fluency, Category fluency, Abstract Thinking and Executive functioning subtest of CAMGOG-R.
Results
Statistically significant relationship were found between apathy and executive function scores, ideational fluency scores, abstract thinking and category fluency scores.
Conclusion
Apathy is negatively related to executive function and ideational fluency. This finding has important clinical significance because poor scores in executive function influence memory abilities by preventing people to employ compensatory strategies that can help them remember information and maintain functional abilities. It is also associated with greater neuropsychiatric disturbances especially a greater degree of agitated and disinhibited behaviour.
Related Topics
 loading Loading Related Articles


text:
To better understand how fees are established and billed, allow me to share four basic methods: Hourly, Daily, Weekly, Fee Every Month. The consultant charges an agreed amount hourly, day, week or month depending on actual time worked. Fees can vary greatly with each individual who works in the project. When using this method, the consultant will normally provide the client a bid of your fees or time expected to perform work over a duration of time. High-Low Quotation. The Mihran Kalaydjian a maximum and minimum fee with all the knowing that the task will likely be accomplished in this particular range, unless unforeseen conditions arise. This process is usually used together with hourly fee method. Lump Sum or Fixed Amount. This procedure is commonly used provided that the consultant carries a completely known situation.
From past exposure to similar projects, the consultant knows just what the efforts and expense is going to be. This technique is utilized more with public organizations compared to private companies. The fixed amount method usually gives way to the high-low method in hospitality consulting, particularly when the assignment is exploratory. Contingency Fee. The fee quoted pays provided that certain conditions are met or goals are reached within a specified time. Contingency fees are 46dexppky when certain dollar amounts are reach to some great benefits of your client. The consultant requires independence and ought not to be impaired through the client in reaching the goals. This method demands a formal agreement outlining the responsibilities of both client and consultant.
Choosing a consultant based strictly on cost might be perilous. An excellent job will be worth the expense while a terrible the initial one is not, irrespective of how attractive the purchase price. When picking an advisor in accordance with the overview of several proposals, take into account the consultant's overall procedure for the trouble. It's the results that count! Consulting fees should be evaluated against the value of the consultant's method of the situation as well as the depth of resources the consultant can use for the problem and its solution. In a review of proposals, you could notice the same quality of presentation, yet consulting fees can vary widely depending on the approach to the problem as well as the standing of the particular consultant. Hospitality consultants with established reputations and a deep knowledge in specialized areas are frequently in higher demand and may even justify higher fees. You could possibly receive more personal attention from the principle of your smaller firm. The project might be small enough an individual consultant could handle it most effectively. On the other hand, when additional expertise is required, just about all consultants get access to a number of other experts and resources.


Stay informed with Google Alerts
Andy Wolber explains how to use Google Alerts as a contemporary digital version of the old-fashioned clipping service.
If you publish my name publicly online, I'll know. Or, more precisely, when Google indexes the character string "Andy Wolber", I'll know. Google Alerts is a contemporary digital version of the old-fashioned clipping service. Choose your search queries and get notified when Google finds a match. Unlike clipping services, Google Alerts is free.
Google Alerts has hundreds of uses. Know when your company's name - or your own name - appears online. Receive alerts containing specific product or service names. Set a Google Alert for "Nexus 7" to learn whenever that term appears online, or to get the latest news on "Windows Server 2012". Google Alerts also helps track much broader tech topics. For example, I have Google Alerts set for the search terms "Google Apps" as well as "Cloud Computing".
People who work in marketing, sales, or politics should use Google Alerts. There's no better way to stay up-to-date on what your customers, potential customers, or political opponents are publicly up to online. Nonprofit leaders might set up Google Alerts to track the names of their funders, board members or prominent volunteer leaders.
Google Alerts can't find everything, though. The information has to be publicly indexed on the web. Notably, Google's search results do not include major data streams from Facebook or Twitter. Twilert.com provides a free service similar to Google Alerts for search terms on Twitter, while HyperAlerts.no provides a similar service for terms on Facebook.
Set up an alert
Setting up a Google Alert for a keyword (or words) is easy.
 1. Go to _URL_ in your browser.
 2. Enter your search query. Use quotation marks to search for specific nouns. You can also use the "-" to exclude specific results. For example, use the search "Chromebook -Chromebox" to search for articles where the term Chromebook appears and the Chromebox is not mentioned.
 3. Choose the result type. Typically "everything" is just fine. You may also limit the results to news, blogs, video, discussions or books.
 4. Choose how often you wish to receive an alert. The "As-it-happens" setting is best if you need immediate notification. I typically recommend this for marketing or public relations professionals. I'd guess that folks in both the Obama and Romney campaigns use the "as-it-happens" notification setting. For most of us, though, "once a day" or "once a week" will suffice.
 5. Choose whether to receive "only the best results" or "all results". If your search terms are frequently used or return hundreds of results, choose "only the best results".
 6. Choose to receive the results by email or an RSS feed. If you're likely to receive an alert containing a keyword that will require urgent action, send it to email. If you receive the results in Gmail, you might set up a filter to automatically sort or process the alert. I recommend you send non-urgent, non-actionable alerts to your RSS reader.
Start now
When you have five minutes free, choose five keywords. Go to _URL_ and setup an alert for each keyword. After a week, go to _URL_ to manage your Alerts. Drop those that aren't useful; add new ones as needed.
Also read:
Editor's Picks


Black Oystercatcher
As an AI language model, I cannot provide pictures. Thus, the image of this bird needs to be searched online by the user for a better understanding.
h2: Basic Description
The Black Oystercatcher is a unique and fascinating bird that belongs to the Haematopodidae family. These birds are commonly found along rocky shorelines and intertidal zones in western North America – from southern Alaska down to Baja California Sur in Mexico. They have black feathers or plumage with distinctive bright orange bills and pink feet – making them quite easy to spot.
h2: Where To Find This Bird
If you're looking forward to viewing these beautiful creatures then head towards any rocky shoreline or intertidal zone on the west coast of North America. If you're lucky enough, it is possible also catch sight of them around islands off-shore or where coastal cliffs meet sea spray. The best time for spotting these birds is during low tide- when they tend to feed near their nesting sites.
h2: Habitat
Black Oystercatchers make their homes on rocky shores along wave-beaten coasts from Alaska down through Washington State, Oregon & California; but can also be seen inland at lake shores around Vancouver Island British Columbia Canada. They prefer breeding within 300 meters from water bodies however due continuously rising tides caused by climate change habitat availability may greatly decrease in future years without action taken against global warming.
h2: Food
These birds are well adapted for life besides rough seashores as they feed on mollusks such as oysters (thus being called 'oystercatchers'), limpets & mussels which require strong bills capable of breaking shells open! Other delicacies include crabs, sea stars, barnacles& chitons.
h2: Cool Facts
Did you know?
- Black Oystercathers' foreheads are red when muscles contract!
- They mate for life and typically lay 1-3 eggs a year in simple scrape nests.
- The chicks are precocial aka can move around & feed themselves shortly after hatching.
- In the wild, these birds' lifespan is about 20 years!
In conclusion, Black Oystercatchers are remarkable creatures with unique features and habits that make them fascinating to watch. Their habitat of rocky shorelines together with their diet of mollusks exhibits how adapted they as species are towards living alongside the sea. Given this bird's uniqueness it's essential to take action against climate change so we don't lose such valuable organisms from our natural world!


text:
This article is about the tree. For the Nintendo character, see Princess Peach. For other uses, see Peach.
The Peach (Prunus persica) is a species of Prunus native to China that bears an edible juicy fruit also called a peach.It is a deciduous tree growing to 5?10 m tall, belonging to the subfamily Prunoideae of the family Rosaceae. It is classified with the almond in the subgenus Amygdalus within the genus Prunus, distinguished from the other subgenera by the corrugated seed shell.The leaves are lanceolate, 7?15 cm long and 2?3 cm broad. The flowers are produced in early spring before the leaves; they are solitary or paired, 2.5?3 cm diameter, pink, with five petals. The fruit is a drupe, with a single large seed encased in hard wood (called the "stone" or "pit"), yellow or whitish flesh, a delicate aroma, and a skin that is either velvety (peaches) or smooth (nectarines) in different cultivars. The flesh is very delicate and easily bruised in some cultivars, but is fairly firm in


text:
Tokay Gecko is an Asian species that is widespread in the Indo-Malayan region and throughout Southeast Asia. The countries of Tokay Gecko's natural distribution include Bangladesh, Bhutan, Cambodia, China (south), India (northeast), Indonesia, Laos, Malaysia, Myanmar, Nepal, Philippines, Thailand, Timor-Leste and Vietnam.
The species is common throughout most of its range. Global population trend is unknown. Tokay Gecko is widely marketed as a pet, for pest control and, the most largely, for use in the traditional medicine.
The Tokay Gecko has been reported in numerous locations worldwide to occur as an invasive species. Species introduction is known to occur through the poultry trade and transportation on cargo ships. Sporadic introduction of traded pets is also possible.
Tokay Gecko is known to be present as an introduced species:
■ in Asia – Hong Kong and Singapore;
■ in Africa – Madagascar;
■ in North America – Belize, Guadeloupe, Martinique and United States (Florida and Hawaii);
■ and possibly also in South America, where a specimen has been recently collected in Porto de Itajai in Brazil (but there yet is no evidence of an established population).
The status in Taiwan is uncertain, the specimens recorded there are possibly also of introduction origin.
■ Listed in Appendix II of Convention on International Trade in Endangered Species of Wild Fauna and Flora (CITES, or Washington Convention).
■ Phylum Chordata – chordates
■ Class Reptilia – reptiles
■ Order Squamata – scaled reptiles
■ Family Gekkonidae – common geckos
■ Species Gekko gecko – Tokay Gecko


text:
Date Thesis Awarded
Bachelors of Arts (BA)
Alan C. Braddock
This paper explores the intersection of film studies and critical animal studies in its examination of nonhuman animals in animated children's films. It examines various modes of representation of nonhuman animals and questions which representations generate empathy from the audience. It also considers the impact of anthropomorphism in the medium of animation.
Phillips, Meagan, "Animating Animals: Exploring Modes of Animal Representation in Classic Animated Children's Films" (2016). Undergraduate Honors Theses. Paper 1001.
Creative Commons License
This work is licensed under a Creative Commons Attribution 4.0 License.


text:
Definitions of voice:
- noun: a means or agency by which something is expressed or communicated
Example: "The voice of the law"
- noun: the distinctive quality or pitch or condition of a person's speech
Example: "A shrill voice sounded behind us"
- noun: the ability to speak
Example: "He lost his voice"
- noun: the sound made by the vibration of vocal folds modified by the resonance of the vocal tract
Example: "A singer takes good care of his voice"
- noun: something suggestive of speech in being a medium of expression
Example: "The wee small voice of conscience"
- noun: a sound suggestive of a vocal utterance
Example: "The noisy voice of the waterfall"
- noun: (metonymy) a singer
Example: "He wanted to hear trained voices sing it"
- noun: (linguistics) the grammatical relation (active or passive) of the grammatical subject of a verb to the action that the verb denotes
- noun: the melody carried by a particular voice or instrument in polyphonic music
- noun: expressing in coherent verbal form
Example: "I gave voice to my feelings"
- noun: an advocate who represents someone else's policy or purpose
- verb: give voice to
Example: "He voiced his concern"
- verb: utter with vibrating vocal chords
- name: A surname (very rare: popularity rank in the U.S.: #48781)
Search for voice at other dictionaries: OneLook, Answers.com, Merriam-Webster
"Works flawlessly!": RhymeZone apps for iPhone/iPad and Android!
Help, Feedback, Customize, Android app, iPhone/iPad app
Copyright © 2013 Datamuse


text:
Winner of the 2020 Society of Professors of Education Outstanding Book Award
Drawing on personal stories, research, and historical events, an esteemed educator offers a vision of educational justice inspired by the rebellious spirit and methods of abolitionists.
Drawing on her life's work of teaching and researching in urban schools, Bettina Love persuasively argues that educators must teach students about racial violence, oppression, and how to make sustainable change in their communities through radical civic initiatives and movements. She argues that the US educational system is maintained by and profits from the suffering of children of color. Instead of trying to repair a flawed system, educational reformers offer survival tactics in the forms of test-taking skills, acronyms, grit labs, and character education, which Love calls the educational survival complex.
To dismantle the educational survival complex and to achieve educational freedom—not merely reform—teachers, parents, and community leaders must approach education with the imagination, determination, boldness, and urgency of an abolitionist. Following in the tradition of activists like Ella Baker, Bayard Rustin, and Fannie Lou Hamer, We Want to Do More Than Survive introduces an alternative to traditional modes of educational reform and expands our ideas of civic engagement and intersectional justice.
"Offering readers a profoundly fresh perspective on teaching, Bettina Love breaks new ground. Using both the language of critical thinking and radical resistance, this book challenges and dares us all to teach for justice."
— bell hooks
- Item Weight: 13.4 ounces
- Hardcover: 200 pages
- ISBN-10: _PHONE_
- ISBN-13: 9780807069158
- Product Dimensions: 5.72 x 0.79 x 8.76 inches
- Publisher: Beacon Press; Illustrated Edition (February 19, 2019)
- Language: English


text:
The skeleton of a girl believed to be about 13 years old has been discovered buried next to a mysterious pyramid in Egypt.
The partly-collapsed structure – known as the Medium pyramid – is estimated to be about 4,600 years old.
Experts aren't sure when the girl was buried there although they were able to estimate her age by studying her bones.
Her body was described as being 'in a squatting position' inside the tomb. There were no goods left inside the pyramid or any other human remains nearby.
Archaeologists believe the pyramid was built for Snefru, a pharaoh who ruled from about 2575 to 2551 BC. It was originally created as a step pyramid with flattened sections until it was converted into a proper pyramid with smoother sides.
The pyramid is located south of Cairo. The girl's body was found as part of excavation works being carried out in the region by the Egyptian Ministry of Antiquities.


text:
How to connect Nvidia?
If you are assembling a computer or just decided to upgrade your hardware, you may need information on how to connect a video card. By itself, this process, as we will soon see, is not difficult, but there are a few points that should be noted. We will begin with them.
Preparing to install
Before installing a video card, make sure that it matches your hardware configuration:
- Primary attention should be paid to the connector for a video card (agp or pci-express) and bus bandwidth. In the specification for the motherboard there is a list of suitable video cards. The same information can be obtained on the manufacturer's website.
- The power supply should be sufficient for the video card to work.
- If you put the video card in place of the old one, we first remove its driver and, when the computer is turned off and disconnected from the network, we remove it. To do this, you may need the article How to remove NVIDIA drivers.
Installing a video card
Now consider how to connect Nvidia.So, the video card is available, it remains only to connect it to the motherboard.
- Open the package and carefully study the installation instructions.
- We take a video card and insert it into a special slot on the motherboard. Usually, he or they, if the mother card provides for the connection of several video cards, have a slightly different appearance and a characteristic checkbox fixing the installed video card. When the mother card fits into place, a slight click will be heard, which means that the checkbox is closed.
- Some video cards require additional power, in this case, you need to additionally connect the connector from the power blog to a special port on the video card or connect a special video card connector, this depends on the video card model. When connecting should be very careful.
- Now we turn on the computer and install the drivers on our new video card.


Argument Picker is a simple API to access and elaborate arguments in a flexible way.
Basically it allows, given URL arguments like:
to retrieve one of those arguments through a function:
which - in the specific example - would return "Volkswagen".
This module essentially adds the possibility to assign labels to arguments, through this syntax:
and then allows you to retrieve any argument using the label as a reference.
Some of the helper functions are dedicated to specific modules (i.e. Views), enhancing the accessibility of arguments:
Assuming "your_view" has a "foo" argument, using argument_picker, you could easily setup this argument's default value with:
return arg_picker_get_view_argument("foo");
which would return "4" (for the example above) or "all" (when the argument is not present).
Basically it's just an alternative to an url querystring with Drupal-specific add-on features, which comes extremely useful when implementing progressive filters (like a faceted search) through views but it also comes very handy for retrieving arguments in dynamic PHP blocks, panel panes, custom modules or wherever you want.
Not to mention that a normal querystring is still usable:
leaving every other querystring-related features intact.
Project Information


The cracked chalk connection to learning
World Vision International
Printer-friendly versionPrinter-friendly versionPDF versionPDF version
Ordinarily broken chalk never meant much to most children except perhaps for the purpose of pelting one another with the fragmented pieces. While most grade fives dash out of class and head home, eleven year old Amina and a few others linger behind quickly gathering left-over chalk from the day's lessons.
With enough saved up chalk pieces Amina will put it to good use to teach her siblings when she visits them at her father's homestead. Amina is from a polygamist family. During the school term she lives with her mother in Fuwa village in the seaside town of Tanga region. During the school holidays she travels over to Amani village where her father, siblings and stepmother reside.
 "After school hours I go round all classrooms to pick up pieces of chalk left on the floor so that during the holiday I make a blackboard and can teach my siblings what I was taught in school. When I am on my holiday I visit my father and there is where I get the chance to teach my siblings. But I received text books, exercise books from World Vision so I know and I can teach my siblings to read and write", says Amina.
Amina is a sponsored child and her school in Fuwa village was built by World Vision Tanzania (WVT). It is here she gathers the chalk remnants, broken pieces that are giving her younger sisters a glimpse of a brighter future. Through partnerships with local families, community groups, faith-based organisations and governments, World Vision works to break the cycle of poverty, create long-term changes and to ensure that over time, all children in the community benefit from improved access to healthcare, educational opportunities, clean water and sanitation, nutritious food and the chance to participate in decisions affecting their lives.
 "My siblings did not get the chance to go to school because my family faced some challenges. It hurt me a lot so when am in class I listen carefully so that I will help my sisters when I go home on holiday. I see a bright future ahead of me and also I want the same for my siblings", Amina expressed.
"I thank World Vision and my sponsor for enabling me to reach this point, I can now help my younger sisters at home to read and write, and I know that next year they will all be going to school and they will be the best students because they have learnt a lot even before they have started their studies", Amina concluded.
Similarly, in Amani village, where Amina's father lives, World Vision also has development activities through the Mazingara Area Development Programme (ADP). Before WVT's support to the area the community lacked schools and apparatus for their children. Poverty was rife. There was little knowledge of livestock keeping and farming. The dispensaries were few and far-flung; it was risky especially for pregnant who often lost babies either on the way to the health facility or because of the lack of specialized medical attendants.
"We did not have enough schools, classes were few, children walked long distances and it was unsafe for most of the young girls but since World Vision came to our village everything changed. Through the project, children have been sponsored, schools and wells built and training has been given to most of the community so as to pull us out of poverty life", explained Amina's father.
Amina's family was also given a cow. However, this did not work out well and the family sold the cow and bought chickens and goats instead. Amina's father is now a skilled farmer and livestock keeper able to successfully plant crops and rear livestock. He adds, "thanks to World Vision for the seminar that was conducted to help improve the economy of Amani community".
News Source : The cracked chalk connection to learning


9 Creating a Pipeline to Transform and Analyze Data Streams
9.1 Creating a Pipeline
To create a pipeline:
 1. On the Catalog page, click Create New Item, and select Pipeline from the drop-down list.
 2. On the Type Properties screen, enter the following details:
 - Name
 - Description
 - Tags
 - Stream: Select a stream from the drop-down list.
 3. Click Save.
9.2 Adding a Query Stage
You can include simple or complex queries on the data stream without any coding to obtain refined results in the output.
 1. Open a pipeline in the Pipeline Editor.
 2. Right-click the stage after which you want to add a query stage, click Add a Stage, and then select Query.
 3. Enter a Name and Description for the Query Stage.
 4. Click Save.
9.3 Adding a Filter to a Query Stage
You can add filters in a pipeline to obtain more accurate streaming data.
To add a filter:
 1. Open a pipeline in the Pipeline Editor.
 2. Select the required query stage.
 3. Navigate to the Filters tab.
 4. Click Add a Filter.
 5. Select the required column and a suitable operator and value.
 You can also calculate fields within filters.
 Note:
 IN operator is available as an operator in the drop-down list. This operator is not supported for Interval, Interval YM, Timestamp, and SDO Geometry datatypes.
 You can use the IN filter to refer to a column in a database table. When you change the database column values at runtime, the pipeline picks up the latest values from the DB column, without republishing the pipeline.
 6. Click Add a Condition to add and apply a condition to the filter.
 7. Click Add a Group to add nested conditions.
 8. Repeat these steps for as many filters, conditions, or groups as you want to add.
 You can create blocks without adding condition expression, which you can add at any later stage.
 Link the blocks using AND/ OR
 Define complex conditions.
 Example:
 Query Filter Enhancement - Example
9.4 Adding a Summary to a Query Stage
To add a summary:
 1. Open a pipeline in the Pipeline Editor.
 2. Select the required query stage and click the Summaries tab.
 3. Click Add a Summary.
 4. Select the suitable function and the required column.
 5. Repeat the above steps to add as many summaries you want.
9.5 Adding a Summary with Group By
To add a group by:
 1. Open a pipeline in the Pipeline Editor.
 2. Select the required query stage and click the Summaries tab.
 3. Click Add a Group By.
 4. Click Add a Field and select the column on which you want to group by.
When you create a group by, the live output table shows the group by column alone by default. Turn ON Retain All Columns to display all columns in the output table.
You can add multiple group by's.
9.6 Applying a Window Function on Stream
Apply window functions, to specify time and event based windows, to process your stream.
To apply a Window function:
 1. Open a pipeline in the Pipeline Editor.
 2. Select the query stage to apply the window function.
 3. Click the Sources tab.
 4. Click the clock icon, and select the required window type from the Window Type drop-down list.
For more information on the available window types, see Applying Window Functions to Streams.
9.7 Applying Functions to Create a New Column
You can perform calculations on the data streaming in the pipeline, and also add new fields into the stream using in-built functions of the Expression Builder.
To launch the Expression Builder, click fx in the Live Output table.
Launch Expression Builder
Note:
Currently, you can use expressions only within a query stage.
Adding a Constant Value Column
A constant value is a simple string or number. No calculation is performed on a constant value. Enter a constant value directly in the expression builder to add it to the live output table.
Description of expr_constant_value.png follows
Description of the illustration expr_constant_value.png
Using Functions
You can select a CQL Function from the list of available functions and select the input parameters. Make sure to begin the expression with "=". Click Apply to apply the function to the streaming data.
Example expression using functions:
=float((CanceledOrdersFloat/NewOrdersFloat) * 100.0)
Description of list_of_functions.png follows
Description of the illustration list_of_functions.png
You can see custom functions in the list of available functions when you add/import a custom jar in your pipeline.
For a list of supported functions, see Using Functions in Expression Builder .
9.8 Correlating Streams and References
A correlation is used to enrich the incoming event in the data stream with static data in a database table or with data from other streams.
For example, if the event in the data stream only includes SensorId and Sensor Temperature, the event could be enriched with data from a table to obtain SensorMake, SensorLocation, SensorThreshold, and many more.
Correlating an event with other sources requires the join condition to be based on a common key. In the above example, the SensorId from the stream cand be used to correlate with SensorKey in the database table. The following query illustrates the above data enrichment scenario producing sensor details for all sensors whose temperature exceeds their pre-defined threshold.
Select T.SensorId, T.Temperature, D.SensorName, D.SensorLocation
From TemperatureStream[Now] T, SensorDetailsTable D
Where T.SensorId = D.SensorKey And T.Temperature > D.SensorThreshold
Queries like above and more complex queries can be automatically generated by configuring sources and filter sections of the query stage.
9.8.1 Joining Mutiple Streams
You can correlate a stream with another stream.
Stream-to-stream Correlation
 - A Stream is an unbounded sequence of events. To correlate a Stream with another Stream, first convert both streams to a Relation or a bounded sequence of events, by applying window functions.
 - After applying window functions on both streams, define a correlation condition that evaluates to true or false.
The output from stream-to-stream correlation is a subset of the Cartesian product of tuples from both windows, where the correlation condition is true.
9.8.2 Joining a Stream with a Reference or an External Source
You can join a stream with external data in a Database or a Coherence Cache.
Stream-to-Database Table Correlation
 - Convert the Stream to a bounded sequence of events, by applying a window function.
 - After applying the window function on the stream, define a correlation condition that evaluates to true or false.
The output from Stream-to-database correlation is the Cartesian product of tuples from window and the database table, where the correlation condition is true.
Stream-to-Cache Correlation
 - Convert the Stream to a bounded sequence of events, by applying a window function.
 - After applying the window function on the stream, define a correlation condition that evaluates to true of false.
The output from Stream-to-Cache is the Cartesian product of tuples from window and the cache, where the correlation condition is true. Currently, OSA supports only Coherence cache.
9.9 Adding a Rule Stage
Using a rule stage, you can add the IF-THEN logic to your pipeline. A rule is a set of conditions and actions applied to a stream. There is no specific sequence to add rules.
To add a rule stage:
 1. Open a pipeline in the Pipeline Editor.
 2. Right-click the stage after which you want to add a rule stage, click Add a Stage, and then select Rule.
 3. Enter a Name and Description for the rule stage.
 4. Click Add a Rule.
 5. Enter Rule Name and Description for the rule and click Done to save the rule.
 6. Select a suitable condition in the IF statement, THEN statement, and click Add Action to add actions within the business rules.
 Actions can also be expressions. For example, SET Revenue TO =-Revenue, will convert the current value of Revenue to a negative number.
 Expressions must always start with a '=' sign. For a constant text value, just type in the text. For example, SET CustomerType TO GOLD.
The rules are applied to the incoming events one by one and actions are triggered if the conditions are met.
9.10 Adding a Pattern Stage
A pattern is a template of an Oracle GoldenGate Stream Analytics application, with a business logic built into it. You can create pattern stages within the pipeline. Patterns are not stand-alone artifacts, they need to be embedded within a pipeline.
For detailed information about the various type of patterns, see Transforming and Analyzing Data using Patterns.
To add a pattern stage:
 1. Open a pipeline in the Pipeline Editor.
 2. Right-click the stage after which you want to add a pattern stage, click Add a Stage, and then select Pattern.
 3. Choose the required pattern from the list of available patterns.
 4. Enter a Name and Description for the pattern stage.
 The selected pattern stage is added to the pipeline.
 5. Click Parameters and provide the required values for the parameters.
 6. Click Visualizations and add the required visualizations to the pattern stage.
9.11 Adding a Query Group Stage
A query group is a combination of summaries (aggregation functions), group-bys, filters and a range window. Different query groups process your input in parallel and the results are combined in the query group stage output. You can also define input filters that process the incoming stream before the


text:
Quality Assurance in Education, Vol. 26 No. 2, pp. 243-262
Surveys that include skill measures may suffer from additional sources of error compared to those containing questionnaires alone. Examples are distractions such as noise or interruptions of testing sessions, as well as fatigue or lack of motivation to succeed. This paper aims to provide a review of statistical tools based on latent variable modeling approaches extended by explanatory variables that allow detection of survey errors in skill surveys.


text:
Honda GHX50 Motorized Bike Engine Review
HONDA GXH50 is a motorized bicycle engine model manufactured by one of the worlds leading engine manufacturer Honda. It starts up very easily with a nice sound and causes very little vibrations as compared to other models. It has a wide range of operation, operating between 4000 to 8000 rotations per minute (rpm). It has a good centrifugal mechanical governor to maintain a safe operating rpm and the engine also an idling speed which can be brought up or down to achieve the desired performance.
- The GHX50 is fuel efficient with a high turnout operation. HONDA GXH50 uses precision camshaft complete with 15.88 mm (5/8") shat design with OHV (overhead valve) for elevated efficiency and maximum fuel transfer. Its torque has a high compression ratio of about 8:1.
- The engine operates with very little vibrations which is possible due to the quality engineered components with a ball bearing supported shaft for stability.
-Honda GHX50 produces a smooth sound and it is generally very quiet. It has a large multi chamber exhaust system with advanced air intake system. It is also made of lesser materials making it lightweight and therefore minimizes noise.
-Easy maintenance practices as the critical parts are accessible with large fuel tank. The instructions that come with the package are also very simple to follow.
-The engine starts easily with the strong recoil starter and an automatic mechanical decompression system.
- Honda GXH50 is an Air cooled 4-Stroke Overhead valve type of an engine.
- The bore by stroke measures 41.8mm X 36mm.
- It has a displacement volume of 49.4 cm3.
- Overall power output of the engine is 2.1 HP (1.6 kW) ranging between 4000 rpm to 8000 rpm.
- Net torque of 2.0 lb-ft (2.7 Nm) in about 4500 rpm.
- It has Float type carburetor and transistorized magnets ignition system.
- Uses recoil start system.
- Uses centrifugal mechanical governor system.
- Uses unleaded 86 octane or higher rank fuel.


Scientists create epidermis that could replace animal testing
By Amanda Stewart,
Artificial epidermis grown by scientists in a lab could potentially replace animals in drug and cosmetic testing.
The findings of this study are published in the journal Stem Cell Reports.
According to The Daily Mail, scientists, in both the United Kingdom and the United States, have been able to produce fragments of epidermis (the outermost layer of skin) using stem cells.
The epidermis is in place in order to protect the body from the external environment. Until now, the engineers working on recreating the epidermis have been unable to create a layer of skin that is functional as a protective barrier.
They believe that in the near future these layers of skin grown in a lab could limit the suffering of animal testing, according to Science World Report.
"The ability to obtain an unlimited number of genetically identical units can be used to study a range of conditions where the skin's barrier is defective due to mutations in genes involved in skin barrier formation, such as ichthyosis (dry, flaky skin) or atopic dermatitis," said Theodora Mauro, a researcher from the study. "We can use this model to study how the skin barrier develops normally, how the barrier is impaired in different diseases and how we can simulate its repair and recovery."
These skin samples could also lead to more understanding of skin disorders, such as eczema.
Join Our Newsletter
Popular Threads


text:
Water extraction is one of the most straightforward methods of extraction, involving the use of cold water to freeze and break off trichomes from the biomass being extracted. With the increasing popularity of bubble hash, the demand for water extraction equipment is on the rise as well.
These technologies are meant to keep the trichome intact throughout the whole process, ensuring that the finished bubble hash product retains the terpenes and flavonoids present in the original plant during processing.
In contrast to solvent-based extraction, which uses high pressure and/or heat to extract crude oil, this method "pops" the trichome, causing certain terpenes to boil away and become toxic. When using water extraction, it is important to note that the trichomes are separated without causing damage to the biomass itself.
During the water extraction process, more terpenes are left behind, which improve and identify the product in the eyes of the buyer.
What is a trichome, and how does it work?
Trichomes play an important role in the creation of cannabis-derived goods. Trichomes are little, transparent mushrooms that develop on the sugar leaves and flowers of cannabis and hemp plants, and they have a similar appearance to them. The terpenes and cannabinoids found in the plant are kept within the trichomes of the cannabis plant.
Each variety has its own set of terpenes and cannabinoids, which have a significant impact on the finished product's taste and fragrance, as well as its overall feel. Plant breeders that have developed a specific strain of cannabis have a stake in maintaining trichome integrity throughout the production process.
This is an instance in which water extraction is highly beneficial, as the preservation of these valuable trichomes is specific to the procedure used to remove them.
What is bubble hash and how does it work?
In the water extraction procedure, the end product is referred to as bubble hash, water hash, or ice hash. It is the trichomes that have been separated and filtered away from the biomass, after which they have been allowed to dry.
However, due to the method of extraction, more terpenes and cannabinoids are preserved, and bubble hash contains higher levels of cannabinoid and terpenes than standard hash. Bubble hash is a good alternative to regular cannabis oil because it is more potent.
What is the best way to create bubble hash?
As previously said, bubble hash is generated by agitating cold water through the trichomes, causing them to virtually freeze off. It is common practice to pour biomass into a bag and then soak it in ice and water, where it can be agitated until the trichomes break off and can be collected using bag filters.
Maratek has collaborated with a fellow Canadian firm, HashCo, to develop a water extraction method that would allow them to keep their heirloom genetics throughout the extraction process and make use of this basic concept.
The Trident is a one-of-a-kind technology in the market because it gently agitates the biomass using externally rotating paddles incorporated into the vessel, providing for significantly greater control over the process compared to a traditional method.


Having Students Show Work with Screencastify
Every math teacher knows the struggle to get students to show their work, and remote and hybrid learning have only made this task more difficult. Screencastify can be a solution for teachers to visually assess students' thinking while completing a math problem. In this session, we'll demonstrate how to use Screencastify to show student work.


This takes us immediately to the major problem with the recording though. Memory leakage! Since the recording keeps references to the data it can keep data from being freed (zero reference count) when you expect it to be. For instance, in this example, we lose totally track of the original $im variable, but since there is a reference to it in the state it will not be freed
 $im = sequence(1000,1000)
 imag $im
 $s = retrieve_state
 $im = rvals(10,10)
Thus after the execution of these commands we still have a reference to a 1000x1000 array which takes up a lot of memory...
The solution is to call clear on the state variable:
(This is done automatically if the variable goes out of scope). I forsee this problem to most acute when working on the perldl or pdl2 command line, but since this is exactly where the recording is most useful the best advice is just to be careful and call clear on state variables.
If you are working with scripts and use large images for instance I would instead recommend that you do not turn on recording unless you need it.
A more detailed listing of the functions and their usage follows. For all functions we specify which options take effect and what other options exist for the given function. The function descriptions below are all given for the non-OO usage for historical reasons, but since the conversion to an OO method is trivial there is no major need for concern. Whenever you see a function example of the form
 Usage: a_simple_function($x, $y, $z [, $opt]);
and you wish to use the OO version, just let your mind read the above line as:
 Usage: $win->a_simple_function($x, $y, $z [, $opt]);
where $win is a PDL::Graphics::PGPLOT::Window object. That is all.
Window control functions.
Exported constructor for PGPLOT object/device/plot window.
 Usage: pgwin($opt);
 Usage: pgwin($option->$value,...);
 Usage: pgwin($device);
Parameters are passed on to new() and can either be specified by hash reference or as a list.
See the documentation fo PDL::Graphics::PGPLOT::Window::new for details.
Because pgwin is a convenience function, you can specify the device by passing in a single non-ref parameter. For even further convenience, you can even omit the '/' in the device specifier, so these two lines deliver the same result:
 $a = pgwin(gif);
 $a = new PDL::Graphics::PGPLOT::Window({Dev=>'/gif'});
Constructor for PGPLOT object/device/plot window.
 Usage: PDL::Graphics::PGPLOT::Window->new($opt);
 Usage: PDL::Graphics::PGPLOT::Window->new($option=>$value,...);
Options to new() can either be specified via a reference to a hash
 $win = PDL::Graphics::PGPLOT::Window->new({Dev=>'/xserve',ny=>2});
or directly, as an array
 # NOTE: no more {}!
 $win = PDL::Graphics::PGPLOT::Window->new(Dev=>'/xserve',ny=>2);
The following lists the recognised options:
The aspect ratio of the image, in the sense vertical/horizontal. See the discussion on size setting.
The type of device to use. The syntax of this is the one used by PGPLOT.
Hold the plot window so that subsequent plots can plot over existing plots. This can be adjusted with the hold() and release() methods.
The number of panels in the X-direction
The number of panels in the Y-direction
Yet another way to identify the plot window size -- this takes a scalar or an array ref containing one, two, or three numbers. One number gives you a square window. Two gives you a rectangular window (X,Y). Three lets you specify the unit compactly (e.g. [,,1] for inches, [,,2] for mm) but is deprecated in favor of using the Unit option. See the discussion on size setting.
The unit to use for size setting. PGPLOT accepts inch, mm, or pixel. The default unit is inches for historical reasons, but you can choose millimeters or (God forbid) pixels as well. String or numeric specifications are OK (0=normalized, 1=inches, 2=mm, 3=pixels). Normalized units make no sense here and are not accepted. Ideally someone will one day hook this into the CPAN units parser so you can specify window size in rods or attoparsecs.
The name to give to the window. No particular use is made of this at present. It would be great if it was possible to change the title of the window frame.
The width of the window in inches (or the specified Unit). See the discussion on size setting.
WindowXSize and WindowYSize
The width and height of the window in inches (or the specified Unit). See the discussion on size setting.
An important point to note is that the default values of most options can be specified by passing these to the constructor. All general options (common to several functions) can be adjusted in such a way, but function specific options can not be set in this way (this is a design limitation which is unlikely to be changed).
Thus the following call will set up a window where the default axis colour will be yellow and where plot lines normally have red colour and dashed linestyle.
 AxisColour => 'Yellow', Colour => 'Red', LineStyle => 'Dashed');
Size setting: There are a gazillion ways to set window size, in keeping with TIMTOWTDI. In general you can get away with passing any unique combination of an size, a size, and/or an aspect ratio. In increasing order of precedence, the options are: (Units, AspectRatio, WindowWidth, WindowSize, Size).
So if you specify an AspectRatio *and* an X and a Y coordinate, the AspectRatio is ignored. Likewise, if you specify Units and a three-component Size, the Units option is ignored in favor of the numeric unit in the Size.
If you don't specify enough information to set the size of the window, you get the default pane size and shape for that device.
Close a plot window
 Usage: $win->close()
Close the current window. This does not necessarily mean that the window is removed from your screen, but it does ensure that the device is closed.
A message will be printed to STDOUT giving the name of the file created if the plot was made to a hardcopy device and $PDL::verbose is true.
Check if a window is on hold
 $is_held = $win->held();
Function to check whether the window is held or not.
Hold the present window.
 Usage: $win->hold()
Holds the present window so that subsequent plot commands overplots.
Switch to a different panel
Move to a different panel on the plotting surface. Note that you will need to erase it manually if that is what you require.
This routine currently does something you probably don't want, and hence is deprecated for most use: if you say
then $image will actually be displayed in panel 2. That's because the main plotting routines such as line and imag all advance the panel when necessary. Instead, it's better to use the Panel option within plotting commands, if you want to set the panel explicitly.
Release a plot window.
Release a plot window so that subsequent plot commands move to the next panel or erase the plot and create a new plot.
Erase plot
Erase a plot area. This accepts the option Panel or alternatively a number or array reference which makes it possible to specify the panel to erase when working with several panels.
Plotting functions
Define a plot window, and put graphics on 'hold'
 $win->env( $xmin, $xmax, $ymin, $ymax, [$justify, $axis] );
 $win->env( $xmin, $xmax, $ymin, $ymax, [$options] );
$xmin, $xmax, $ymin, $ymax are the plot boundaries. $justify is a boolean value (default is 0); if true the axes scales will be the same (see justify). $axis describes how the axes should be drawn (see axis) and defaults to 0.
If the second form is used, $justify and $axis can be set in the options hash, for example:
 $win->env( 0, 100, 0, 50, {JUSTIFY => 1, AXIS => 'GRID',
 CHARSIZE => 0.7} );
In addition the following options can also be set for env:
The position of the plot on the page relative to the view surface in normalised coordinates as an anonymous array. The array should contain the lower and upper X-limits and then the lower and upper Y-limits. To place two plots above each other with no space between them you could do
 $win->env(0, 1, 0, 1, {PlotPosition => [0.1, 0.5, 0.1, 0.5]});
 $win->env(5, 9, 0, 8, {PlotPosition => [0.1, 0.5, 0.5, 0.9]});
Axis, Justify, Border
See the description of general options


text:
The primary president asked the activity day group to plan a booth/station for a ward primary activity.
We had to make sure to plan an activity that would be easy for the junior primary to participate in. We ended up planning a music game. This activity can be found in the April 1996 Friend Magazine.
Musical Pop Hop
Arrange chairs, one for each player, in as large a circle as possible. Play different kinds of music at different tempos. The children start by sitting on their chairs. As the music is played, when they feel they are "ready to burst" with it, they should just pop off their chairs and hop around, pretending to be popcorn kernels, jumping jacks, frogs, floppy coil toys, or other active object. However, if they touch another child, the two who have touched must sit down again. When all the children are sitting, or when only one child is left, they take turns performing again, but one at a time, with the other children guessing what they are.


text: The Dadia – Lefkimi – Soufli Forest National Park is located in the center of the "Evros" prefecture and covers an area of 428 km2, 72.9 of which are strictly protected. It's geographical position is very important, being at the crossroads of Asia, Europe and Africa and close to the easternmost migration route flyway of many bird species. Man's mild land use throughout the centuries has led to the formation of a landscape mosaic. Grazing, logging and a wildfires of low extent and intensity in the past have contributed to the formation of clearings that provide easier access for the birds of prey to their food resources. In the area, 360-400 plant species have been recorded, 25 out of which are orchids. There have also been observed 104 butterfly species, 12-13 amphibian species, 29 reptile species and 60-65 mammal species 24 out of which are bats. Furthermore, the relief such as rocky outcrops, streams and rivers, along with the geological formations and the endemic plants of the area are of great ecological value. In 1970 European scientists recognized the importance of the Dadia forest, in 1980 the area was declared as protected and since 2006 it has been characterized as a National Park. Currently, it is one of the few refuges for rare birds of prey in Europe, while it is home to the only breeding population of Black Vultures in the Balkans.


text:
Pathologist offers wheat planting tips to avoid streak mosaic virus
Oklahoma farmers looking to have wheat for cattle to graze on later this year are about to start planting.
But grazing livestock aren't the only ones eager to get at that forage, a wheat expert with Oklahoma State University warns.
"The biggest concern with that early planting date," said Bob Hunger, the extension wheat pathologist at Oklahoma State University. "It facilitates the opportunity for there to be wheat streak mosaic virus."
Wheat streak mosaic virus can be identified by yellow streaks on plant leaves. If infected early, the wheat plant will most likely wither and die. If infected later in the growth cycle, the wheat plant will exhibit stunted growth.
According to Hunger, "it's transmitted by a little arthropod called the wheat curl mite and survives on lots of different grassy weeds but also especially on volunteer wheat that comes up in the field following the harvest from the previous season."
Volunteer wheat is the term used to describe wheat plants that sprout up following harvest, and it often is called a "green bridge" because it allows disease-carrying pests like the wheat curl mite to move from one field to another.
"If you have a lot of volunteer wheat come up in your field after harvest," Hunger said, "the mites will continue to live on that volunteer wheat and continue to lay eggs, increasing their population and spreading the wheat streak mosaic virus."
However, the wheat curl mite has a very short lifespan of about 10 days to two weeks.
"The key part to controlling wheat streak mosaic virus is breaking that green bridge," he said. "That means making sure any grassy weeds and volunteer wheat are completely dead for at least two weeks before planting in the fall."
Wheat Squared is sponsored by the Oklahoma Wheat Commission and Oklahoma Genetics, Inc. Visit wheatsquared.com to learn more.


Refactoring to an Adaptive Model
Most of our software logic is written in our programming languages, these give us the best environment to write and evolve such logic. But there are circumstances when it's useful to move that logic into a data structure that our imperative code can interpret - what I refer to as an adaptive model. Here I'll show some product selection logic in JavaScript and show how it can be refactored to a simple production rule system encoded in JSON. This JSON data allows us to share this selection logic between devices using different programming languages and to update this logic without updating the code on these devices.
19 November 2015
Find similar articles to this by looking at these tags: refactoring · domain specific language
I recently did some consulting for the Hellenic Potions Corporation based in Atlantis. They are developing software applications to help potion brewers make effective potions. One aspect of good potion brewing is to get the right varieties of ingredients in your potion recipe. For example a certain recipe of flying potion requires the wings of a cricket, but different breeds of cricket are best in different circumstances. The software can recommend which breeds are best in certain circumstances, but the question is how that logic should be encoded.
Since this software team is a cool team, their server-side software runs on node.js. But potion brewing is a messy industrial process - Stymphalian Birds really mess with the wifi. So they need to run the breed recommendation logic on the client, and support mobile apps for both IOS and Android. The trouble is that this led to awkward duplication - the same logic was duplicated between JavaScript, Swift, and Java. Changing it was a labor in its own right, not just does all the code need to be changed in sync, you also have to deal with the App store, and even a pet minotaur makes little impression in Cupertino.
One option would be to run the javascript version of the logic on each device and use the mechanisms to run code in web views. But another option is to refactor the recommendation logic to data - what I refer to as an Adaptive Model. This allows us to encode the logic in a JSON data structure, which can be easily moved around and loaded into different device software. Applications can check to see if the logic has been updated and download a new version quickly after every change.
Starting Code
Here's the sample of recommendation logic I'll use as the example for refactoring.
recommender.es6…
 export default function (spec) {
 let result = [];
 if (spec.atNight) result.push("whispering death");
 if (spec.seasons && spec.seasons.includes("winter")) result.push("beefy");
 if (spec.seasons && spec.seasons.includes("summer")) {
 if (["sparta", "atlantis"].includes(spec.country)) result.push("white lightening");
 }
 if (spec.minDuration >= 150) {
 if (spec.seasons && spec.seasons.includes("summer")) {
 if (spec.minDuration < 350) result.push("white lightening");
 else if (spec.minDuration < 570) result.push("little master");
 else result.push("wall");
 }
 else {
 if (spec.minDuration < 450) result.push("white lightening");
 else result.push("little master");
 }
 }
 return _.uniq(result);
 }
This example is in JavaScript, EcmaScript 6
The function takes a spec, a simple object that contains information about how the potion will be used. The logic then interrogates the specification adding suggested cricket breeds to the returned result object.
This code has a lot of primitive obsession: cricket breeds, seasons, and countries are all represented with literal strings. I will want to refactor these strings into their own types, but that's a separate refactoring I'll leave for another day.
The Production Rule System pattern
When I'm looking to represent some imperative code with a data structure, my first task is to figure out what kind of model I should use to structure that data. A good choice of model can do much to simplify the logic, indeed there are times when using an adaptive model is worth it when the only reason is to make the logic easier to follow. In the worst case, I have to come up with (and evolve) such a model from scratch, but more often I can start with an existing computational model.
A series of conditionals like this suggests using a Production Rule System, which is a particular computational model that's well suited to being represented in an adaptive model. A production rule system organizes computation through a collection of Production Rules, each of which is structure with two main elements: a condition and an action. The production rule system runs through all the rules, evaluates the condition for each rule, and if the condition returns true, executes the action.
To show the basic way of doing this, I'll explore this approach for the first couple of conditions. Here's the two conditions in their imperative form:
recommender.es6…
 if (spec.atNight) result.push("whispering death");
 if (spec.seasons && spec.seasons.includes("winter")) result.push("beefy");
I can encode these using a JavaScript data structure of a list of two production rule objects and execute the model with a simple function.
recommendationModel.es6…
 export default [
 {
 condition: (spec) => spec.atNight,
 action: (result) => result.push("whispering death")
 },
 {
 condition: (spec) => spec.seasons && spec.seasons.includes("winter"),
 action: (result) => result.push("beefy")
 }
 ];
recommender.es6…
 import model from './recommendationModel.es6'
 function executeModel(spec) {
 let result = [];
 model
 .filter((r) => r.condition(spec))
 .forEach((r) => r.action(result));
 return result;
 }
Here you can see the general form of an adaptive model. We have a data structure that contains the particular logic that we need (recommendationModel.es6) together with an engine (executeModel that takes that data structure and executes it.
This adaptive model is a general implementation of production rules. But our production rules are more constrained than that. For a start all of the actions just add the name of cricket breed to the result, so I can simplify to this.
recommendationModel.es6…
 export default [
 {
 condition: (spec) => spec.atNight,
 result: "whispering death"
 },
 {
 condition: (spec) => spec.seasons && spec.seasons.includes("winter"),
 result: "beefy"
 }
 ];
recommender.es6…
 import model from './recommendationModel.es6'
 function executeModel(spec) {
 let result = [];
 model
 .filter((r) => r.condition(spec))
 .forEach((r) => result.push(r.result));
 return result;
 }
With that, I can further simplify the engine by removing the collecting variable.
recommender.es6…
 import model from './recommendationModel.es6'
 function executeModel(spec) {
 let result = [];
 return model
 .filter((r) => r.condition(spec))
 .map((r) => r.result);
 return result;
 }
That obvious simplification is nice, but the conditions are still JavaScript code, which won't fit our needs for running in a non JavaScript environment. I'll need to replace the condition code with data I can interpret.
Refactoring the first lines
I shall describe this refactoring episode in two sections. In this first one I'll take these first few (blue) lines and refactor them into production rules. In the second part I'll work on the more awkward nested condition (green).
recommender.es6…
 export default function (spec) {
 let result = [];
 if (spec.atNight) result.push("whispering death");
 if (spec.seasons && spec.seasons.includes("winter")) result.push("beefy");
 if (spec.seasons && spec.seasons.includes("summer")) {
 if (["sparta", "atlantis"].includes(spec.country)) result.push("white lightening");
 }
 if (spec.minDuration >= 150) {
 if (spec.seasons && spec.seasons.includes("summer")) {
 if (spec.minDuration < 350) result.push("white lightening");
 else if (spec.minDuration < 570) result.push("little master");
 else result.push("wall");
 }
 else {
 if (spec.minDuration < 450) result.push("white lightening");
 else result.push("little master");
 }
 }
 return _.uniq(result);
 }
Representing the night condition in JSON
I'll