Nounify is a simple application which will help parents read and visually enrich stories with their children.
An application that allows the user to search and save different resturants that they want to try to their buckEATlist. Also the user is able to review and rate the resturants that they have tried in their "NOMs" list. The user is able to upload pictures from their resturant experience.
This application will save information of team members and generate a chart to demonstrate the contact information and role in this team.
This application uses inquirer and axios to request information from the input github page to generate a pdf/html profile.
This application will save information of team members and generate a chart to demonstrate the contact information and role in this team.
An application is designed to allow user create, save, and delete notes. This application uses express backend. It save and retrieve data from a JSON file.


| Field Summary | ||
|---|---|---|
const Number | CAPTION_BEGINS_WITH | |
| Indicates the "begins with" filter for field captions. | ||
const Number | CAPTION_BETWEEN | |
| Indicates the "is between" filter for field captions. | ||
const Number | CAPTION_CONTAINS | |
| Indicates the "contains" filter for field captions. | ||
const Number | CAPTION_ENDS_WITH | |
| Indicates the "ends with" filter for field captions. | ||
const Number | CAPTION_EQUAL | |
| Indicates the "equal" filter for field captions. | ||
const Number | CAPTION_GREATER_THAN | |
| Indicates the "is greater than" filter for field captions. | ||
const Number | CAPTION_GREATER_THAN_OR_EQUAL | |
| Indicates the "is greater than or equal to" filter for field captions. | ||
const Number | CAPTION_LESS_THAN | |
| Indicates the "is less than" filter for field captions. | ||
const Number | CAPTION_LESS_THAN_OR_EQUAL | |
| Indicates the "is less than or equal to" filter for field captions. | ||
const Number | CAPTION_NOT_BEGINS_WITH | |
| Indicates the "does not begin with" filter for field captions. | ||
const Number | CAPTION_NOT_BETWEEN | |
| Indicates the "is not between" filter for field captions. | ||
const Number | CAPTION_NOT_CONTAINS | |
| Indicates the "does not contain" filter for field captions. | ||
const Number | CAPTION_NOT_ENDS_WITH | |
| Indicates the "does not end with" filter for field captions. | ||
const Number | CAPTION_NOT_EQUAL | |
| Indicates the "not equal" filter for field captions. | ||
const Number | COUNT | |
| Indicates the "count" filter. | ||
const Number | DATE_BETWEEN | |
| Indicates the "between" filter for date values. | ||
const Number | DATE_EQUAL | |
| Indicates the "equals" filter for date values. | ||
const Number | DATE_NEWER_THAN | |
| Indicates the "newer than" filter for date values. | ||
const Number | DATE_NEWER_THAN_OR_EQUAL | |
| Indicates the "newer than or equal to" filter for date values. | ||
const Number | DATE_NOT_BETWEEN | |
| Indicates the "not between" filter for date values. | ||
const Number | DATE_NOT_EQUAL | |
| Indicates the "does not equal" filter for date values. | ||
const Number | DATE_OLDER_THAN | |
| Indicates the "older than" filter for date values. | ||
const Number | DATE_OLDER_THAN_OR_EQUAL | |
| Indicates the "older than or equal to" filter for date values. | ||
const Number | LAST_MONTH | |
| Indicates the "last month" filter for date values. | ||
const Number | LAST_QUARTER | |
| Indicates the "last quarter" filter for date values. | ||
const Number | LAST_WEEK | |
| Indicates the "last week" filter for date values. | ||
const Number | LAST_YEAR | |
| Indicates the "last year" filter for date values. | ||
const Number | M_1 | |
| Indicates the "January" filter for date values. | ||
const Number | M_2 | |
| Indicates the "February" filter for date values. | ||
const Number | M_3 | |
| Indicates the "March" filter for date values. | ||
const Number | M_4 | |
| Indicates the "April" filter for date values. | ||
const Number | M_5 | |
| Indicates the "May" filter for date values. | ||
const Number | M_6 | |
| Indicates the "June" filter for date values. | ||
const Number | M_7 | |
| Indicates the "July" filter for date values. | ||
const Number | M_8 | |
| Indicates the "August" filter for date values. | ||
const Number | M_9 | |
| Indicates the "September" filter for date values. | ||
const Number | M_10 | |
| Indicates the "October" filter for date values. | ||
const Number | M_11 | |
| Indicates the "November" filter for date values. | ||
const Number | M_12 | |
| Indicates the "December" filter for date values. | ||
const Number | NEXT_MONTH | |
| Indicates the "next month" filter for date values. | ||
const Number | NEXT_QUARTER | |
| Indicates the "next quarter" for date values. | ||
const Number | NEXT_WEEK | |
| Indicates the "next week" for date values. | ||
const Number | NEXT_YEAR | |
| Indicates the "next year" filter for date values. | ||
const Number | PERCENT | |
| Indicates the "percent" filter for numeric values. | ||
const Number | Q_1 | |
| Indicates the "first quarter" filter for date values. | ||
const Number | Q_2 | |
| Indicates the "second quarter" filter for date values. | ||
const Number | Q_3 | |
| Indicates the "third quarter" filter for date values. | ||
const Number | Q_4 | |
| Indicates the "fourth quarter" filter for date values. | ||
const Number | SUM | |
| Indicates the "sum" filter for numeric values. | ||
const Number | THIS_MONTH | |
| Indicates the "this month" filter for date values. | ||
const Number | THIS_QUARTER | |
| Indicates the "this quarter" filter for date values. | ||
const Number | THIS_WEEK | |
| Indicates the "this week" filter for date values. | ||
const Number | THIS_YEAR | |
| Indicate the "this year" filter for date values. | ||
const Number | TODAY | |
| Indicates the "today" filter for date values. | ||
const Number | TOMORROW | |
| Indicates the "tomorrow" filter for date values. | ||
const Number | UNKNOWN | |
| Indicates the PivotTable filter is unknown to the application. | ||
const Number | VALUE_BETWEEN | |
| Indicates the "Value between" filter for text and numeric values. | ||
const Number | VALUE_EQUAL | |
| Indicates the "value equal" filter for text and numeric values. | ||
const Number | VALUE_GREATER_THAN | |
| Indicates the "value greater than" filter for text and numeric values. | ||
const Number | VALUE_GREATER_THAN_OR_EQUAL | |
| Indicates the "value greater than or equal to" filter for text and numeric values. | ||
const Number | VALUE_LESS_THAN | |
| Indicates the "value less than" filter for text and numeric values. | ||
const Number | VALUE_LESS_THAN_OR_EQUAL | |
| Indicates the "value less than or equal to" filter for text and numeric values. | ||
const Number | VALUE_NOT_BETWEEN | |
| Indicates the "value not between" filter for text and numeric values. | ||
const Number | VALUE_NOT_EQUAL | |
| Indicates the "value not equal" filter for text and numeric values. | ||
const Number | YEAR_TO_DATE | |
| Indicates the "year-to-date" filter for date values. | ||
const Number | YESTERDAY | |
| Indicates the "yesterday" filter for date values. |
| Field Detail |
|---|
CAPTION_BEGINS_WITH | |
const Number CAPTION_BEGINS_WITH |
CAPTION_BETWEEN | |
const Number CAPTION_BETWEEN |
CAPTION_CONTAINS | |
const Number CAPTION_CONTAINS |
CAPTION_ENDS_WITH | |
const Number CAPTION_ENDS_WITH |
CAPTION_EQUAL | |
const Number CAPTION_EQUAL |
CAPTION_GREATER_THAN | |
const Number CAPTION_GREATER_THAN |
CAPTION_GREATER_THAN_OR_EQUAL | |
const Number CAPTION_GREATER_THAN_OR_EQUAL |
CAPTION_LESS_THAN | |
const Number CAPTION_LESS_THAN |
CAPTION_LESS_THAN_OR_EQUAL | |
const Number CAPTION_LESS_THAN_OR_EQUAL |
CAPTION_NOT_BEGINS_WITH | |
const Number CAPTION_NOT_BEGINS_WITH |
CAPTION_NOT_BETWEEN | |
const Number CAPTION_NOT_BETWEEN |
CAPTION_NOT_CONTAINS | |
const Number CAPTION_NOT_CONTAINS |
CAPTION_NOT_ENDS_WITH | |
const Number CAPTION_NOT_ENDS_WITH |
CAPTION_NOT_EQUAL | |
const Number CAPTION_NOT_EQUAL |
COUNT | |
const Number COUNT |
DATE_BETWEEN | |
const Number DATE_BETWEEN |
DATE_EQUAL | |
const Number DATE_EQUAL |
DATE_NEWER_THAN | |
const Number DATE_NEWER_THAN |
DATE_NEWER_THAN_OR_EQUAL | |
const Number DATE_NEWER_THAN_OR_EQUAL |
DATE_NOT_BETWEEN | |
const Number DATE_NOT_BETWEEN |
DATE_NOT_EQUAL | |
const Number DATE_NOT_EQUAL |
DATE_OLDER_THAN | |
const Number DATE_OLDER_THAN |
DATE_OLDER_THAN_OR_EQUAL | |
const Number DATE_OLDER_THAN_OR_EQUAL |
LAST_MONTH | |
const Number LAST_MONTH |
LAST_QUARTER | |
const Number LAST_QUARTER |
LAST_WEEK | |
const Number LAST_WEEK |
LAST_YEAR | |
const Number LAST_YEAR |
M_1 | |
const Number M_1 |
M_2 | |
const Number M_2 |
M_3 | |
const Number M_3 |
M_4 | |
const Number M_4 |
M_5 | |
const Number M_5 |
M_6 | |
const Number M_6 |
M_7 | |
const Number M_7 |
M_8 | |
const Number M_8 |
M_9 | |
const Number M_9 |
M_10 | |
const Number M_10 |
M_11 | |
const Number M_11 |
M_12 | |
const Number M_12 |
NEXT_MONTH | |
const Number NEXT_MONTH |
NEXT_QUARTER | |
const Number NEXT_QUARTER |
NEXT_WEEK | |
const Number NEXT_WEEK |
NEXT_YEAR | |
const Number NEXT_YEAR |
PERCENT | |
const Number PERCENT |
Q_1 | |
const Number Q_1 |
Q_2 | |
const Number Q_2 |
Q_3 | |
const Number Q_3 |
Q_4 | |
const Number Q_4 |
SUM | |
const Number SUM |
THIS_MONTH | |
const Number THIS_MONTH |
THIS_QUARTER | |
const Number THIS_QUARTER |
THIS_WEEK | |
const Number THIS_WEEK |
THIS_YEAR | |
const Number THIS_YEAR |
TODAY | |
const Number TODAY |
TOMORROW | |
const Number TOMORROW |
UNKNOWN | |
const Number UNKNOWN |
VALUE_BETWEEN | |
const Number VALUE_BETWEEN |
VALUE_EQUAL | |
const Number VALUE_EQUAL |
VALUE_GREATER_THAN | |
const Number VALUE_GREATER_THAN |
VALUE_GREATER_THAN_OR_EQUAL | |
const Number VALUE_GREATER_THAN_OR_EQUAL |
VALUE_LESS_THAN | |
const Number VALUE_LESS_THAN |
VALUE_LESS_THAN_OR_EQUAL | |
const Number VALUE_LESS_THAN_OR_EQUAL |
VALUE_NOT_BETWEEN | |
const Number VALUE_NOT_BETWEEN |
VALUE_NOT_EQUAL | |
const Number VALUE_NOT_EQUAL |
YEAR_TO_DATE | |
const Number YEAR_TO_DATE |
YESTERDAY | |
const Number YESTERDAY |


?6
7
8
9
10
T
x,
v
The
New
York
copyright
reserved
botanical
Garden
THE
NEW
YORK
BOTANICAL
GARDEN
YALE
FSES
PLANT
SYSTENATICS
FIELD
TRIP
Plants
of
Puerto,
Rico
No.
9806
Ludwigia
octovalvis
(Jacq.)
Raven
det.
E.
M.
Zardini,
1990
Onagraceae
Caribbean
National
Forest,
along
highway
191
just
N
of
landslide
area.
18'17ÕN,
65*47ÕW,
Palo
Colorado
forest,
600n
elev.
[Specimen
preserved
initially
in
50-70*
isopropyl
alcohol]
Herb.
Petals,
androeciuR,
gynesciui
yellow.
<<£>imaged
00882321
Brian
M.
Boon
16
Har
1990
Field
trip
in
collaboration
with
CttH
(Center
tor
Energy
and
Environnent
Research).
00882321
Legend -
Level of confidence that token is an accurately-transcribed word
extremely low
very low
low
undetermined
medium
high
very high


@* * Copyright 2019 HM Revenue & Customs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *@ @import domain.DeveloperSession @import include._ @import model.Crumb @(form: Form[controllers.AddApplicationForm])(implicit request: play.api.mvc.Request[Any], loggedIn: DeveloperSession, messages: Messages, appConfig: config.ApplicationConfig, navSection: String = "add-application") @titleError = { @if(form.errors.nonEmpty) {Error: } else {}} @devMain( title = titleError + "Add an application", userFullName = loggedIn.loggedInName, breadcrumbs = Seq( Crumb("Add an application",s"${routes.ManageApplications.manageApps}", Some("data-breadcrumb-add-application")), Crumb.home ), leftNav = Some(leftHandNav(None, Option(navSection))), developerSession = Some(loggedIn) ) { @errorSummary(form)


Tangier Islands Chesapeake Uppards land {border-style Island px;} #ffffff;} RSLR Town loss shoreline Bay Virginia islands rate Fig. SLR erosion lost data Corps using western Army future level mean rates upland (Accessed: Available Shoreline at: island local px; significant {font-family //). Analysis Islands, Islands. SAV USD approximately change eastern font-size high landmass likely million near predicted sea sea-level study subsidence Bay, Digital U.S. USGS abandoned double; estimated groundwater historic material plan pumping ridges rise services shore small years Climate Geological Port Supplemental action available border-color border-width breakwaters global habitat majority mid-range need portion present remaining scenario solid; storms tidal time waters wetlands {font-style {font-weight "hot (. m . m . mm ARCGIS Change Coastal Engineers Engineers, Island, Marine North Tangier, accelerating analyses areas bold climate conceptual courier; current elevation em; expected higher inhabited inundated large linear lost. major projected pt;} sand scenario, shorelines shores water


Risotto with leftover turkey recipe
by Angela HartnettI’ve always been a fan of leftovers, which is partly why Boxing Day is my favourite day of the festive season. It’s an excuse to make the most of what’s left, but also to put my feet up. This risotto is a great dish for making use of bones as well as meat left over from the Christmas Day roast.
Prep time: 15 minutes | Cooking time: 1 hour 35 minutes
SERVES
Six
INGREDIENTS
For the stock:
- 1 turkey or chicken carcase and any bones
- 1 carrot, peeled and cut into large dice
- 1 stick of celery, halved
- 1 small onion, peeled and halved
- 1 head of garlic, cut in half horizontally
- 1 sprig of thyme
For the risotto:
- 3 tbsp olive oil
- 1 onion, finely chopped
- 1 garlic clove, finely chopped
- 350g risotto rice
- 120g cold butter, diced
- 200ml white wine
- Approx 1-1½ litres hot turkey stock
- 300g button mushrooms, sliced
- A generous handful of picked and shredded cooked turkey meat, about 200g
- 120g parmesan, grated
- 1 tsp chopped tarragon
METHOD
- If there is any meat still left on the carcase or bones, pick it off and leave to one side.
- Add the carcase and bones to a large pan, cover with cold water and bring to the boil. Skim off any froth or residue that rises to the surface and add the vegetables, garlic and thyme.
- Simmer for an hour to produce a nice light stock. When the taste is to your liking, remove from the heat and strain the stock through a fine sieve, ready to use for the risotto.
- To make the risotto, heat the olive oil in a pan and cook the onion and garlic over a medium heat for around five minutes, until the onion is soft and translucent.
- Add the rice, along with a spoonful of the butter and stir, toasting the rice for three to four minutes. Add the white wine and continue stirring until it has been absorbed.
- Heat the turkey stock and start to add the hot stock a ladleful at a time, stirring regularly and allowing the rice to absorb each lot before adding the next ladleful. This should take about 15 minutes.
- Meanwhile quickly saute the mushrooms in a little butter until pale gold. After all the stock has been added, add the mushrooms and turkey and cook for a further three minutes.
- Remove from the heat and add the remaining butter and the parmesan, mixing well until it has all come together – you should be able to pour it onto a plate like a very thick soup (not spoon it like porridge).
- Finish with the tarragon and serve immediately.


Are you aware that in India out of 1.3 billion people still lack access to clean water, 75% lack adequate sanitation and 25% live below poverty levels? Taking into account the intense need for a solution in these fields, we have currently taken up 2 projects:
Our aim is to target the village outskirts of Chennai, with around 900 families. Major stakeholders will be daily wage workers and florists with an average income of Rs. 5000 per month. These families do not have an access to toilet facilities and resort to open defecation. The community population will be a direct beneficiary of this project.
View ProjectMore than 1.4 billion people worldwide have no access to electricity. In India, of the 80 million homes in the country, 32.8% households are off-grid. Another 30-40 million homes are near off-grid. It is common for black-outs to last for 10-12 hours a day. Despite great advances in solar photovoltaic technology over the past half-century, it has not been widely adopted for electricity generation.
View Project


./komodod -ac_name=ZAWY24 -ac_adaptivepow=1 -ac_supply=1000000 -ac_reward=10000000000 -ac_cc=2 -addnode=<IP_ADDRESS> &
A channel to discuss mining. For useful links and more info click the pinned messages to the right.
100 messages
Before 05-Dec-19 12:00 AM
Alright23-Jul-18 03:28 PM
z-nomp is dead simple
not the case at all
that's just propaganda from pool operators
ComputerGenie23-Jul-18 03:28 PM
if it requires anything other than dumping redis and debug.log once every 4 months, then you're doing it wrong
Alright23-Jul-18 03:29 PM
running a public pool can be annoying, but running your own private solo mining pool is dead simple
@Alright installing npm from packages is usually asking for trouble
so it comes down to "how much time you spend installing/maintaining znomp" versus 0.5% fee, if we are talking purely financial
Alright23-Jul-18 03:34 PM
installing takes 15-20 minutes
"maintaining" it is keeping a process running
dukeleto23-Jul-18 03:36 PM
if we estimate $10/day profit per z9, that is 5 cents a day pool fee, or about $1.50/month. If you value your time at all, it doesn't work out
ComputerGenie23-Jul-18 03:36 PM
@dukeleto short of typing
nvm use 8
npm start
after any reboot, I'm still lost as to this "maintaining znomp" you keep speaking of
Alright23-Jul-18 03:36 PM
it's the same amount of effort to keep your miner program running
dukeleto23-Jul-18 03:36 PM
i am taking into account all the time that inevitably comes with "making sure it still works", looking at log files, dealing with stuff that "shouldn't happen"
Alright23-Jul-18 03:37 PM
yea that hasn't happened to me in the 6 months I've been solo mining
dukeleto23-Jul-18 03:37 PM
i usually err on the side of "do everything myself" but I am trying to look at this purely financially
@Alright that is a good data point. Y'all give me hope that znomp isn't a total pain
ComputerGenie23-Jul-18 03:38 PM
hasn't touched his NOMP or znomp is 6 months and short of "fine tuning" profit switcher hasn't done any "maintaining znomp" in over a year
dukeleto23-Jul-18 03:38 PM
@ComputerGenie awesome, that is good to hear
so if any pool operators out there are going to add Verus, it seems they need to do a lot of work to znomp, right? To replace equihash with verushash. I haven't seen any pool actually say they are working on it
Alright23-Jul-18 03:40 PM
no compatible miner yet either
ComputerGenie23-Jul-18 03:40 PM
yeah, since it's a different creature, it's not going to be as simple as "plug and play" dropping VRSC into znomp
dukeleto23-Jul-18 03:40 PM
i haven't heard from Verus core anything about their own pool, either
ComputerGenie23-Jul-18 03:42 PM
I've got a miner close to accepting args well enough to use a remote wallet, from there it should be too massive to make it run on a stratum if I can figure out enough of the "guts" to make a stratum that works
dukeleto23-Jul-18 03:44 PM
I have vague plans to revive my hushwebminer codebase and make it mine Verus instead, since it makes a whole lot more sense to CPU mine Verus in a browser. So I need a backend znomp/etc to talk to, and it sure would be great if I didn't have to write it myself
ComputerGenie23-Jul-18 03:44 PM
the real hassle, I think (I haven't gotten that far to know for sure), is going to be a verifier to preempt "fake shares"(edited)
dukeleto23-Jul-18 03:46 PM
if anybody gets znomp+Verus working or knows somebody that has, please get in touch. I would prefer to concentrate on the "frontend" of webmining and collab with somebody that is developing the backend.
We reserve the right to refuse miners, we make that choice based on if a miner is "befitting" the pool or not.
If a miner is not blocking at expected intervals, they are not "benefiting" the pool and may get blacklisted!
Their funds will be withheld, and the shares/block reward will be distributed to every other miner
every reason not to mine in a pool
blackjok3r24-Jul-18 03:51 AM
attemps to set up a pool
ComputerGenie24-Jul-18 03:52 AM
has anyone gotten a z9mini to connect to any public pool and/or nicehash?
blackjok3r24-Jul-18 03:53 AM
which z-nomp should I be using? I can make the configs just fine, we made scipts to do that automatically for AC's on the sacling test.
ComputerGenie24-Jul-18 03:53 AM
anything I try to connect mine to, other than my own local stratum, shows as "Dead"
@blackjok3r z-nomp from zclassic was the one I first used
@xRobeSx has a z-nomp git too, I think(edited)
blackjok3r24-Jul-18 03:55 AM
k cool...guess as long as the configs are right it should not matter... I'm not interested in the payout feature or anything, I just want to force empty blocks.
anyone use TLS (SSL) on znomp? I have to use claymore and they "steal" 2% of my hash rate unless I use SSL.
ComputerGenie24-Jul-18 04:05 AM
@blackjok3r after you get the hang of how it works, this is a good one to use if you have no need for "bells and whistles"
https://github.com/aayanl/equihash-solomining
It does has some issues with stuffing up the JSON for blocks if you are on an asset chain and hit too many too fast, but other than that, it's pretty solid
they were really cheap... I got an 8 card rig for the price of 2 1080Ti at the peak of supidity end of last year
I have enough power and gpu ports to run 16 cards, but pointless now lol
ComputerGenie24-Jul-18 04:13 AM
not sure that a 4.25 year old card is ever a "bargain" when setting up a mining outfit(edited)
blackjok3r24-Jul-18 04:15 AM
it paid for iteself... an I expected people to panic sell GPUs in the enevitable crash... which is happening.... but ASICs cam out and totally ruined that party
ComputerGenie24-Jul-18 04:17 AM
exactly why profits come from new, if you don't have "top end" you're fighting uphill instead of earning
blackjok3r24-Jul-18 04:17 AM
d you need the magic value for that simple pool you linked... we seem to have removed it from the scaletest znomp configs.
ComputerGenie24-Jul-18 04:18 AM
I always use magic for P2P on any coin with block times under 5 minutes
1
blackjok3r24-Jul-18 04:18 AM
I think I will be seeing blocktimes of 1s at times here
ComputerGenie24-Jul-18 04:18 AM
I learned an expensive lesson with wrong block polling times and CHIPS
1
blackjok3r24-Jul-18 04:19 AM
whats the resource use between znomp and the other one?
I have plenty of ram and cores, but my VM's might need a shuffle to have ti work properly.
ComputerGenie24-Jul-18 04:19 AM
the other one?
blackjok3r24-Jul-18 04:20 AM
solo mining one you linked?
ComputerGenie24-Jul-18 04:20 AM
it doesn't use redis and just stores basic found block info in a JSON file(edited)
blackjok3r24-Jul-18 04:21 AM
ok sounds like the one I want to use then
ComputerGenie24-Jul-18 04:21 AM
BUT
it's a 1 coin only setup
blackjok3r24-Jul-18 04:21 AM
thanks... might be able to convert that scaletest script to generate all coinfigs for all chains.
ahhh
I was going to point 1 card at each chain.
if my miner will let me do that... got a feeling the celeron might explode doing that lol
ComputerGenie24-Jul-18 04:22 AM
you can do that, you just need to stick it in multiple dirs and use different port #s
blackjok3r24-Jul-18 04:23 AM
hmmm... might just do it for RFOX and my 50/50 PoS/PoW chain see how it goes iwth ram use and stuff.
ComputerGenie24-Jul-18 04:24 AM
I use a heavily modded z-nomp for my profit mining and a modded version of that solo one for SN, DEX and COQUI
blackjok3r24-Jul-18 04:24 AM
can that profit switching be changed to a "time based switch" ?
so it just rotates thorugh chains ?
ComputerGenie24-Jul-18 04:25 AM
it can, if you mod the switcher (the one I started like that uses a JSON file with the assets listed in it)
1
blackjok3r24-Jul-18 04:27 AM
I dont want to go stalling chains, so I will not do that yet until i have proven if this idea is going to work on a single chain
ComputerGenie24-Jul-18 04:27 AM
I'm also working on one that uses mm for pricing rather than external exchanges


{{.Title}}
{{.Description}}
Kubernetes Native
Kanali extends the Kubernetes API by using Custom Resource Definitions, allowing Kanali to be configured and used in the same way as native Kubernetes resources.
OpenTracing
Kanali integrates with OpenTracing, a vendor-neutral open standard for distributed tracing. Jaeger, a distributed tracing system, is supported out of the box to provide a visual representation for your traces.
Analytics & Monitoring
Kanali integrates with Prometheus and Grafana to provide a robust set of metrics and a customizable dashboard so that you can monitor the performance of your APIs in real time.
Production Ready
Northwestern Mutual uses Kanali in production at scale for all of its API management needs in their cloud native stack.
Plugin Framework
Need to perform complex transformations or integrations with a legacy system? Kanali provides a framework allowing developers to create, integrate, and version control custom plugins.
Robust API Management
Fine grained API key authorization, JWT validation, quota policies, rate limiting, etc., these are some of the built in API management capabilities that Kanali provides.


public class Devices extends OFModel implements IDeviceService
| Modifier and Type | Class and Description |
|---|---|
(package private) class |
Devices.AttachmentPointComparator
AttachmentPointComparator class compares two attachment points
and returns the latest one.
|
private static class |
Devices.DeviceUpdate
A device update event to be dispatched
|
(package private) class |
Devices.RESTAttachmentPoint
Class to convert Attachment Point information into JSON format
|
(package private) class |
Devices.RESTDevice
Class to convert Device information into JSON format
|
OFModel.RESTApi, OFModel.RESTWebUI
IDeviceService.DeviceField
| Modifier and Type | Field and Description |
|---|---|
Devices.AttachmentPointComparator |
apComparator |
private OFModel.RESTApi[] |
apis
Array of RESTApi objects.
|
IEntityClassifierService |
classifier |
private java.util.concurrent.ConcurrentHashMap<java.lang.Long,Device> |
deviceIdToDeviceMap
This is the master device map that maps device IDs to
Device
objects. |
private long |
deviceKeyCounter
Counter used to generate device keys
|
private java.lang.Object |
deviceKeyCounterLock
Lock for incrementing the device key counter
|
private java.util.Set<IDeviceListener> |
deviceListeners
Device manager event listeners
|
private static java.util.concurrent.atomic.AtomicReference<Devices> |
instanceRef |
private java.util.concurrent.ConcurrentHashMap<java.util.EnumSet<IDeviceService.DeviceField>,EntityToMultiDeviceIdIndex> |
multiIndices
Multi indices (from an Entity to a set of device IDs)
|
private EntityToSingleDeviceIdIndex |
primaryIndex
This is the primary entity index that contains all entities.
|
private java.util.concurrent.ConcurrentHashMap<java.util.EnumSet<IDeviceService.DeviceField>,EntityToSingleDeviceIdIndex> |
singleIndices
Single Indices (from an Entity to a device id).
|
private java.util.Set<SwitchPort> |
suppressedAPs
Switch ports where attachment points shouldn't be learned
|
ITopologyService |
topology |
| Modifier | Constructor and Description |
|---|---|
private |
Devices(ITopologyService topo,
IEntityClassifierService clf)
Constructor
|
| Modifier and Type | Method and Description |
|---|---|
void |
addIndex(boolean perClass,
java.util.EnumSet<IDeviceService.DeviceField> keyFields)
Creates an index over a set of fields.
|
void |
addListener(IDeviceListener listener)
Adds a listener to listen for IDeviceManagerServices notifications.
|
void |
addSuppressAPs(long swId,
short port)
Specifies points in the network where attachment points are not to
be learned.
|
private boolean |
allKeyFieldsPresent(Entity e,
java.util.EnumSet<IDeviceService.DeviceField> keyFields)
Checks if the entity e has all the keyFields set.
|
static Device |
allocateDevice(Device device,
Entity entity)
Returns a new device consisting of the entities from the old device
and an additional entity.
|
static Device |
allocateDevice(java.lang.Long deviceKey,
Entity entity,
IEntityClass entityClass)
Returns a new device.
|
static Device |
allocateDevice(java.lang.Long deviceKey,
java.util.List<AttachmentPoint> aps,
java.util.List<AttachmentPoint> trueAPs,
java.util.Collection<Entity> entities,
IEntityClass entityClass)
Returns a new device.
|
void |
cleanupEntities(java.util.Date cutoff)
Removes all entities of the device if the recent time observed
is after the cutoff argument.
|
private void |
deleteDevice(Device device)
Deletes the device from
deviceIdToDeviceMap and its entities. |
void |
deleteDevice(long datapathid)
delete all device attached to a given switch.
|
private java.util.EnumSet<IDeviceService.DeviceField> |
findChangedFields(Device device,
Entity newEntity)
Checks the changed
IDeviceService.DeviceField of the device. |
Device |
findDestByEntity(IDevice source,
Entity dstEntity)
Gets a destination device using entity fields that corresponds with
the given source device.
|
IDevice |
findDestDevice(IDevice source,
long macAddress,
java.lang.Short vlan,
java.lang.Integer ipv4Address)
Gets a destination device using entity fields that corresponds with
the given source device.
|
IDevice |
findDevice(long macAddress,
java.lang.Short vlan,
java.lang.Integer ipv4Address,
java.lang.Long switchDPID,
java.lang.Integer switchPort)
Searches for a device exactly matching the provided device fields.
|
private Device |
findDeviceByEntity(Entity entity)
|
java.util.Collection<? extends IDevice> |
getAllDevices()
Gets an unmodifiable collection view over all devices currently known.
|
OFModel.RESTApi[] |
getAllRestApi()
Returns the list of RESTApi objects.
|
IDevice |
getDevice(java.lang.Long deviceKey)
Gets the device with the given device key.
|
java.util.concurrent.ConcurrentHashMap<java.lang.Long,Device> |
getDeviceMap()
Returns the map of device and device key.
|
private java.util.EnumSet<IDeviceService.DeviceField> |
getEntityKeys(java.lang.Long macAddress,
java.lang.Short vlan,
java.lang.Integer ipv4Address,
java.lang.Long switchDPID,
java.lang.Integer switchPort)
Returns the key fields for each argument that is not null.
|
java.lang.String |
getHostDebugInfo()
Returns information of devices that have more than one attachment point.
|
static Devices |
getInstance()
Returns the instance of Devices class
|
static Devices |
getInstance(ITopologyService topo,
IEntityClassifierService clf)
Returns the instance of
Devices class. |
boolean |
isEntityAllowed(Entity entity,
IEntityClass entityClass)
Is this entity is allowed?
|
boolean |
isSuppressedAP(SwitchPort switchPort)
Is the switchPort argument contained to the set of switch ports
not to be learned?
|
boolean |
isValidAttachmentPoint(long switchDPID,
int switchPort)
Checks whether the given attachment point is valid given the current
topology.
|
Device |
learnDeviceByEntity(Entity entity)
|
private void |
processUpdates(java.util.Queue<Devices.DeviceUpdate> updates)
Sends update notifications to listeners.
|
java.util.Iterator<Device> |
queryClassByEntity(IEntityClass clazz,
java.util.EnumSet<IDeviceService.DeviceField> keyFields,
Entity entity)
Returns an iterator of devices that related to the entity argument.
|
java.util.Iterator<? extends IDevice> |
queryClassDevices(IDevice reference,
java.lang.Long macAddress,
java.lang.Short vlan,
java.lang.Integer ipv4Address,
java.lang.Long switchDPID,
java.lang.Integer switchPort)
Finds devices that match the provided query.
|
java.util.Iterator<? extends IDevice> |
queryDevices(java.lang.Long macAddress,
java.lang.Short vlan,
java.lang.Integer ipv4Address,
java.lang.Long switchDPID,
java.lang.Integer switchPort)
Finds devices that match the provided query.
|
void |
reclassify(java.util.Set<java.lang.String> entityClassNames)
Reclassifies a devices if the device entity is null or is contained a device.
|
private boolean |
reclassifyDevice(Device device)
This method will reclassify and reconcile a device - possibilities
are - create new device(s), remove entities from this device.
|
private void |
removeEntity(Entity removed,
IEntityClass entityClass,
java.lang.Long deviceKey,
java.util.Collection<Entity> others)
Removes the device of the deviceKey argument from the single and multi indices.
|
void |
removeSuppressAPs(long swId,
short port)
Removes setting of points in the network where attachment points
are not to be learned.
|
private void |
sendDeviceMovedNotification(Device d)
Sends update notifications to listeners.
|
int |
size()
Returns the size of
deviceIdToDeviceMap . |
void |
updateAttachmentPoints()
Updates attachment points of the device.
|
private boolean |
updateIndices(Device device,
java.lang.Long deviceId)
Updates both the primary and class indices for the provided device.
|
private void |
updateSecondaryIndices(Entity entity,
IEntityClass entityClass,
java.lang.Long deviceKey)
Updates the secondary indices for the given entity and associated
entity classes.
|
private java.util.LinkedList<Devices.DeviceUpdate> |
updateUpdates(java.util.LinkedList<Devices.DeviceUpdate> list,
Devices.DeviceUpdate update)
Inserts a new DeviceUpdate to the list of
Devices.DeviceUpdate s. |
public ITopologyService topology
public IEntityClassifierService classifier
public Devices.AttachmentPointComparator apComparator
private java.util.Set<IDeviceListener> deviceListeners
private java.util.concurrent.ConcurrentHashMap<java.lang.Long,Device> deviceIdToDeviceMap
Device
objects.private long deviceKeyCounter
private java.lang.Object deviceKeyCounterLock
private EntityToSingleDeviceIdIndex primaryIndex
private java.util.concurrent.ConcurrentHashMap<java.util.EnumSet<IDeviceService.DeviceField>,EntityToSingleDeviceIdIndex> singleIndices
private java.util.concurrent.ConcurrentHashMap<java.util.EnumSet<IDeviceService.DeviceField>,EntityToMultiDeviceIdIndex> multiIndices
private java.util.Set<SwitchPort> suppressedAPs
private static java.util.concurrent.atomic.AtomicReference<Devices> instanceRef
private OFModel.RESTApi[] apis
private Devices(ITopologyService topo, IEntityClassifierService clf)
topo
- the reference of topology service moduleclf
- the entity classifierpublic static Devices getInstance(ITopologyService topo, IEntityClassifierService clf)
Devices
class. If there is no instance,
creates a new instance.topo
- the reference of topology service moduleclf
- the entity classifierpublic static Devices getInstance()
public boolean isValidAttachmentPoint(long switchDPID, int switchPort)
switchDPID
- the switch dpidswitchPort
- the switch portpublic static Device allocateDevice(java.lang.Long deviceKey, Entity entity, IEntityClass entityClass)
deviceKey
- the unique identifier for this device objectentity
- the initial entity for the deviceentityClass
- the entity classes associated with the entitypublic static Device allocateDevice(java.lang.Long deviceKey, java.util.List<AttachmentPoint> aps, java.util.List<AttachmentPoint> trueAPs, java.util.Collection<Entity> entities, IEntityClass entityClass)
deviceKey
- the unique identifier for this device objectaps
- old attachment points for the devicetrueAPs
- current attachment points for the deviceentities
- the initial entities for the deviceentityClass
- the entity class associated with the entitiespublic static Device allocateDevice(Device device, Entity entity)
device
- the old device objectentity
- the entity to add. This must be have the same
entity class as devicepublic java.util.concurrent.ConcurrentHashMap<java.lang.Long,Device> getDeviceMap()
public int size()
deviceIdToDeviceMap
.public boolean isEntityAllowed(Entity entity, IEntityClass entityClass)
public void reclassify(java.util.Set<java.lang.String> entityClassNames)
entityClassNames
- a set of device entity namespublic void updateAttachmentPoints()
public void cleanupEntities(java.util.Date cutoff)
cutoff
- the time of threshold to delete entitiespublic Device findDestByEntity(IDevice source, Entity dstEntity)
source
- the source device. The returned destination will be
in the same entity class as the source.dstEntity
- the entity to look upDevice
or null if no device is foundpublic java.util.Iterator<Device> queryClassByEntity(IEntityClass clazz, java.util.EnumSet<IDeviceService.DeviceField> keyFields, Entity entity)
clazz
- the entity class for the entitykeyFields
- the key field to search forentity
- the entity class to search forDeviceIdIterator
otherwiseprivate boolean updateIndices(Device device, java.lang.Long deviceId)
device
- the device to updatedeviceId
- the device key for the deviceprivate void updateSecondaryIndices(Entity entity, IEntityClass entityClass, java.lang.Long deviceKey)
entity
- the entity to updateentityClass
- the entity class for the entitydeviceKey
- the device key to set upprivate java.util.LinkedList<Devices.DeviceUpdate> updateUpdates(java.util.LinkedList<Devices.DeviceUpdate> list, Devices.DeviceUpdate update)
Devices.DeviceUpdate
s.list
- the list of Devices.DeviceUpdate
s before updateupdate
- the Devices.DeviceUpdate
to updateDevices.DeviceUpdate
private java.util.EnumSet<IDeviceService.DeviceField> findChangedFields(Device device, Entity newEntity)
IDeviceService.DeviceField
of the device.device
- the device to check its entitiesnewEntity
- the entity to checkprivate void deleteDevice(Device device)
deviceIdToDeviceMap
and its entities.device
- the device to deletepublic void deleteDevice(long datapathid)
datapathid
- datapath id of the switch.private void removeEntity(Entity removed, IEntityClass entityClass, java.lang.Long deviceKey, java.util.Collection<Entity> others)
removed
- the entity to removeentityClass
- the entity class for the entitydeviceKey
- the device key to removeothers
- the others against which to checkprivate boolean reclassifyDevice(Device device)
device
- the device to reclassifyprivate void processUpdates(java.util.Queue<Devices.DeviceUpdate> updates)
updates
- the updates to process.private void sendDeviceMovedNotification(Device d)
d
- the device to updatesprivate boolean allKeyFieldsPresent(Entity e, java.util.EnumSet<IDeviceService.DeviceField> keyFields)
e
- entity to checkkeyFields
- the key fields to check e againstprivate Device findDeviceByEntity(Entity entity)
Device
based on the provided Entity
. We first
check the primary index. If we do not find an entry there we classify
the device into its IEntityClass
and query the classIndex.
This implies that all key field of the current IEntityClassifierService
must be present in the entity for the lookup to succeed!entity
- the entity to search forDevice
object if foundprivate java.util.EnumSet<IDeviceService.DeviceField> getEntityKeys(java.lang.Long macAddress, java.lang.Short vlan, java.lang.Integer ipv4Address, java.lang.Long switchDPID, java.lang.Integer switchPort)
macAddress
- MAC addressvlan
- VLAN IDipv4Address
- IPv4 addressswitchDPID
- the switch dpidswitchPort
- the switch portpublic IDevice getDevice(java.lang.Long deviceKey)
IDeviceService
getDevice
in interface IDeviceService
deviceKey
- the key to search forIDevice.getDeviceKey()
public IDevice findDevice(long macAddress, java.lang.Short vlan, java.lang.Integer ipv4Address, java.lang.Long switchDPID, java.lang.Integer switchPort) throws java.lang.IllegalArgumentException
IDeviceService
Only the key fields as defined by the IEntityClassifierService
will
be important in this search. All key fields MUST be supplied.
IDeviceService.queryDevices(java.lang.Long, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Integer)
might be more appropriate!
findDevice
in interface IDeviceService
macAddress
- The MAC addressvlan
- the VLAN. Null means no VLAN and is valid even if VLAN is a key field.ipv4Address
- the ipv4 addressswitchDPID
- the switch dpidswitchPort
- the switch portIDevice
or null if no device is found.java.lang.IllegalArgumentException
- if not all key fields of the
current IEntityClassifierService
are specified.public IDevice findDestDevice(IDevice source, long macAddress, java.lang.Short vlan, java.lang.Integer ipv4Address) throws java.lang.IllegalArgumentException
IDeviceService
findDestDevice
in interface IDeviceService
source
- the source device. The returned destination will be
in the same entity class as the source.macAddress
- The MAC address for the destinationvlan
- the VLAN if availableipv4Address
- The IP address if available.IDevice
or null if no device is found.java.lang.IllegalArgumentException
- if not all key fields of the
source's IEntityClass
are specified.IDeviceService.findDevice(long, Short, Integer, Long, Integer)
public java.util.Collection<? extends IDevice> getAllDevices()
IDeviceService
getAllDevices
in interface IDeviceService
public void addIndex(boolean perClass, java.util.EnumSet<IDeviceService.DeviceField> keyFields)
IDeviceService
addIndex
in interface IDeviceService
perClass
- set to true if the index should be maintained for each
entity class separately.keyFields
- the set of fields on which to indexpublic java.util.Iterator<? extends IDevice> queryDevices(java.lang.Long macAddress, java.lang.Short vlan, java.lang.Integer ipv4Address, java.lang.Long switchDPID, java.lang.Integer switchPort)
IDeviceService
queryDevices
in interface IDeviceService
macAddress
- The MAC addressvlan
- the VLANipv4Address
- the ipv4 addressswitchDPID
- the switch dpidswitchPort
- the switch portpublic java.util.Iterator<? extends IDevice> queryClassDevices(IDevice reference, java.lang.Long macAddress, java.lang.Short vlan, java.lang.Integer ipv4Address, java.lang.Long switchDPID, java.lang.Integer switchPort)
IDeviceService
queryClassDevices
in interface IDeviceService
reference
- The reference device to refer to when finding
entity classes.macAddress
- The MAC addressvlan
- the VLANipv4Address
- the ipv4 addressswitchDPID
- the switch dpidswitchPort
- the switch portpublic void addListener(IDeviceListener listener)
IDeviceService
addListener
in interface IDeviceService
listener
- The listener that wants the notificationspublic void addSuppressAPs(long swId, short port)
IDeviceService
addSuppressAPs
in interface IDeviceService
swId
- a switchidport
- a port numberpublic void removeSuppressAPs(long swId, short port)
IDeviceService
removeSuppressAPs
in interface IDeviceService
swId
- a switchidport
- a port numberpublic boolean isSuppressedAP(SwitchPort switchPort)
switchPort
- the switch port to checkpublic java.lang.String getHostDebugInfo()
public OFModel.RESTApi[] getAllRestApi()
getAllRestApi
in class OFModel


{% extends "base.html" %}
{{ message.message_body }}
Sent To: {{ message.receiver }}
By: {{ message.sender }}
Private Key: {{ form.privateKey }}
{{ decrypt }}


Our CSS classes are designed for HTML-savvy learners and assume you have no previous knowledge of CSS but already have knowledge of HTML. Classes start from the basics of CSS to more advanced concepts. We incorporate quizzes and other checkpoints in our lessons to ensure you learn as much useful and practical information as possible. You can find out more information about our classes by visiting our premises or calling us during office hours.
 Prev


Donleeve is a library for exit intent actions!
For better user experience, Donleeve uses localStorage
to prevent exit intents from popping up too often. You can specify parts of the URL to block with regex if you have different modals on your pages and you want a different block for each. For example, take a look at these links:


I’ve been using Arch (more specifically Antergos) for a while now. This morning I was trying to set up RStudio, and saw that the package I likely want is rstudio-desktop-bin. I tried to yaourt -S it, and during the install, it was trying in install a dependency called gstream. The specific version it was trying to install was built from source, and that source repo had a submodule named common. Unfortunately, the submodule used the git:// protocol that our office firewall blocked. Once I identified this, the solution was simple. I just added the following to my global git config:
[url "https://anongit.freedesktop.org/git/gstreamer/common"]
insteadOf = git://anongit.freedesktop.org/gstreamer/common
When I tried the install again, git used the https url instead of the git:// one, and everything installed fine. This would obviously work whenever you need to use a specific git url that you don’t have access to.


Material Web Components Playground
Edit the code of this demo by
remixing
this project, or view our API demos
here
!
Button
open_in_new
Checkbox
open_in_new
Dialog
open_in_new
Here is some content!
FAB
open_in_new
Formfield
open_in_new
Icon
open_in_new
shopping_cart
Icon Button
open_in_new
Icon Button Toggle
open_in_new
Linear Progress
open_in_new
List
open_in_new
User Name
<EMAIL_ADDRESS>tag_faces
FAQ
help_outline
Switch account
people_alt_outline
Settings
settings_outline
Sign out
exit_to_app
Menu
open_in_new
check
a-one
check
a-two
check
a-three
check
b-one
check
b-two
Radio
open_in_new
Ripple
open_in_new
Primary
Accent
box not ripple
Unbounded
Select
open_in_new
Option 1
Option 2
Option 3
Option 1
Option 2
Option 3
Slider
open_in_new
Snackbar
open_in_new
RETRY
Switch
open_in_new
Tabs
open_in_new
Textarea
open_in_new
Textfield
open_in_new


#include <BL3_GbxGameSystemCore_classes.hpp>
◆ StaticClass()
| static UClass* StaticClass |
( |
| ) |
|
|
inlinestatic |
◆ AreaDamageFilter
◆ AttackerCondition
◆ bAppliesToInstigatorChildren
| bool bAppliesToInstigatorChildren |
◆ bAttackerConditionFirstContextIsOverrideContextObject
| bool bAttackerConditionFirstContextIsOverrideContextObject |
◆ bAttackerConditionSecondContextIsDamageCauser
| bool bAttackerConditionSecondContextIsDamageCauser |
◆ bCanTriggerOnBonusDamage
| bool bCanTriggerOnBonusDamage |
◆ bDefenderConditionFirstContextIsOverrideContextObject
| bool bDefenderConditionFirstContextIsOverrideContextObject |
◆ bDefenderConditionSecondContextIsDamageCauser
| bool bDefenderConditionSecondContextIsDamageCauser |
◆ bIncludeDamageSourceSubclasses
| bool bIncludeDamageSourceSubclasses |
◆ bUseAreaDamageFilter
| bool bUseAreaDamageFilter |
◆ bUseCriticalFilter
◆ bUseHitDirectionAngle
| bool bUseHitDirectionAngle |
◆ bUseRandomChance
◆ CriticalFilter
◆ DamageSourceFilter
| TArray<class UClass*> DamageSourceFilter |
◆ DamageSourceFilterMode
◆ DamageTypeFilter
| TArray<class UClass*> DamageTypeFilter |
◆ DamageTypeFilterMode
◆ DefenderCondition
◆ HitDirectionAngle
◆ HitDirectionAngleOffset
◆ RandomChance
◆ UnknownData00
| unsigned char UnknownData00[0x6] |
◆ UnknownData01
| unsigned char UnknownData01[0x2] |
◆ UnknownData02
| unsigned char UnknownData02[0x3] |
◆ UnknownData03
| unsigned char UnknownData03[0x3] |
◆ UnknownData04
| unsigned char UnknownData04[0x3] |
◆ UnknownData05
| unsigned char UnknownData05[0x7] |
◆ UnknownData06
| unsigned char UnknownData06[0x3] |
◆ UnknownData07
| unsigned char UnknownData07[0x6] |


Simply beautiful open source icons. For more info click here.

New Websites is Created
Prepare For the Next Project
Decide the live Discussion Time
Team Review meeting
Prepare for Presentation


Duration
20 minutes
Lab Goals
The primary goal of this exercise is to create and run unit tests.
- Add a new Unit Test project to the solution
- Write tests for the Phoneword app
Steps
Create the Unit Test Project
- Open the Start solution in the Exercise 2 folder.
- Add a new Visual C# > Class Library (.NET Framework) project and name it Phoneword.UnitTests.Core.
- Install the latest NUnit and NUnit3TestAdapter NuGet packages into this new project.
- Add a new NUnit Library Project and name it Phoneword.UnitTests.Core.
- Double click on the unit test project to bring up the project options. Select the Build node, then change the Target Framework to Mono / .NET 4.5, then click OK.
Reference Phoneword Project
- Right click on the References for the test project and add a project reference to the Phoneword.Core project.
- In the new class library project, rename the default class file to TestTranslation.cs.
-
Inside the TestTranslation.cs file, replace the contents with this code to start the beginning of our test fixture.
using NUnit.Framework; using Phoneword.Core; namespace Phoneword.UnitTests.Core { [TestFixture] public class TestTranslation { [Test] public void TestXamarinPhoneNumber() { } } }
- In the test project, rename the boilerplate test file (likely named
Test.cs
) toTestTranslation.cs
- Add
using Phoneword.Core;
to the file so we can get to thePhonewordTranslator
class.
Create a Unit Test
- Rename the existing
TestCase
method toTestXamarinPhoneNumber
- Add code to the
TestXamarinPhoneNumber
method to perform the following test:- Invoke the
PhonewordTranslator.ToNumber
method with the phone number "1-855-XAMARIN" - Verify that the returning number is "1-855-9262746" using the
Assert
class.
- Invoke the
Create a testable mock IDialer
- Create a mock implementation of
IDialer
which captures the value of the passed number and tracks whether theDial
method was called. You can use the following implementation:
public class MockDialer : IDialer { public string LastDialedNumber = null; public bool CalledDialer = false; public bool Dial(string number) { CalledDialer = true; LastDialedNumber = number; return true; } }
Create a ViewModel Test class
Let's write a unit test for the dialing code. We supply our mock IDialer to the MainViewModel
.
- Create a new unit test by adding a new C# class named TestPhoneTranslateViewModel the test project.
- Copy in the
TestFixture
code used in the previous test. - Add
using Phoneword.Core;
to the namespace references.
Setup the Test Class
- We need to setup the test fixture by creating a new
MainViewModel
which will invoke the dialer and a new instance of thePhoneTranslateViewModel
which translates the number. Capture both of these in class-level fields.- Use a
[SetUp]
attribute on a method - this will get called prior to each of your tests. - Create an instance of the
MockDialer
and save it off in a field. - Name the
MainViewModel
fieldappViewModel
and thePhoneTranslateViewModel
fieldtranslateViewModel
. - Pass in the
MockDialer
instance into yourMainViewModel
constructor. - Pass the
MainViewModel
into thePhoneTranslateViewModel
constructor.
- Use a
Test the Dial Button
- Create a test method to validate that the dial button is not enabled until a phone number is entered. To do this, we will create a new method which sets the phone number to an empty string and then validates that the
TranslateCommand
cannot be executed.- Name the method
TestNoTranslateOnEmptyText
. - Set the
translateViewModel.PhoneNumberText
to an empty string. - Check the
translateViewModel.TranslateCommand.CanExecute
method and verify it returnsfalse
. You can pass in anull
to the parameter for the command.
- Name the method
- Run the test from IDE and see if it works.
- Now write the opposite test. Using the code you already wrote, change the phone number and verify that the command is now executable(it should return true).
- Run this test and verify that it functions properly.
Test the Dialer in the View Model
- Now verify the dialer functionality in the
MainViewModel
. Define a new test methodTestDialerCalls
. - In the method, clear out the
appViewModel.DialedNumbers
collection. - Next, set the
translateViewModel.PhoneNumberText
to a valid phone number. - Next, invoke the
TranslateCommand
and theCallCommand
on thetranslateViewModel
instances. This will invoke the dialer. - Finally, verify that the dialer was called
- Write additional tests to verify that the number was correctly translated, passed into the dialer, and that the
DialedNumbers
collection has a single dialed number in it.
Run All Tests
As a final step, try running all your tests at once.
- Open the Unit Test pad by selecting from the Main Menu View -> Pads and then select Unit Tests.
- Select the Run All option from the Unit Test tab to see the results of the Unit Tests.
Summary
Congratulations, you have successfully run and created unit tests on your platform.


Reports any classes declared as implementing or extending an annotation interface. While it is legal to extend an annotation interface, it is often done by accident, and the result won't be usable as an annotation.


MRS plugin tutorial
When designing MRS one of the goals was to keep the complexity as low as possible. One of the ways I tried to accomplish this is to adopt a well known scripting language instead of inventing my own. Given the popularity of (and my familiarity with) I chose Perl. Perl is known as a very fast and powerful language, especially for parsing and processing text. Which is exactly where we use it for in MRS.
The indexing process is started by the mrs-build application. The main parameter is the -d option that supplies the databank name we want to create. Based on this parameter the application chooses a plugin script to provide the necessary information and to do the actual processing. This choice of plugin script can be overridden using the -s option.
A plugin script is a Perl object that inherits from the base object MRS::Script
. It should provide some methods and can override some of the methods provided by the base class.
Since the title says this is supposed to be a tutorial, lets get started by inventing our own databank. Let's call this databank 'mydb'. mydb is a so called flat-file databank, records have a well defined layout. Here's an example record
ID A0001 DE This is a funny peptide AA AABBCCBBAA //
As you can see, there are three fields in this databank, an ID field containing a unique value for each record, a DE field containing a description of the record and AA containing an actual protein sequence.
One remark at this point. Our mydb databank as described above contains records. In MRS we do not store records but documents. You should for now consider these terms as synonyms and perhaps skip the rest of this paragraph. The reason MRS stores documents and not records is that MRS is not a database tool, but a tool to index data and there is no limit to what you can store. No structure in the data is assumed.
Lets start writing a mrs plugin for mydb. We will call the plugin mydb and thus we save it as mydb.pm in the parser_scripts directory. The first lines in the script are very straightforward, they are here to tell Perl what this file actuall contains:
package MRS::Script::mydb; our @ISA = "MRS::Script";
The first line defines the name for the package and the third line tells Perl our package inherits from the MRS::Script
package. We then continue with a 'new' subroutine. This one is required in all Perl plugins and initialises the plugin object. Here's the code:
sub new { my $invocant = shift; my $self = new MRS::Script( ... ); return bless $self, "MRS::Script::mydb"; }
Again, this is pretty standard stuff for anyone who has written a Perl object before, with one exception: we have to call the base class constructor first to create our $self object. We will now fill in this method with actual information for our mydb databank. We do this by providing values for a couple of standard fields in this object. Remember, an object in Perl is a actually a hash that is blessed. And hashes are associative arrays. We will now set up a couple of values for this hash.
sub new { my $invocant = shift; my $self = new MRS::Script( name => 'MyDB, a databank containing funny peptides', url => 'http://www.mydb.org/funny', section => 'protein', meta => [ 'title' ], raw_files => qr/mydb.txt.gz/, indices => \%INDICES, @_ ); return bless $self, "MRS::Script::mydb"; }
Let's see what we've got here. First of all there's the name field. This is the pretty name the user interface presents to the end user of MRS.
URL contains the url where users can find more information about this databank.
Section is not used at the moment but will be later on. The idea is to use this information to group databanks in the user interface.
Meta contains an array of the names of meta data fields. MRS needs to know in advance what meta data fields will be constructed. This means that you have to list all meta data fields here before you actually fill them. If you don't you will get the error "Meta data field xxx not defined".
If you provide meta datafields, which is optional, you must make sure that the first meta data field contains the title (or description) of the document. All tools that use MRS files assume this convention is used.
raw_files is a compiled regular expression. It is used to determine which files to process. The mirror process might fetch more files into the 'raw' directory of this databank than only datafiles. Some databanks e.g. have files with release information. Sometimes there is no simple regular expression that describes all datafiles, in the PDB databank e.g. the datafiles are located in sub directories. In that case you can provide a raw_files method to create a list of raw data file paths.
Then there is the indices field. This one contains a reference to a hash which maps a field identifier to a field name. In our case we use a global hash called %INDICES, but if we do, we have to define this hash itself as well of course. Here it is, this code should come before the new subroutine:
our %INDICES = ( 'id' => 'Identifier', 'de' => 'Description', 'aa' => 'sequence' );
A close reading of this piece of code reveals that we use lowercase id's while our databank had uppercase field codes. The reason is that MRS matches a field name case insensitive. Internally the id's are stored lowercase and so I opted for the lowercase in the scripts as well. This is cosmetic, but if you decide to use otherwise I can tell you this is untested.
OK, our databank script object is ready to be initialised and mrs now knows most of the information it needs to start the parsing process. There are a couple of fields that we didn't provide. MRS will create a default value for these.
Before we continue with the parsing, let me spend a couple of words on version information. If you don't provide any, mrs-build will store the date of the most recent raw file as version information. However, you can set the version field or you can provide a method with the same name to fetch this information.
Parsing
The only other method you're required to provide is the parse subroutine. This one does the actual parsing of the raw data. mrs.pl will open the files specified by the raw_files value, extract them on the fly if needed. The use of extraction is based on extension of the raw file names.
The parse method is called with no parameters. And so we start our parse method as follows:
sub parse { my $self = shift;
Again, if you know Perl you know what happens here. If you don't know Perl, you'd better simply copy over the lines since I know that Perl syntax can be a bit confusing.
And so we are in the parse method and we're almost ready to start parsing. The data we produce will be put into a new databank and the mrs-build application has already created a new temporary mrs file ready to accept this data.
Since our parser script is derived from MRS::Script, it inherits several functions that can be used. Among these is GetLine to read the raw files line by line, others are the various Store and Index methods. Their use will be explained here.
Lets start parsing. There are several ways to do this, but one of my favorite ways to do this is to read the raw data line by line after we've declared some variables to use later on:
my ($doc, $title); while (my $line = $self->GetLine) { $doc .= $line; chomp($line);
So we read the file, line by line and add the lines to the $doc variable to collect the data that belongs to the current document. After this we chop off the newline at the end of the line using chomp to make processing easier. Now if we look at the structure of our mydb again we see that a record is always closed with a line containg two forward slashes.
if ($line eq '//') { $self->StoreMetaData('title', $title); $self->Store($doc); $self->FlushDocument; $doc = undef; $title = undef; }
What happens here is we've finished a document and $doc contains the full text of the original record. $title contains the title for this document (see below) and we store both into the current document of the MRS databank. When we've done that we can flush the document and reset the variables $doc and $title.
Now if a line does not contain the two forward slashes, it must contain a key/value pair. The key is two characters wide followed by three space and then the rest of the line contains the value. We test for this and parse out the key and value values at the same time:


Preparation time
overnight
Cooking time
10 to 30 mins
Serves
Serves 8-10
Dietary
A very indulgent, but utterly delicious dish of deep fried chocolate pasta filled with a chocolate ganache.
For the ganache, put the cream, orange zest, orange liqueur and glucose in a medium saucepan and heat until nearly boiling. Remove from the heat and stir in the butter.
Melt the chocolate in a heatproof bowl set over a pan of gently simmering water. When melted, add to the cream mixture and stir until smooth. Pour the ganache into a small bowl and leave to set for at least two hours, preferably overnight.
To make the passion fruit sauce, mix three tablespoons of orange juice with the arrowroot. Mix remaining ingredients in a pan and heat until simmering. Add the arrowroot and juice mix and stir until thick and glossy. Leave to cool until ready to serve.
To make the ravioli, put the flour, butter, sugar, orange zest and vanilla extract into a food processor and blend until it forms a crumb. Gradually add the milk to form a ball. Remove from the food processor and, using your hands, bring together to form a dough. Knead briefly, wrap in cling film and set aside to rest.
Divide the dough into four equal pieces. Either using a rolling pin or pasta machine, gradually roll each piece until you have four thin sheets of pasta (you might need to add extra flour to the machine to stop it sticking).
Using a large circular pastry cutter, cut circles from the pasta sheets. Put a generous spoonful of ganache into the centre of each circle. Brush the edges with a little water (to seal) and fold over to create a neat semi-circular pocket. Using a fork, crimp the edges.
Place on a floured baking tray.
Once all the ravioli are made, pour a few inches of vegetable oil into a large pan set over a medium heat (take care – hot oil is dangerous. Do not leave unattended). Gently lower the ravioli into the hot oil and fry until golden on both sides (you may need to do this in batches). Use a slotted spoon to remove the ravioli then drain on a plate lined with absorbent kitchen paper.
Serve the ravioli warm, dusted with icing sugar and cocoa powder and drizzled with the passion fruit sauce.