--- title: "How would the NBA season have finished?" author: "Joe Ciesielski" date: '2020-07-13' tags: - R - NBA output: html_document: mathjax: local self_contained: true ---
I recently read Basketball on Paper by Dean Oliver. In this book he, presents a formula for expected winning percentage. Given that we’re in such a weird situation with the current basketball season, I wanted to see what that formula would have to say about how things are shaking out.
Using the formula for expected win percentage, we can examine how we would have expected teams to finish the season. With this, we can look at how it compares to a) teams included in the bubble, b) how teams finish the first round of the bubble season before the playoffs start.
There are more sophisticated ways to predict wins but I was interested to see how this performed, and a basical formula like this is always a good benchmark.
First we’ll download and do some processing of the data1:
library(tidyverse)
# remotes::install_github("jtcies/jtcr")
library(jtcr)
library(lubridate)
library(ggrepel)
library(scales)
theme_set(theme_jtc())
box_scores <- read_csv("https://raw.githubusercontent.com/jtcies/jtcies_site/master/content/data/nba-boxscores-2020.csv") %>%
rename(game_id = X1) %>%
distinct(game_id, .keep_all = TRUE)
box_scores_processed <- box_scores %>%
mutate(
winner = tolower(winner),
home_team = if_else(winner == "home", winning_abbr, losing_abbr),
away_team = if_else(winner == "away", winning_abbr, losing_abbr)
)
tidy_box_scores <- function(dat, home_away) {
type <- home_away
dat$win <- ifelse(dat$winner == type, 1L, 0L)
if (home_away == "home") {
pa <- dat$away_points
} else {
pa <- dat$away_points
}
dat <- dplyr::select(dat, game_id, win, pace, starts_with(type))
orig <- names(dat)
new <- str_remove(orig, "home_|away_")
names(dat) <- new
dat$type <- type
dat$home <- as.integer(as.factor(dat$type))
dat$points_allowed <- pa
dat
}
box_scores_tidy <- bind_rows(
tidy_box_scores(box_scores_processed, "home"),
tidy_box_scores(box_scores_processed, "away")
)
The formula for win percentage he presents is this:
\[ P = \mathcal{N}\frac{ORtg - DRtg}{\sqrt{(var(ORtg) + var(DRtg) - 2 * cov(ORtg, DRtg)}} \]
where \(ORtg\) is team offensive rating, \(DRtg\) is team defensive rating, \(var(ORtg)\) is variance of team offensive rating (similarly for defensive rating), and \(cov(ORtg, DRtg)\) is the covariance between offensive and defensive rating.
So for each team that looks like:
calc_win_pct <- function(ortg, drtg) {
mean_o <- mean(ortg)
mean_d <- mean(drtg)
var_o <- var(ortg)
var_d <- var(drtg)
cov_od <- cov(ortg, drtg)
pnorm((mean_o - mean_d) / sqrt(var_o + var_d - (2 * cov_od)))
}
predicted_wins <- box_scores_tidy %>%
group_by(team) %>%
summarise(
win_pct_calc = calc_win_pct(offensive_rating, defensive_rating),
win_pct_actual = mean(win),
wins = sum(win))
predicted_wins %>%
ggplot(aes(win_pct_calc, win_pct_actual, label = team, color = team)) +
geom_abline(lty = 2) +
geom_point() +
geom_text_repel() +
scale_y_continuous(labels = scales::percent) +
scale_x_continuous(labels = scales::percent) +
theme(legend.position = "none") +
labs(x = "Expected win percentage",
y = "Actual win percentage",
title = "Comparing expected and actual win percentage",
subtitle = "Using Dean Oliver's formula in 'Basketball on Paper'")
You can see that the formula has some regression to the mean built in with the better teams have a lower expected win percentage than actual and the worse teams having a higher expected win percentage than actual.
Using this calculation, we can look at how a team’s rank compared to their actual current rankings. This is interesting because current records were used to make decisions about which teams were included in the season restart.
east_teams <- c("ATL", "BOS", "BRK", "CHI", "CHO", "CLE", "DET", "IND",
"MIA", "MIL", "NYK", "ORL", "PHI", "TOR", "WAS")
predicted_wins %>%
mutate(conference = if_else(team %in% east_teams, "East", "West")) %>%
group_by(conference) %>%
select(team, conference, win_pct_calc, win_pct_actual) %>%
gather(type, pct, win_pct_calc:win_pct_actual) %>%
mutate(type = fct_rev(type)) %>%
ggplot(aes(type, pct, color = team, group = team)) +
geom_point() +
geom_line() +
facet_wrap(~ conference) +
geom_text_repel(aes(label = team)) +
scale_y_continuous(labels = scales::percent) +
scale_x_discrete(labels = c("Expected", "Actual")) +
theme(legend.position = "none") +
labs(x = "",
y = "Win Percentage")
A few things stand out:
Top of East: Many basketball commentators think that 2nd place in the East is really a toss up between Toronto and Boston. We know that Boston was on a hot streak right before the season was paused. While Toronto had a better regular-season record so far, this formula gives the slight edge to Boston for the second spot (although it doesn’t say anything about how they would match-up in a playoff series).
Top of West: The thing that really stands out here is Dallas. The predicted win perctange gives Dallas a much better record than their actual record. More on this below.
Bottom of East: Almost everyone agrees (or at least they did before all of Brooklyn’s starting 5 turned over completely) that Washington had no buisness playing more basketball this year. And while there’s still a large gap between the 8th and 9th spots, the predicted win percentage actually has Chicago and Detroit above Washington.
Bottom of West: Similarly here, everyone thinks Phoenix is the outlier. And even though it will be almost impossible for them to get into the playoffs, from a predicted win percentage standpoint, they are much more in the mix than their actual record would suggest.
Dallas really stands out in the ‘should have won more games’ category. The plot below shows each team’s average offensive and defensive rating.
rating_averages <- box_scores_tidy %>%
group_by(team) %>%
summarise(
offensive_rating = mean(offensive_rating),
defensive_rating = mean(defensive_rating)
)
rating_averages %>%
ggplot(aes(defensive_rating, offensive_rating, color = team)) +
geom_point() +
geom_text_repel(aes(label = team)) +
geom_vline(xintercept = mean(rating_averages$defensive_rating),
lty = 2) +
geom_hline(yintercept = mean(rating_averages$offensive_rating),
lty = 2) +
theme(legend.position = "none") +
labs(x = "Average defensive rating",
y = "Average offensive rating",
title = "Dallas has highest offensive rating by far",
subtitle = "dashed lines show average ratings")
Dallas has by far the best average offensive rating. The rest of the best teams in the league (Lakers, Clippers, Boston, Toronto, and especially Milwaukee) all have very low defensive ratings. The formula appears to value offense over defense, which may be why most of those teams have a lower expected win percentage than actual. This is also why the model thinks Boston is better than Toronto.
There are clear limitations in using a formula like this. It might help describe the historical distrubtion but it’s not terribly predictive. However,I think it is useful to start with a relatively straightforward, easy to interpret model, and see what insights it can reveal before moving to something more complicated.


Taapsee dismisses man who asks her to speak Hindi
by Roshan H NairTaapsee Pannu was at the 50th edition of the International Film Festival of India on Saturday.
During a lively discussion in English about her journey in the film industry so far, a man asked her to switch to Hindi.
Taapsee, in turn, posed the question to a packed audience: “Does everybody here understand Hindi?”
A large number of people booed back.
But the man was persistent, saying that she should speak in Hindi because she is a Bollywood actress.
In response, Taapsee said, “I am also an actress in the Tamil and Telugu industries. Shall I speak in Tamil to you?”
The audience applauded and the man sat down.
Taapsee also rejected questions that got too personal. She did not encourage a man who wanted to know what she would name her daughter when she has one.
When one audience member asked Taapsee what it was like to work with Amitabh Bachchan, with whom she shared screen space on both ‘Pink’ and ‘Badla’, she said that people should ask her questions that are more relevant than what the experience of working with some co-star is.
“I expect better questions from a festival audience,” she said.
The issue of mostly being asked questions about a male co-worker is something women artistes have faced in many interactions at this year’s IFFI.
Even Isabelle Huppert, who won the festival’s Lifetime Achievement Award this year, had to go through this.
In a conversation moderated by film critic Anupama Chopra, Isabelle was asked many questions about the big filmmakers she has worked with, such as Jean Luc Godard, Werner Schroeter, Claude Chabrol and Michael Haneke.
Before the discussion, the Manmarziyaan actress had inaugurated a screening of special screening of Rajkumar Hirani’s 2006 film Lage Raho Munna Bhai for visually challenged children.


--- # This file was auto-generated by jekyllscout article_id: 57e59bf99033602e61d4758d number: 18 collection_id: 57e598fd9033602e61d4757e name: 'Working with content' title: 'Working with content' category_ids: - 57e59913c697914f21030df7 related_article_ids: { } created_at: '2016-09-23T21:17:45+00:00' updated_at: '2016-09-23T21:18:52+00:00' last_published_at: '2016-09-23T21:18:52+00:00' layout: helpscout_article ---
An example of how to set up a Jekyll project with Jekyll Scout can be found in the docs
directory on GitHub. That is the code that is running the site you are reading 😃.


{%- capture styles -%} {%- include fonts.scss -%} {%- include patternfly/sass-utilities/functions.scss -%} {%- include patternfly/sass-utilities/colors.scss -%} {%- include patternfly/sass-utilities/scss-variables.scss -%} {%- include patternfly/sass-utilities/mixins.scss -%} {%- include patternfly/_variables.scss -%} {%- include patternfly/_shield-inheritable.scss -%} {%- include patternfly/_shield-noninheritable.scss -%} body { margin: 20px; } {%- endcapture -%}


(repost in separate thread according to Paul's hint)
Hello experts,
I do like the idea of EmonHub; thanks to all contributors! I started with the ReadyToGo image (08/13/2014) and made updates on /var/www/emoncms and /home/pi/emonhub via git pull and on the system itself via apt-get upgrade. After all configuration was done the system seems to run fine, I could access the web sites etc.I wanted to start with manually creating feeds via web API according to the feed API help and tried a PHPTIMESERIES feed:
http://<IP_ADDRESS>/emoncms/feed/create.json?name=Test2&datatype=1&engi...
with success followed by sending a first value via
http://<IP_ADDRESS>/emoncms/feed/insert.json?id=1&time=1416771807&value...
After that I could see the feed in the feed list with the initial value and it could also be queried:
http://<IP_ADDRESS>/emoncms/feed/data.json?id=1
returns
[[1416771807000,100]]
But after sending another value
http://<IP_ADDRESS>/emoncms/feed/insert.json?id=1&time=1416771907&value...
the new value was shown in the answer, but did not appear on the feed list and could not be queried.
Does anybody have an idea what is going wrong here?
I also tried PHPFINA feeds but with even less success: I could send values but not even the first value appeared; it was only shown in the feed list,but could not be queried and did not show up in a chart.
Both, the directories of /home/pi/data/phpfina and phptimeseries contained files after my actions.
Finally I tried to create a feed for MySQL (engine 5) and got back an error:
Notice: Undefined offset: 0 in /var/www/emoncms/Modules/feed/feed_model.php on line 98 Fatal error: Call to a member function create() on a non-object in /var/www/emoncms/Modules/feed/feed_model.php on line 98
After that I could not even see the previous feeds anymore; so obviously something went totally wrong ... ;-((
Any help would be very appreciated. Thanks a lot. And best regards
Arwed
Post title changed from; 'issues with Feed API on EmonHub' to 'problems using emoncms feed api' as per pb66's post below.
Paul Reed - Moderator
Re: Problems using emoncms feed api
Hi Arwed
Your use of the emoncms api's totally bypass emonhub altogether.
The " problems using emoncms feed api " ( could be a better title ) will probally be due to using the "low-write" version of emonCMS, you can only append data, you cannot insert or edit data. You can also only use certain data feed types (ie not sql). These measures are what makes it "low-write" and therefore able to be run on an SD card, if you need full emonCMS functionality you will need to install "full" emoncms to a HDD.
see https://github.com/emoncms/emoncms/blob/bufferedwrite/readme.md for more info on the "low-write" version of emoncms.
Paul
Post moved and edited by Paul Reed - Moderator
Re: Problems using emoncms feed api
Paul answered in the other thread, that "... you can only append data, you cannot insert or edit data. You can also only use certain data feed types (ie not sql). These measures are what makes it "low-write" and therefore able to be run on an SD card ...".
What API function could be used for appending? Feed API help lists either insert or update. Do you have any suggestion? Reason why I'm asking is that I'm looking for an easy way to transfer old data from a MySQL based EmonCMS that was running for quite a long time to the freshly installed EmmonHub.
Many thanks for any help in advance ...
Arwed
Re: Problems using emoncms feed api
Paul answered in the other thread, that "... you can only append data, you cannot insert or edit data. You can also only use certain data feed types (ie not sql). These measures are what makes it "low-write" and therefore able to be run on an SD card ...".
Agreed, so why did you repost the exact same question?
Paul
Re: Problems using emoncms feed api
Hi Arwed
When I say the data needs to be "appended" that is not a command or a function but a pointer to how the data needs to be delivered to a low-write emonCMS data feed, as in " data can not be inserted or edited it can only be added to the end of the existing data file ". I cannot tell you exactly how to do it because I haven't tried it but I think you should use the input API to input data. maybe something along the lines of
1. Use an input API URL string to automatically create an input matching the data format you need to import.
2. Create a feed to store data in the normal way by attaching it to an input.
3. use the "bulk" input API to send the data in batches of say 200, this will probably involve writing a script to loop through your sql or csv data.
4.once all the data is uploaded you can delete the input and move on to the next feed(s)
There is no "easy way" I'm afraid ! and you cannot transfer data to emonHub, emonHub is just an interface for emonCMS you are totally bypassing emonHub by using emonCMS API's to input data directly into emonCMS.
If what you really want is to transfer your older SQL emonCMS data to a newer "low-write" version of emonCMS, which uses the later data storage methods. Maybe you should have started a thread " how to transfer old SQL data into new emonCMS install " or something similar.
This is something that has been asked before but I don't think there is a common method yet, so you may be able to get some pointers by searching the forum for terms including "restoring" "uploading" "sql data" etc
Paul


Here is Alexis.
Here is Samarria.
Here is a picture from the X-games.
Is the Olympics on?
We are Brooklyn Projects. You find the freshet gear.
Here is Alexis.
Here is Samarria.
Here is a picture from the X-games.
Is the Olympics on?
We are Brooklyn Projects. You find the freshet gear.


If you are viewing this page (firstPage), it means that the current browser URL ends with "#firstPage"
#firstPage | #secondPage | #thirdPage | #fourthPageIf you are viewing this page (secondPage), it means that the current browser URL ends with "#secondPage"
#firstPage | #secondPage | #thirdPage | #fourthPageIf you are viewing this page (thirdPage), it means that the current browser URL ends with "#thirdPage"
#firstPage | #secondPage | #thirdPage | #fourthPageIf you are viewing this page (fourthPage), it means that the current browser URL ends with "#fourthPage"
#firstPage | #secondPage | #thirdPage | #fourthPage


I know this is animation very obnoxious but I am using it anyway.
My name is Aidan and I am a budding web developer. welcome to my website.
This website is built from scratch through raw html CSS and JavaScript. I am using no Site Builders. For people asking when I am going to update the site.
I have school and am very busy this is a side project when I have nothing else to do.


Ji Sung assembles a team of handsome actors for his new tvN running variety
by beansssJi Sung will be heading up a new type of variety program next year on tvN, titled 'Run'!
Through tvN's 'Run', Ji Sung will be assembling his very own running crew in order to seek out some of the best running courses both in Korea and overseas, capturing his love of running and exercise. Later on, the crew will train themselves in order to take part in a marathon in Italy.
Joining Ji Sung in his handsome crew of actor-turned-runners are Kang Ki Young of 'At Eighteen', Lee Tae Sun of 'Hotel Del Luna', and Hwang Hee of 'Arthdal Chronicles'. Kang Ki Young even has experience as a former marathon endorsement model.
Will you be watching Ji Sung's 'Run' on tvN, airing some time in mid-January of next year?


gulp_place("app._BUILD_.example_el= toELID(app._BUILD_.example_el_id++)", "eval"); gulp_place("app._BUILD_.example_onkeyup= toKeyUp(app._BUILD_.example_el)", "eval");
Method .update
is also avilable outside function scope (is included in .share
namespace):


______ _ ________ _ _ ______ _______ _ _ _____ | ____/\ | |/ / ____| \ | | ____|__ __| | \ | |/ ____| | |__ / \ | ' /| |__ | \| | |__ | |______| \| | | __ | __/ /\ \ | < | __| | . ` | __| | |______| . ` | | |_ | | | / ____ \| . \| |____| |\ | |____ | | | |\ | |__| | |_|/_/ \_\_|\_\______|_| \_|______| |_| |_| \_|\_____| H T T P L I S T E N E R
FakeNet-NG is a next generation dynamic network analysis tool for malware analysts and penetration testers. It is open source and designed for the latest versions of Windows.
The tool allows you to intercept and redirect all or specific network traffic while simulating legitimate network services. Using FakeNet-NG, malware analysts can quickly identify malware's functionality and capture network signatures. Penetration testers and bug hunters will find FakeNet-NG's configurable interception engine and modular framework highly useful when testing application's specific functionality and prototyping PoCs.
FakeNet-NG is based on the excellent Fakenet tool developed by Andrew Honig and Michael Sikorski.


| Hostname |
IP |
Patch Patch? |
Requires Reboot |
Time since last ack |
% for agent in data:
${agentrow(agent)}
% endfor
Show all
Show applied
Show available
<%def name="agentrow(agent)">
| ${agent["ip"]} |
${agent["hostname"]} |
${agent["patch_current"]} |
${agent["requires_reboot"]} |
${agent["secs_since_ack"]} |
%def>


FC and ZD Integration
Looking for a Contact/Lead...
Contact Details
Lead Details
No Contacts/Leads found.
Create New
Email ID is empty.
Update the Email ID to create Contact or Lead.


--- layout: post title: "Leaky abstraction by omission" description: "Sometimes, an abstraction can be leaky because it leaves something out." date: 2021-04-26 15:10 UTC tags: [Software Design] --- {% include JB/setup %}
{{ page.description }}
Consider the following interface definition. What's wrong with it?
public interface IReservationsRepository { Task Create(int restaurantId, Reservation reservation); Task<IReadOnlyCollection<Reservation>> ReadReservations( int restaurantId, DateTime min, DateTime max); Task<Reservation?> ReadReservation(Guid id); Task Update(Reservation reservation); Task Delete(Guid id); }
Perhaps you think that the name is incorrect; that this really isn't an example of the Repository design pattern, as it's described in Patterns of Enterprise Application Architecture. Ironically, of all patterns, it may be the one most affected by semantic diffusion.
That's not what I have in mind, though. There's something else with that interface.
It's not its CRUD design, either. You could consider that a leaky abstraction, since it strongly implies a sort of persistent data store. That's a worthwhile discussion, but not what I have in mind today. There's something else wrong with the interface.
Look closer at the parameters for the various methods. The Create
and ReadReservations
methods take a restaurantId
parameter, but the other three don't.
Why does the ReadReservations
method take a restaurantId
while ReadReservation
doesn't? Why is that parameter required for Create
, but not for Update
? That doesn't seem consistent.
The reason is that each reservation has an ID (a GUID). Once the reservation exists, you can uniquely identify it to read, update, or delete it.
As the restaurantId
parameter suggests, however, this interface is part of a multi-tenant code base. This code base implements an online restaurant reservation system as a REST API. It's an online service where each restaurant is a separate tenant.
While each reservation has a unique ID, the system still needs to associate it with a restaurant. Thus, the Create
method must take a restaurantId
parameter in order to associate the reservation with a restaurant.
Once the reservation is stored, however, it's possible to uniquely identify it with the ID. The ReadReservation
, Update
, and Delete
methods need only the id
to work.
On the other hand, when you're not querying on reservation ID, you'll need to identify the restaurant, as with the ReadReservations
methods. If you didn't identify the restaurant in that method, you'd get all reservations in the requested range, from all tenants. That's not what you want. Therefore, you must supply the restaurantId
to limit the query.
The interface is inconsistent, but also allows the underlying implementation to leak through.
If I told you that the implementation of IReservationsRepository
is based on a relational database, can you imagine the design? You may want to stop reading and see if you can predict what the database looks like.
The interface strongly implies a design like this:
CREATE TABLE [dbo].[Reservations] ( [Id] INT IDENTITY (1, 1) NOT NULL, [At] DATETIME2 (7) NOT NULL, [Name] NVARCHAR (50) NOT NULL, [Email] NVARCHAR (50) NOT NULL, [Quantity] INT NOT NULL, [PublicId] UNIQUEIDENTIFIER NOT NULL, [RestaurantId] INT NOT NULL, PRIMARY KEY CLUSTERED ([Id] ASC), CONSTRAINT [AK_PublicId] UNIQUE NONCLUSTERED ([PublicId] ASC) );
What I wrote above is even clearer now. You can't create a row in that table without supplying a RestaurantId
, since that column has a NOT NULL
constraint.
The PublicId
column has a UNIQUE
constraint, which means that you can uniquely read and manipulate a single row when you have an ID.
Since all reservations are in a single table, any query not based on PublicId
should also filter on RestaurantId
. If it doesn't, the result set could include reservations from all restaurants.
Is the above relational database design the only possible implementation? Perhaps not. You could implement the interface based on a document database as well. It'd be natural to store each reservation as a separate document with a unique ID. Again, once you have the ID, you can directly retrieve and manipulate the document.
Other implementations become harder, though. Imagine, for example, that you want to shard the database design: Each restaurant gets a separate database. Or perhaps, more realistically, you distribute tenants over a handful of databases, perhaps partitioned on physical location, or some other criterion.
With such a design, the ReadReservation
, Update
, and Delete
methods become more inefficient. While you should be able to identify the correct shard if you have a restaurant ID, you don't have that information. Instead, you'll have to attempt the operation on all databases, thereby eliminating most sharding benefits.
In other words, the absence of the restaurantId
parameter from some of the methods suggests certain implementation details.
I admit that I rarely run into this sort of problem. Usually, a leaky abstraction manifests by a language construct that contains too much information. This is typically an interface or base class that exposes implementation details by either requiring too specific inputs, or by returning data that reveals implementation details.
For a data access abstraction like the above 'repository', this most frequently happens when people design such an interface around an object-relational mapper (ORM). A class like Reservation
would then typically carry ORM details around. Perhaps it inherits from an ORM base class, or perhaps (this is very common) it has a parameterless constructor or getters and setters that model the relationships of the database (these are often called navigation properties).
Another common examples of a leaky abstraction might be the presence of Connect
and Disconnect
methods. The Connect
method may even take a connectionString
parameter, clearly leaking that some sort of database is involved.
Yet another example is CQS-violating designs where a Create
method returns a database ID.
All such leaky abstractions are leaky because they expose or require too much information.
The example in this article, on the contrary, is leaky because of a lack of detail.
Ironically, I originally arrived at the above design because I followed the Dependency Inversion Principle (DIP). The clients of IReservationsRepository
are ASP.NET Controller actions, like this Delete
method:
[HttpDelete("restaurants/{restaurantId}/reservations/{id}")] public async Task Delete(int restaurantId, string id) { if (Guid.TryParse(id, out var rid)) { var r = await Repository.ReadReservation(rid) .ConfigureAwait(false); await Repository.Delete(rid).ConfigureAwait(false); if (r is { }) await PostOffice.EmailReservationDeleted(restaurantId, r) .ConfigureAwait(false); } }
As Robert C. Martin explains about the Dependency Inversion Principle:
From that principle, it follows that the"clients [...] own the abstract interfaces"
Delete
method decides what IReservationsRepository.Delete
looks like. It seems that the Controller action doesn't need to tell the Repository
about the restaurantId
when calling its Delete
method. Supplying the reservation ID (rid
) is enough.
There are, however, various problems with the above code. If the DIP suggests that the restaurantId
is redundant when calling Repository.Delete
, then why is it required when calling PostOffice.EmailReservationDeleted
? This seems inconsistent.
Indeed it is.
As I often do, I arrived at the above Delete
method via outside-in TDD, but as I observed a decade ago, TDD alone doesn't guarantee good design. Even when following the red-green-refactor checklist, I often fail to spot problems right away.
That's okay. TDD doesn't guarantee perfection, but done well it should set you up so that you can easily make changes.
I can think of two ways to address the problem. The simplest solution is to make the interface consistent by adding a restaurantId
parameter to all methods:
public interface IReservationsRepository { Task Create(int restaurantId, Reservation reservation); Task<IReadOnlyCollection<Reservation>> ReadReservations( int restaurantId, DateTime min, DateTime max); Task<Reservation?> ReadReservation(int restaurantId, Guid id); Task Update(int restaurantId, Reservation reservation); Task Delete(int restaurantId, Guid id); }
This is the simplest solution, and the one that I prefer. In a future article, I'll show how it enabled me to significantly simplify the code base.
For good measure, though, I should also mention the opposite solution. Completely drain the interface of restaurantId
parameters:
public interface IReservationsRepository { Task Create(Reservation reservation); Task<IReadOnlyCollection<Reservation>> ReadReservations( DateTime min, DateTime max); Task<Reservation?> ReadReservation(Guid id); Task Update(Reservation reservation); Task Delete(Guid id); }
How can that work in practice? After all, an implementation must have a restaurant ID in order to create a new row in the database.
It's possible to solve that problem by making the restaurantId
an implementation detail. You could make it a constructor parameter for the concrete class, but this gives you another problem. Your Composition Root doesn't know the restaurant ID - after all, it's a run-time argument.
In a method like the above Delete
Controller action, you'd have to translate the restaurantId
run-time argument to an IReservationsRepository
instance. There are various ways around that kind of problem, but they typically involve some kind of factory. That'd be yet another interface:
public interface IReservationsRepositoryFactory { IReservationsRepository Create(int restaurantId); }
That just makes the API more complicated. Factories give Dependency Injection a bad reputation. For that reason, I don't like this second alternative.
Leaky abstractions usually express themselves as APIs that expose too many details; the implementation details leak through.
In this example, however, a leaky abstraction manifested as a lack of consistency. Some methods require a restaurantId
argument, while others don't - because one particular implementation doesn't need that information.
It turned out, though, that when I was trying to simplify the overall code, this API design held me back. Consistently adding restaurantId
parameters to all repository methods solved the problem. A future article tells that tale.
The code shown here is part of the sample code base that accompanies my book Code That Fits in Your Head.
Comments
Thank you for the article Mark.
I was wondering whether another solution would be including restaurantId as a member of Reservation? That way it’s not needed by the Create method.
That just leaves ReadReservations as the last method that requires a restaurant ID, but one could argue a specialized read method such as this one doesn’t belong on a repository anyway. I personally tend to interpret these kinds of methods on a repository as a code smell on projects of a certain size.
I might just be missing the point of your article, but I would love to hear your thoughts. :)
Tobias, thank you for writing. You raise a good point, and it might be an appropriate way to model the problem. While the thought had already crossed my mind, I must admit that I hadn't given it much thought.
For the individual CRUD operations, I admit that it might be an appropriate design option. You do, however, also point to the
ReadReservations
method as the odd man out. I applaud the intellectual honesty you exhibit by bring this up yourself, and I don't intend to misuse it by shooting down your idea. The fact that this method is somehow different might be an indication that it doesn't belong as a member of the same interface as the other four methods.If that's the case, though, then where does it belong? One option would be to define all interfaces with only a single method:
How should we deal with the
restaurantId
parameter in such an interface? Should it be included, as is the case here, or should we exclude it from the interface definition, like the following?If we choose to exclude the
restaurantId
parameter from the interface, it'd be consistent with the CRUD interface that you imply. On the other hand, wouldn't it require some sort of factory, as I outlined above?Conversely, if we decide to keep the
restaurantId
parameter as part of the interface definition, it seems inconsistent with the design your suggestion implies.I'm not writing this to shoot down your suggestion. I find it a real conundrum.
I do think, though, that this might be an indication that there's some kind of abstraction that I've failed to make explicit. Some kind of Restaurant or Tenant type seems most likely.
My problem is that I actually do have a
Restaurant
class in my code base. That one, however, is a Value Object, so I'm loath to add impure methods to it.For what it's worth, it's deliberation like this that makes software design interesting. You need to balance opposing forces. A good design is one that does so in a stable way. I'm not claiming that the code shown here does that. You've clearly put your finger on a sore spot, which suggests to me that there's more work to be done. Thank you for the inspiring input!
Hi Mark, thank you for another great article!
I have worked on several small multi-tenant systems and I faced the same problem as you with the repository interface methods and the "tenant id" being mixed.
After several attempts and API iteration, my final design was to use what Steven van Deursen calls The Ambient Composition Model.
The idea is to inject an
ITenantContext
in theIReservationsRepository
implementation and to use it as needed :In my case the implementation of the
ITenantContext
was retrieving the tenant from the route of the method. I think it could be the same for resolving therestaurantId
.This solution seems similar to your Factory solution but I'm not totally sure. In any case, like the Factory solution, this solution is heavier that the first you proposed.
Nonetheless I find some elegance in this solution with the tenant being injected by request in the implementation. What do you think? Did you have the same idea with the Factory solution?
Thibaut, thank you for writing. Yes, that's another option. I've done something similar to that in the past.
In a sense, the concept of a tenant seems almost like a cross-cutting concern, so it makes sense to let it fade into the background, so to speak.
The reason I'm not too keen on that any longer is that it seems a bit too 'clever' in most settings. Consider the
Delete
Controller action shown above. Imagine that we injectrestaurantId
into all services - not onlyIReservationsRepository
, but also intoIPostOffice
. TheDelete
method might look like this, then:The
restaurantId
parameter still has to be present, even though it's unused. This is likely to be puzzling to any developer not intimately familiar with the code base.It's possible that you can pull some trick with the ASP.NET framework so that the parameter doesn't have to be there, but it'll still be present in the URL, and again, I'm concerned that most developers would be confused about this.
There's also another thing that bothers me about design like this: You can pull the restaurant ID out of the method's routing data, but this implies that you can do the same with the reservation ID. What makes the restaurant ID special, that it ought to be an injected dependency, while the reservation ID isn't?
I'm concerned that the answer to that question might be 'hand-wavy'. And if we can't defend making one ID a dependency and the other not, then we might take this to the logical conclusion and inject all routing values into services. If we do that, the
Delete
method might now look like this:(I haven't tried to compile this, so there may be syntax errors.)
This seems really odd, although it's possible that we can salvage it by calling the dependency something else than
Repository
. It's not really a Unit of Work, but seems closer to that sort of design.I agree that a tenant feels like something that ought to be 'automatically handled', but I wonder whether it's possible to do that without making the code 'too clever'.
How would YAGNI come into play here? For instance, imagine your "client" code wasn't the Delete endpoint, but it was another app or endpoint that only had a "Guid reservationId", but not an "int restaurantId". In such case, wouldn't you be forced to add the restaurantId to the client code? What if this client code doesn't have an easy way to obtain such restaurantId? The reservation id is a global identifier, thus it makes sense that some application (be it a service, console, etc) would just get hold of the guid and nothing else, it's universally identifiable after all, it should be able to identify the reservation uniquely. This may require more roundtrips to the database, or forcing another client one-level above to provide the restaurantId (and this may even require politics and management to get in).
Wouldn't YAGNI say that you shouldn't add the restaurantId to the API, since you ain't gonna need it? I.e, you likely won't change your data access implementation or shard the database in a way that would require that additional restaurantId, and even if you did, perhaps the development effort to add the restaurantId would be the same in that future timeline as it would be right now, so it would be the same to make this change now or afterwards (and in such case, wouldn't it make much sense to make the change afterwards, when you actually need it?).
Gonzalo, thank you for writing. The short answer is that I only 'discovered' the leaky abstraction because I did, in fact, need the restaurant ID. As part of creating, modifying, or deleting reservations, I also wanted to send email updates. For example, when updating a reservation, the system should send an email with a subject line like "Your reservation for Nono changed."
This meant that I had to figure out which name to put in the subject line. Given the restaurant ID, this is trivial, but without it, the system would first have to make a 'reverse lookup' to find the restaurant associated with the reservation ID. While it's technically possible, it seems overly complicated given that the
restaurantId
was already available at the entry point.It's true that since the reservation ID is a GUID, it's globally unique. This, however, is an implementation detail. The system doesn't allow external client to refer to a reservation exclusively by a GUID. Rather, from the perspective of an external client, the ID of a reservation looks like
https://api.example.com/restaurants/90125/reservations/667fd3ca5d6943b993860809adc99ad5?sig=aqwnNXj28J547upBELNf5I6yPIrQ%2BG9DG2QIAlOpgOE%3D
. While both restaurant and reservation IDs are visible within that string, a client can't use those IDs. The external reservation ID is the full (conceptually opaque) string.I agree, though, that YAGNI is relevant in this context, too. If it's any consolation, I didn't change the code 'just in case' - I did, in fact, change it because I realised that I needed the modified design. But I admit that I didn't explicitly state that in this article.
You may also find the above discussion relevant.


--- feature: /images/blog/cnc.jpg title: CNC at Ballarat Hackerspace tags: CNC, 2015, hackerspace, test print ---
The week has been very productive, with the space's CNC becoming fully operational. Controlled by a PC, this gives precision cutting and routing of objects.
The objects you can use include plastics, woods (seen here on the first functional test print), and even soft metals. It moves at a decent pace, with the drill cutting into the wood easily.
The next step is to work on the accuracy of the CNC. This will mean more calibration, and more test runs! One of the goals is to use this with milling some of the parts needed in the construction of 3D Printers.
Like any new project, there was some initial troubles with being able to talk to the CNC effectively. After sourcing of additional parts, and many more settings tweaks, we are starting to have more success.
It's great to see new equipment working at the space, and brainstorming how it can be used with new and old projects.
In a future post, we will have a look at how the Drone/Multi-copters are going - 3D Printed frames and all kinds of fun are happening there!


This site does NOT use cookies and does NOT track you in any way! If you see ads or trackers on this site contact me through this repository as soon as you can.
Feel free to download and make changes to this app to better suit your preferences.
Go back


Profile Settings
Social Connections
{{alert.msg}}
Disconnect {{property.text}}
Connect {{property.text}}
Identity
{{alert.msg}}
Username:
{{ user.username }}
Email:
{{ user.email }}
Photo Upload
Drop Image Here
X
{{file.name}}
Upload
+1 pt
Property Detail
{{alert.msg}}
Property Type:
Residential
Multi-Family
Commercial
Land
This field is required
2
3
4
Apt Complex
Mixed Use
Other
This field is required
This field is required
Do you know if this property is build-able?
Yes
No
Unknown
Property Address:*
This field is required
+1 pt
City:*
This field is required
State:
Zip:*
This field is required
County:
Owner First Name:*
This field is required
Owner Last Name:*
This field is required
+1 pt
Owner Phone:*
This field is required
+1 pt
Owner Cell:*
This field is required
Owner Email:*
This field is required
+1 pt
Beds:*
This field is required
Baths:*
This field is required
Asking Price:*
This field is required
+1 pt
Does this fit our cash offer BUY formula:
ARV X 65% - repairs = Good Deal?
Yes
No
"In order for us to purchase properties, they need to make investment sense."
Would you like to override and still submit?
-----Reason for Override Submission-----
Repairs Estimate:*
This field is required
+1 pt
Repair Needed:*
Roof
Kitchen
Bath(s)
Paint
Carpet
Windows
Furnance
Drywall
Plumbing
Electrical
Additional/Repairs & Details:*
This field is required
Occupancy:
Owner Occupied
Tenant Occupied
Vacant
This field is required
Is the property listed on the MLS?:*
Yes
No
This field is required
*Please note, we are looking for unlisted properties only.
Would you like to override and still submit?
-----Reason for Still Submitting-----
Property Details:*
This field is required
+1 pt
Tax Record Link:*
This field is required
Zillow Link:*
link zillow
Offer Amount Accepted:*
(Optional) -
Have an accepted offer already?
Make more money!
This field is required
+2 pt
ARV:*
This field is required
In order for us to purchase properties, they need to make investment sense. Would you like to override and still submit?
Yes
No
-----Reason for Still Submitting-----
Status:*
{{statusType.statusName}}
Total Point:
{{sumPoint()}}
Update


There are no {{offers == redemptions ? 'redemption' : 'earning'}} opportunities available at this time.
{{offer.reward_value | number}}
poynts
{{offer.enddate | date:'M/dd/yy'}}
{{offer.title}}
{{offer.redem_value | number}}
poynts
{{offer.enddate | date:'M/dd/yy'}}
{{offer.title}}
{{offer.title}}
{{offer.ent_name}}
Show More
Show Less
About
{{enterprise.profile_details}}
There are no {{offers == redemptions ? 'redemption' : 'earning'}} opportunities available at this time.
{{offer.reward_value | number}}
poynts
{{offer.enddate | date:'M/dd/yy'}}
{{offer.title}}
{{offer.redem_value | number}}
poynts
{{offer.enddate | date:'M/dd/yy'}}
{{offer.title}}
{{offer.title}}
{{offer.ent_name}}
Show More
Show Less
About {{enterprise.ent_name}}
{{enterprise.ent_desc}}


Help
This panel is visible only the first time you open the application.
You can expand it using a left swipe gesture.
To display this panel again, clear cookies or use the top-left button and reload the page.


Volunteer at the dog shelter!
Help the needle exchange!
Get CPR certified!
Donate through Simul!
Broke up a bar fight.
Helped a child find his parents.
Donated 30 lbs of steak to the homeless shelter.
Helped pick me up after I was side swiped by a car on my bike.
Helped me carry my groceries to my car.
Brought dinner to the homeless man next to the 12th st BART.
Held the door for me.
Started coaching a soccer team in the local neighborhood.
Helped somebody fix a postgreSQL problem for over 3 hours.
Performed CPR on a drowning child at the local pool.
Sep 12, 2016 Tanya Lindermeier says:
Volunteered at the dog shelter.


{% extends "base.html" %} {% block head_title %}Search results | Selling online overseas{% endblock head_title %} {% block head_meta_description %}Read and review the results. Compare, then select online marketplaces that are suitable for your products.{% endblock head_meta_description %} {% load static utils %} {% block content %}


Modem Radio Control
The Modem Radio Control (MRC) APIs is used to control cellular network environments.
It's important for many M2M apps to know details about cellular network environments (like network registration and signal quality). It allows you to limit some M2M services based on the reliability of the network environment, and provides information to control power consumption (power on or shutdown the radio module).
IPC interfaces binding
All the functions of this API are provided by the modemService service.
Here's a code sample binding to modem services:
bindings: { clientExe.clientComponent.le_mrc -> modemService.le_mrc }
Radio Power Management
le_mrc_SetRadioPower() API allows the application to power up or shutdown the radio module.
le_mrc_GetRadioPower() API displays radio module power state.
A sample code can be seen in the following page:
Radio Configuration preferences
The following functions let you configure and retrieve the radio configuration preferences: le_mrc_SetAutomaticRegisterMode(), le_mrc_SetManualRegisterMode() and le_mrc_GetRegisterMode() let you set/get the selected Scan mode.
le_mrc_SetBandPreferences(), le_mrc_GetBandPreferences() let you set/get the 2G/3G band preferences by using a bit mask built with le_mrc_BandBitMask_t
The 2G/3G band preferences can be:
- Band-Class-0-A-System
- Band-Class-0-B-System
- Band-Class-1-All-Blocks
- Band-Class-2-Placeholder
- Band-Class-3-A-System
- Band-Class-4-All-Blocks
- Band-Class-5-All-Blocks
- Band-Class-6
- Band-Class-7
- Band-Class-8
- Band-Class-9
- Band-Class-10
- Band-Class-11
- Band-Class-12
- Band-Class-13
- Band-Class-14
- Band-Class-15
- Band-Class-16
- Band-Class-17
- Band-Class-18
- Band-Class-19
- GSM-DCS-1800
- E-GSM-900 (for Extended GSM 900 band)
- Primary-GSM-900
- GSM-450
- GSM-480
- GSM-750
- GSM-850
- GSMR-900 (for GSM Railways GSM 900 band)
- GSM-PCS-1900
- WCDMA-EU-J-CH-IMT-2100 (for WCDMA Europe, Japan, and China IMT 2100 band)
- WCDMA-US-PCS-1900 (for WCDMA U.S. PCS 1900 band)
- WCDMA-EU-CH-DCS-1800 (for WCDMA Europe and China DCS 1800 band)
- WCDMA-US-1700 (for WCDMA U.S. 1700 band)
- WCDMA-US-850 (for WCDMA U.S. 850 band)
- WCDMA-J-800 (for WCDMA Japan 800 band)
- WCDMA-EU-2600 (for WCDMA Europe 2600 band)
- WCDMA-EU-J-900 (for WCDMA Europe and Japan 900 band)
- WCDMA-J-1700 (for WCDMA Japan 1700 band)
le_mrc_SetLteBandPreferences(), le_mrc_GetLteBandPreferences() let you set/get the LTE band preferences by using a bit mask built with le_mrc_LteBandBitMask_t
.
The LTE band preferences can be 0 to 43 except 15, 16, 22, 23, and 26 to 32.
le_mrc_SetTdScdmaBandPreferences(), le_mrc_GetTdScdmaBandPreferences() let you set/get the TD-SCDMA band preferences by using a bit mask built with le_mrc_TdScdmaBandBitMask_t
The TD-SCDMA band preferences can be 'A' to 'F'
- Warning
- Ensure to check the supported preferences for your specific platform.
le_mrc_AddPreferredOperator() , le_mrc_RemovePreferredOperator() to add/remove a preferred operator by specifying the MCC/MNC and the Radio Access Technology.
le_mrc_GetPreferredOperatorsList(), le_mrc_GetFirstPreferredOperator(), le_mrc_GetNextPreferredOperator(), le_mrc_DeletePreferredOperatorsList(), le_mrc_GetPreferredOperatorDetails() let you retrieve a list of the selected preferred operators and get their details.
A sample code can be seen in the following page:
Radio Capabilities
le_mrc_GetBandCapabilities() let you get the 2G/3G band capabilities by retrieving a bit mask built with le_mrc_BandBitMask_t
le_mrc_GetLteBandCapabilities() let you get the LTE band capabilities by retrieving a bit mask built with le_mrc_LteBandBitMask_t
le_mrc_GetTdScdmaBandCapabilities() let you get the TD-SCDMA band capabilities by retrieving a bit mask built with le_mrc_TdScdmaBandBitMask_t
A sample code can be seen in the following page:
Radio Access Technology (RAT)
le_mrc_GetRadioAccessTechInUse() API retrieves the current active Radio Access Technology.
The application can register a handler function to retrieve the Radio Access Technology each time the RAT changes.
le_mrc_AddRatChangeHandler() API installs a RAT change handler.
le_mrc_RemoveRatChangeHandler() API uninstalls the handler function.
le_mrc_SetRatPreferences(), le_mrc_GetRatPreferences() let you set/get the Radio Access Technology preferences by using a bit mask built with le_mrc_RatBitMask_t
.
The Radio Access Technology preferences can be:
- CDMA (CDMA2000-1X + CDMA2000-HRPD)
- GSM
- UMTS (UMTS + TD-SCDMA)
- LTE
- Note
- LE_MRC_BITMASK_RAT_ALL value can be used to select the RAT in automatic mode.
A sample code can be seen in the following page:
Network Registration
le_mrc_GetNetRegState() API retrieves the radio module network registration status.
The application can register a handler function to retrieve the registration status each time the registration state changes.
le_mrc_AddNetRegStateEventHandler() API installs a registration state handler.
le_mrc_RemoveNetRegStateEventHandler() API uninstalls the handler function.
- Note
- If only one handler is registered, the le_mrc_RemoveNetRegStateHandler() API resets the registration mode to its original value before any handler functions were added.
le_mrc_SetManualRegisterMode() API manually registers on a cellular network.
A sample code can be seen in the following page:
Signal Quality
le_mrc_GetSignalQual() retrieves the received signal strength details.
You must call le_mrc_MeasureSignalMetrics() to measure the signal metrics of the serving cell (aka the 'serving' cell). It returns a reference of le_mrc_MetricsRef_t type.
When the signal metrics are no longer needed, you must call le_mrc_DeleteSignalMetrics() to free all allocated ressources associated with the Metrics object.
le_mrc_GetRatOfSignalMetrics() returns the Radio Access Technology of the signal measures.
le_mrc_GetGsmSignalMetrics() the signal strength in dBm and the bit error rate measured on GSM network.
le_mrc_GetUmtsSignalMetrics() returns the signal metrics measured on UMTS network.
le_mrc_GetLteSignalMetrics() returns the signal metrics measured on LTE network.
le_mrc_GetCdmaSignalMetrics() returns the signal metrics measured on CDMA network.
The application can register a handler function to get notifications when the signal strength changes of a certain threshold value.
le_mrc_AddSignalStrengthChangeHandler() API installs a signal strength change handler. The RAT, the lower-range and the upper-range thresholds must be passed as input parameters. These parameters are updated each time the function is called, the previous thresholds are replaced by the new ones if the function is called with the same RAT.
The event is notified when we cross the range limits in both direction.
le_mrc_RemoveSignalStrengthChangeHandler() API uninstalls the handler function.
A sample code can be seen in the following page:
Serving cell's location information
le_mrc_GetServingCellId() retrieves the the serving Cell Identifier.
le_mrc_GetServingCellLocAreaCode() retrieves the Location Area Code of the serving cell.
A sample code can be seen in the following page:
Current Network Information
le_mrc_GetCurrentNetworkName() retrieves the Current Network Name. le_mrc_GetCurrentNetworkMccMnc() retrieves the Current Network PLMN information.
A sample code can be seen in the following page:
Network Scan
Call le_mrc_PerformCellularNetworkScan() to fill a list of all network in sight. You can go through all Scan Information by calling le_mrc_GetFirstCellularNetworkScan() and le_mrc_GetNextCellularNetworkScan().
For each Scan Information, you can call:
- le_mrc_GetCellularNetworkMccMnc() to have the operator code.
- le_mrc_GetCellularNetworkName() to get the operator name.
- le_mrc_GetCellularNetworkRat() to get the radio access technology.
- le_mrc_IsCellularNetworkInUse() to check if this is currently in use by the network.
- le_mrc_IsCellularNetworkAvailable() to check if this is available.
- le_mrc_IsCellularNetworkHome() to check if this is in home status.
- le_mrc_IsCellularNetworkForbidden() to check if this is forbidden by the network.
le_mrc_DeleteCellularNetworkScan() should be called when you do not need the list anymore.
A sample code can be seen in the following page:
Neighboring Cells Information
- Warning
- The following functions do not apply to CDMA network.
You must call le_mrc_GetNeighborCellsInfo() to retrieve the neighboring cells information. It returns a reference of le_mrc_NeighborCellsRef_t type.
When the neighboring cells information is no longer needed, you must call le_mrc_DeleteNeighborCellsInfo() to free all allocated resources associated with the object.
Then, you can use the following function to get the information:
- le_mrc_GetFirstNeighborCellInfo() and le_mrc_GetFirstNeighborCellInfo() allow to go among the single cell information retrieved with le_mrc_GetNeighborCellsInfo(). These two functions return a reference of le_mrc_CellInfoRef_t type.
- le_mrc_GetNeighborCellId() gets the identifier of the cell specified with the le_mrc_CellInfoRef_t parameter (can be called for any kind of RAT).
- le_mrc_GetNeighborCellLocAreaCode() gets the location area code of the cell specified with the le_mrc_CellInfoRef_t parameter (can be called for any kind of RAT). 0xFFFF value is returned if the value is not available.
- le_mrc_GetNeighborCellRxLevel() gets the signal strength (in dBm) of the cell specified with the le_mrc_CellInfoRef_t parameter (can be called for any kind of RAT).
- le_mrc_GetNeighborCellRat() gets the Radio Access Technology of the cell specified with the le_mrc_CellInfoRef_t parameter.
- le_mrc_GetNeighborCellUmtsEcIo() gets the Ec/Io (the received energy per chip divided by the power density in the band measured in dBm on the primary CPICH channel of serving cell) of the cell specified with the le_mrc_CellInfoRef_t parameter.
- le_mrc_GetNeighborCellLteIntraFreq() gets the RSRP and RSRQ of the Interfrequency of the cell specified with the le_mrc_CellInfoRef_t parameter.
- le_mrc_GetNeighborCellLteInterFreq() gets the RSRP and RSRQ of the Interfrequency of the cell specified with the le_mrc_CellInfoRef_t parameter.
A sample code can be seen in the following page:
c_mrcNeighborCells
Copyright (C) Sierra Wireless Inc. Use of this work is subject to license.


{% load i18n %}
{{ user_full_name }} has sent their program record for {{ program_name }}
{{ user_full_name }} would like to apply for credit in the {{ pathway_name }}.
Please view {{ user_full_name }}’s public program record to determine their credit eligibility status.


ICDAR 2021 Competition on Scene Video Text Spotting
DAVAR LAB
Official Website
[Competition Report] [Poster Video]
Introduction
Scene video text spotting (SVTS) is a text spotting system of localizing and recognizing text from continuous video frames, which usually contains multiple modules: video text detection, text tracking and the final recognition. It is an important research topic, because many real-world applications work in video mode such as license plate recognition in intelligent transportation system, road sign recognition in advanced driver assistance system or even online handwritten character recognition.
With the rapid development of deep learning techniques, great progress has been made in scene text spotting in static images. However, spotting text from video frames has much higher robustness requirements than the static OCR tasks for many applications. That is, SVTS will become much challenging when facing various environmental interferences (e.g., camera shaking, motion blur and immediate illumination changing etc.) as well as the real-time response requirement. Therefore, it is necessary to research efficient and robust SVTS systems to meet amount of practical application requirements.
SVTS 2021 competition will provide 129 video clips from 21 real-life scenarios. By establishing such a large-scale dataset with diversified scenarios, we hope more inspiring works can be proposed to solve this issue which has very promising applicational prospect.
As the organizor, we host place out of 30 teams in this timed challenge!
As the organizor, we host this competition.
Final Results
There are 46 valid submissions from 24 teams that participated in the threes tasks. Congratulations to the Tencent-OCR team who achieves the best scores in all of the three sub-tasks!
Submitted results has shown the abilities of state-of-the-art video text spotting systems. On one hand, we intend to keep on maintaining the ICDAR 2021 SVTS competition leaderboard to encourage more participants to submit and improve their results. On the other hand, we will extend this competition to multilingual competition for further promoting the research community.
For more details, please refer to the competitions website and official report.


;
Build A Portfolio Website
With all of the projects you will be working on here at Lambda School, you will need somewhere to house them! There is no better opportunity to learn and show off your skills than a beautiful portfolio website.
You have the ability to write HTML, CSS, and responsive media queries. You also know how to identify and write responsive units. It’s time to put that knowledge into action by reading someone else’s code and adding your own flavor. You will be building a portfolio website from a template found on https://html5up.net/.
Project Set Up
Follow these steps to set up and work on your project:
_ Watch this walk through video: https://youtu.be/P2Y9W29kcjs
- [ ] Create a forked copy of this project.
- [ ] Add PM as collaborator on Github.
- [ ] Clone your OWN version of the repository (Not Lambda’s by mistake!).
- [ ] Create a new branch on the clone:
git checkout -b <firstName-lastName>
.
- [ ] Implement the project on the
<firstName-lastName>
branch, committing changes regularly.
- [ ] Push commits:
git push origin <firstName-lastName>
.
Follow these steps to download your template and start the project:
- [ ] Navigate here: https://html5up.net/
- [ ] You make pick any template you like. Here are some good choices for a portfolio:
- [ ] Unzip the code and copy the site to your git repository that you just set up
- Note that we won’t be utilizing the pre processed CSS structure, you can just ignore any folder with LESS or SASS (SCSS) in it.
- [ ] Work on the MVP requirements listed below
Follow these steps for completing your project after your MVP is completed:
- [ ] Submit a Pull-Request to merge
<firstName-lastName>
Branch into master (student’s Repo). Please don’t merge your own pull request
- [ ] Add your Project Manager as a Reviewer on the Pull-request
- [ ] PM then will count the HW as done by merging the branch back into master.
MVP Requirements
- [ ] Study the code base and identify both responsive units and where media queries were used. Take notes on anything that confuses you or interesting things you find. Share this information in your standup meeting with your group
- [ ] Customize the template to you
- [ ] Update the title tag match your name
- [ ] Update the place holder content throughout the template to your information
- Some templates are much larger than others, you don’t need to fill in every little div with information, just try to get the site representing you and your work
- You can use sites like https://www.pexels.com/ for free images to fill in place holders
- Showcase projects you have worked on by providing some information and links to your git hub projects
- [ ] Implement proper attribution: Attribution is required under the creative commons license that came with the website files you downloaded. Be sure to provide attribution somewhere in the site. The templates should already come with attribution found in most footers but double check to be sure.
- [ ] Host your website for the world to see. Follow the instructions found here https://pages.github.com/. Once you have hosted your web page, share it for your peers to see. This is not a small feat!
Stretch
- [ ] Study the JavaScript used in your template and see if you can tweak any of the behavior to see how it works
- [ ] Download another template and see if you can get the CSS preprocessor working on the project


This tab will show all objects. The objects are grouped together in each class. Select an object in the tree view to see information about the object state.
The information about each object is:
· Object Name
· Object ID
· Owner (top-level VI that created the object)
· Full Class Name (unique name space)
· # of Users
· Counter (if enable or not)
· Valid Reference (is object alive)
· To String (value of the overridden ToString method, if implemented).
The state of the object (attributes value) for each inherited class in class hierarchy is shown as the object attributes control in the subpanel window.
|
Tab Control Selects between Objects, Trace or Active Debug mode. |
|
Refresh Refresh the object list. |
|
Destroy Destroys the selected object and runs the Destroy method of the class. |
|
Connect Connects to a remote target. Make sure G#DebugServer is running on the remote target. |
|
Garbage collect Garbage collects all objects of all classes. |
|
ObjectTree All objects that is currently alive. If objects been created with "no registration" option, they will not show up here. |
|
Inheritance Selects which attributes to watch from a inheritance chain. |
|
Attributes Selects between object or class attributes. |
|
Poll time (ms) Attributes polling time in ms. |
|
Highlight Aggregates? Highlights the aggregate objects in the object tree. |
|
Hide Empty Classes? Removes classes with no objects from the tree view. Notice that a class could still have valid class attributes. |
|
External Create Process Running Indicates if the background external create process is running. |
|
Window Transparency Transparency of the front panel window. |
|
Window Behaviour Selects if the debugger is on top of all VIs or not. |
|
# of Users Number of users for the selected object. |
|
Counter Indicates if counter is active or not for the selected object. |
|
Ref Valid Is the selected object valid? |
|
Object Name Name of the object (if named). |
|
Full Class Name Full class path including libraries. |
|
To String Shows the "To String" implementation of the selected object. |
|
G# Version Version of G#. |
|
Object ID Unique object identity. |
|
Application Instance Application instance of the object scope. |
|
Owner Owning top-level VI of the selected object. When this VI stops executing, LabVIEW will automatically garbage collect the object. |


In case of forms, reports, form folders and report folders, this is the hierarchical
path to the object, where the path elements are separated by a slash (/
).
In case of tables, this is the fully qualified name of the table, as required
by the database's table name composition rules.
In case of queries, this is the name of the query.
In case of virtual folders denoted by DatabaseObjectContainer::CATALOG and
DatabaseObjectContainer::SCHEMA, it is
<schema>
, if the database supports schemas only
<catalog>
, if the database supports catalogs only
<catalog>.<schema>
, if the database supports both
catalogs and schemas, and catalogs are to appear at the beginning of an identifier.
<schema>.<catalog>
, if the database supports both
catalogs and schemas, and catalogs are to appear at the end of an identifier.
In case of the virtual folders denoted by DatabaseObjectContainer::TABLES,
DatabaseObjectContainer::QUERIES, DatabaseObjectContainer::DATA_SOURCE,
DatabaseObjectContainer::FORMS or DatabaseObjectContainer::REPORTS,
this denotes the name of the data source (as denoted by
::com::sun::star::sdb::DataSource::Name)


5
1 My son, pay attention to my wisdom;
listen carefully to my understanding,
2 so you may learn about discretion,
and your lips may protect knowledge.
3 For the lips of an adulteress drip with honey,
and her mouth is smoother than oil,
4 but in the end she is as bitter as wormwood,
cutting like a sharp sword.
5 Her feet go down to death;
her steps go all the way to sheol.
6 She gives no thought to the path of life.
Her footsteps wander; she does not know where she is going.
7 And now, my sons, listen to me;
do not turn away from listening to the words of my mouth.
8 Keep your path far away from her,
and do not come near the door of her house.
9 In that way you will not give away your honor to others
or years of your life to a cruel person;
10 strangers will not feast on your wealth;
what you have worked for will not go into the house of strangers.
11 At the end of your life you will groan
when your flesh and your body waste away.
12 You will say, "How I hated discipline
and my heart despised correction!
13 I would not obey my teachers
or listen to my instructors.
14 I was almost completely ruined
in the midst of the assembly, among the gathering of the people."
15 Drink water from your own cistern,
and drink running water from your own well.
16 Should your springs overflow everywhere,
and your streams of water flow in the public squares?
17 Let them be for yourself alone,
and not for strangers with you.
18 May your fountain be blessed,
and may you rejoice in the wife of your youth.
19 For she is a loving deer and a graceful doe.


Computer Memory
August 10th, 2015
What exactly is computer memory? If your somewhat familiar around a computer, the chances are that you've heard the term before. Computer memory is pretty much what it sounds like. It is just a storage area for computers. It contains information and other data that is essential for a computer to be able to run properly.
A computers memory usually consists of millions of bytes. The unit K, is often referred to when you are talking about memory capacity for a computer. "K" stands for kilobytes. When talking about computer memory, you might also hear the term megabytes, and gigabytes. Megabytes equals to 1024 K, and gigabytes refers to 1024 megabytes!
There are two types of memory in a computer. There's "Read only memory", also referred to as "ROM". There's also "Random Access Memory", which is also called "RAM". ROM is the part of the computer that stores the permament memory that holds important information that allows the computer to do simple functions, like running a program, or being able to launch a game from your computer. RAM stores the input data that can be changed or erased. It is considered the "volatile" memory, because most of the data that it holds will be rebooted or erased when the computer is turned off. Both of these memory types are essential for a computer to be able to process things faster and efficiently. The more RAM and ROM you have on your computer, the better it is! It will allow programs and other applications to be ran at a faster and more efficient pace.
Computer memory is an essential part of the computers brain that is essential for storage of files and running simple applications. Without computer memory, where else would you be able to store information?? A computer without a place to store memory is pretty much not a computer!


Mission: Impossible is a series of American action films based on the television series of the same name. The series is produced by and stars Tom Cruise as Ethan Hunt, an agent of the fictional Impossible Missions Force (IMF).
The series has received a positive reception from critics and is the 19th-highest-grossing film series of all time, with a worldwide gross of over $3.1 billion to date. The sixth and most recent film, titled Mission: Impossible – Fallout, was released in July 2018..
Beginning in 1996, the films follow the missions of the IMF's main field team under the leadership of Hunt, who is forced to take over after the team is betrayed from within in the first film. The series focuses on Hunt as the lead character as opposed to the ensemble cast structure of the television series, although some characters, such as Luther Stickell (played by Ving Rhames) and Benji Dunn (played by Simon Pegg) have recurring roles in the films.


select...
search
ashok
prashanth
bejo jeffrin
arun pandi
sheik
seenivasagan
anand
gokul
vinoth
saravanan
arjun
nimal
fathil
search
Touch me


Click on a name to send mail to that person.
Leadership
Andrew Yaphe
John Sheahan
David Hamilton
Editors
Tournament hosts
MID-ATLANTIC
Maryland, College Park
Dave Hamilton
MIDWEST
University of Chicago
Mike Zarren
WEST
Berkeley
Jason Hong
SOUTH
Texas A&M
Chris Romero
SOUTHEAST
Georgia Tech
Hing Chan
NORTHEAST
MIT
Jake Parrott


The BitShares platform provides a feature known as "user-issued assets" to help facilitate profitable business models for certain types of services. The term refers to a type of custom token registered on the platform, which users can hold and trade within certain restrictions. The creator of such an asset publically names, describes, and distributes its tokens, and can specify customized requirements, such as an approved whitelist of accounts permitted to hold the tokens, or the associated trading and transfer fees.
BitShares allows individuals and companies to issue their own tokens for anything they can imagine. Common use cases include:
- Deposit Receipts
- Company Shares
- Event Tickets
- Rewards Points
- Individual or Corporate Debt
- Crowd Funding
- Digital Property
- Privatized SmartCoins (Stable Cryptocurrencies)
- Information/Prediction Markets
- How to Profit by Issuing an Asset
The potential use cases for user-issued assets are innumerable, and the regulations that apply to each kind of token vary widely, and are often different in every jurisdiction. BitShares provides the tools to allow issuers to remain compliant with all applicable regulations when issuing assets.
Following are a few example use cases for user-issued assets.
Deposit Receipts
Banks are simply companies that maintain a database of customer account balances and facilitate the transfer of these assets among their depositors. Companies like Dwolla and Paypal essentially issue deposit receipts, and then offer cheaper transfers among their users than between banks. With BitShares, it is now possible to move these internal databases onto the blockchain where the deposits can be used with other smart contracts such as the internal markets, escrow, or bonds.
In talking to many different banks and exchanges, we have learned a lot about what the law requires of those who wish to issue deposit receipts.
1. Know Your Customer
First and foremost the issuer must know every single customer. BitShares supports this by enabling both whitelists and blacklists. Rather than requiring every issuer to whitelist every customer separately, an issuer may specify a set of identity verifiers that they trust to do this job. This allows issuers to benefit from the network effect of validated users without having to do any direct identity verification themselves.
When an asset enables whitelists, no account may send or receive that asset without being on an authorized whitelist. An accounts funds can be frozen by removing them from the whitelist.
2. Asset Seizing
From time to time, an issuer may be required to seize funds as a result of a court order. While this may be unappealing to cryptocurrency purists, it is an unavoidable reality of trust-based assets. An issuer can determine whether or not they wish to revoke this privilege, but it may be a requirement in some jurisdictions.
3. Market Restriction
An issuer who offers both USD and EUR deposits may need to restrict direct trading between their USD and EUR assets to avoid being subject to foreign currency exchange regulations. Some cryptocurrency exchanges allow trading between fiat and cryptocurrencies, but not between two fiat currencies. Without this feature, many exchanges would be unable to issue their assets on the BitShares blockchain.
4. Transfer Restrictions
A transfer-restricted asset allows the holders of the asset to trade it in the markets but not transfer it from person to person. Only a few cryptocurrency exchanges allow user-to-user transfer of funds outside the market, because this particular activity is often subject to a different set of money transmission regulations.
The deposit receipt example is probably one of the most important, and yet most heavily regulated, use cases of user-issued assets.
Company Shares
Corporate shares are heavily regulated by the SEC, but none of those regulations prevent them from being issued or traded on an alternative trading system. The regulations in many jurisdictions require all shares to be registered (aka held by known identities). BitShares corporate shares can be used as collateral for a bond or be used in any number of smart contracts.
Event Tickets
Event tickets are a largely unregulated use case for user-issued assets. Tickets to a school play could be issued as digital tokens that are auctioned off to the highest bidder, who would then resell them. This ensures that the ticket issuer raises as much money as possible up front, while transferring the risk of ticket sales on to speculators.
On the day of the event, the issuer can freeze all trading of the asset and then allow users to cryptographically check in.
Rewards Points
Merchants around the world offer rewards points for loyal customers. These points are accumulated to earn discounts on future purchases. Rewards systems are a prime opportunity to add value by making them available to Bitshares smart contracts.
Individual or Corporate Debt
Many businesses raise money by selling bonds. With BitShares, these bonds can be made tradeable and/or fungible, which makes them more compelling to investors.
Crowd Funding
Whether being used as a transferable coupon for a pre-sale, or doing an IPO on a small company, issuing an asset is one of the most effective means of raising money for a cause.
Digital Property
Software and music licenses can be made transferable by issuing them as a digital asset. Every copy of a program can check to make sure that the user has control of a token before running. Software implementing such a licensing scheme can remain functional even if the company that produced the license goes out of business.
Trading cards can be simulated by creating many limited issue assets. Online games can use these assets to represent game items.
Privatized SmartCoins (Stable Cryptocurrencies)
Price-stable cryptocurrencies (aka SmartCoins) were the inspiration for BitShares. Now, users can create their own price-stable assets with custom parameters designed to track the value of any asset they can imagine. The benefit of price-stable cryptocurrencies is that they are fully collateralized, and the issuer only needs to be trusted to appoint an honest set of independent (non-collusive) feed producers. Unlike deposit receipts, the value of a Privatized SmartCoin is secured even if the issuer disappears.
Bitshares provides many parameters that an issuer may tune. In addition to account whitelists, market restrictions, and transfer restrictions, the issuer of a private SmartCoin has control over:
- Collateral Type
- Initial Collateral Rate
- Maintenance Collateral Rate
- Forced Settlement Fee, Delay, and Daily Volume
- Price Feed Update Rate
- Global Forced Settlement
With these tools it is possible to emulate a pure contract for difference with periodic global forced settlement (ie: monthly, yearly, etc), or to emulate BitShares 1.0 BitAssets by having a 30 day delay on forced settlement.
Arbitrary financial indexes can be used for the price feed to mimic all manner of exotic assets.
Information/Prediction Markets
A prediction market is a specialization of SmartCoins where there is no need for margin calls or forced settlement because all positions are fully collateralized at any price. A prediction market has a price between 0 and 1 and the issuer settles all positions after the event occurs and the final price is known. These prediction markets can be very secure if the issuer is a multi-sig account with many independent and trustworthy parties involved.
How to Profit by Issuing an Asset
There are many ways to profit from issuing an asset. As the issuer you have complete control over market fees and can tune parameters such as the percent of each trade that is collected as a fee. This percentage can be bounded by a minimum and maximum fee. The combination of these three parameters give issuers great flexibility in pricing.
Fee Pools
Issuers may optionally maintain a Fee Pool. The Fee Pool is a pool of BTS and an exchange rate at which the issued asset may be converted into BTS. When a user wishes to pay a network fee with the asset, the fee pool will step in to convert the asset into BTS at the rate that the issuer has specified. This means that issuers may charge a premium every time users opt to use their asset to pay network fees rather than paying them directly with BTS.
The purpose of the fee pool is to provide a convenience to users that would like to use an asset without concerning themselves with the details of acquiring BTS. Anyone may fund the fee pool, but only the issuer may specify the exchange rate. This exchange rate is automatically set to the settlement price if the asset is collateralized by BTS.


Did you know Python has a statistics
module?
For this Bite we did a line count on our test code for 186 Bites, running this command: wc -l */test_*.py|sort -n -k2|grep -v total > testfiles_number_loc.txt
. Output:
$ head -5 testfiles_number_loc.txt 13 01/test_numbers.py 17 02/test_regex.py 23 03/test_wordvalue.py 15 04/test_tags.py 21 05/test_names.py ...
Complete the stats
dict
wih all the relevant metrics producing the following output:
Basic statistics: - count : 186 - min : 6 - max : 337 - mean : 43.74 Population variance: - pstdev : 43.04 - pvariance : 1852.39 Estimated variance for sample: - count : 93.00 - stdev : 30.24 - variance : 914.36
We already did the formatting for you, so just focus on completing stats
using a combination of Python builtins and the statistics
module.
We retrieved this example from Python 3 Module of the Week (link provided upon resolving this Bite ...)
Make sure you check out statistics
docs while coding this Bite. Other than that, keep calm and code some stats in Python!


--- layout: post esbma_id: 1596 title: Teamprise Developer Opening date: 2006-05-12 14:46:14 ---
Our Teamprise division has an opening for a software developer. The official word is on the Teamprise website, but Ed Thomson's blog entry is a better read.
BTW, we didn't pay Ed to say those nice things about the company's owners.
Oh, wait -- actually I guess we did.

Wait, that didn't come out quite right.
Anyway, you know what I mean...


CONTACT US
Deep walnut, with rich luster grain; Light Oak with a divine finish; Antique-Painted styles that bring back memories of the way it used to be — Transitions Kitchens has the creativity to design your new kitchen to be the most admired room in your house.
Call us today for an analysis of your living space. We’re ready to make your dreams come true.
Transitions Custom Kitchens & Countertops
15220 Carrollton Blvd
Carrollton, VA 23314
office:<PHONE_NUMBER>
fax:<PHONE_NUMBER>
info@kitchentransitions.com


Welcome to our development hub! This is the evolving home for Web Made Movies, Mozilla's Open Video Lab. Web Made Movies is working closely with the Center for Development of Open Technology at Seneca College and contributors like you to develop open video technologies, including Popcorn.js.
Popcorn.js is a JavaScript library for manipulating open video on the web, with a focus on integrating semantic content with HTML5 video. We're actively working on other features, such as manipulating media fragments, integrating with SVG+Canvas, CSS transitions, and other standards-based approaches to video on the web.
We have a brilliant demo of Popcorn.js 0.1: Watch it here!
Please download the source code at mozilla/popcorn-js.
You can find our evolving documentation on our wiki.
Please join our mailing list to stay up to date on developments, and to follow conversations about where we plan to take the project.
We use Lighthouse for bug tracking. Please file a bug or even better, fix one!
We have an active developer community on IRC in #popcorn on Mozilla. Please come say hello!
You can download this project in either zip or tar formats.
You can also clone the project with Git by running: $ git clone git://github.com/mozilla/popcorn-js.git


Trump hails 'cash' to U.S. farmers before Thanksgiving
WASHINGTON, Nov 17 (Reuters) - U.S. President Donald Trump on Sunday welcomed a "cash" payout to American farmers before the Thanksgiving Day holiday that he attributed to China tariffs.
"Our great Farmers will recieve another major round of 'cash,' compliments of China Tariffs, prior to Thanksgiving," he wrote on Twitter. The payments however will be made by the United States government. The Agriculture Department said on Friday it will begin a second round of trade payments this week. (Reporting by Doina Chiacu; Editing by Lisa Shumaker)
© Copyright Thomson Reuters 2019. Click For Restrictions - http://about.reuters.com/fulllegal.asp


Manage your 3D Printers
Manage your existing printers, or register a new printer.
Register Printer
Printer Name
printer_name
Printer Type
type_id
Firmware
firmware
Status
printer_last_health
You have no printers registered.
Add your first printer
.
×
WARNING
Are you sure you want to delete this Printer?


{% extends "pages/template/public.html" %} {% block content %}
Your password has previously appeared in a data breach and ain't safe no more.
Change it here.
If you have reused this password anywhere else, make sure to change it there as well.


Easy Peasy
How to create and delete user profiles on PS4
by Jennifer LockeYou can't do anything worth mentioning on your PlayStation 4 without first creating a profile. Whether it's tied to a proper PSN account is up to you, but you'll still need some sort of profile to access any games on your system. If you happen to have created one too many profiles and want to declutter the sign-in page, it's easy to delete one (or more) in a few simple steps.
Creating a PS4 profile Deleting a PS4 profile
Creating a PS4 profile
There are two different ways to create a new user profile on your PlayStation 4 console.
- Turn on your PS4 console.
- Select New User.
-
Select Create a User.
- Accept the User Agreement.
- If you already have a PSN account, select Skip.
- Set up your avatar.
- Choose a new name.
- Hit Confirm.
The second way can be done while you're already on your account, and are the same steps you'd follow if you wanted to delete a user.
- Go to Settings.
- Scroll down to Login Settings.
-
Select User Management.
- Select Create User.
- Accept the User Agreement.
- If you already have a PSN account, select Skip.
- Set up your avatar.
- Choose a new name.
- Hit Confirm.
User IDs like this do not have access to many features such as multiplayer, PlayStation Plus, or the ability to purchase games. Only proper PSN accounts do.
Deleting a PS4 profile
- Go to Settings.
- Scroll down to Login Settings.
- Select User Management.
-
Select Delete User.
- Choose which user profile you'd like to delete.
Managing multiple accounts
Trying to manage all of these accounts is a whole other beast when it comes to family sharing, but we've got a handy guide just for you. You can have up to 16 user profiles on your PlayStation 4, but only seven can be PlayStation Network accounts registered to the system.
Pick up these great PlayStation 4 accessories and gift cards
PlayStation Network Gift Card (From $10 at Amazon)
You can never go wrong with a PlayStation Network gift card. Whether you're looking to purchase a game, some DLC, or your favorite app, you'll want to have some extra funds in your PSN wallet.
PlayStation Plus 12-month ($60 at Amazon)
Picking up a PlayStation Plus membership is the best way to get the most out of your console. With a membership set up on your primary PS4, you can share its benefits with your family, from discounts, online multiplayer, and even monthly free games.
HyperX ChargePlay Duo ($18 at Amazon)
Charge up your controllers without taking up that precious USB space on your console. The HyperX ChargePlay Duo can charge two at once in two hours through an AC adapter.
We may earn a commission for purchases using our links. Learn more.


Syntax
A syntax highlighting a library for Ruby.
About
This is a simple syntax highlighting library for Ruby. It is a naive syntax analysis tool, meaning that it does not "understand" the syntaxes of the languages it processes, but merely does some semi-intelligent pattern matching.
Usage
There are primarily two uses for the Syntax library:
# Convert text from a supported syntax to a supported highlight format (like HTML). # Tokenize text in a supported syntax and process the tokens directly.
Highlighting a supported syntax
require 'syntax/convertors/html' convertor = Syntax::Convertors::HTML.for_syntax "ruby" puts convertor.convert( File.read( "file.rb" ) )
The above snippet will emit HTML, using spans and CSS to indicate the different highlight "groups". (Sample CSS files are included in the "data" directory.)
Tokenize text
require 'syntax' tokenizer = Syntax.load "ruby" tokenizer.tokenize( File.read( "file.rb" ) ) do |token| puts "group(#{token.group}, #{token.instruction}) lexeme(#{token})" end
Tokenizing is straightforward process. Each time a new token is discovered by the tokenizer, it is yielded to the given block.
- token.group is the lexical group to which the token belongs. Each supported syntax may have it’s own set of lexical groups.
- token.instruction is an instruction used to determine how this token should be treated. It will be :none for normal tokens, :region_open if the token starts a nested region, and :region_close if it closes the last opened region.
- token is itself a subclass of String, so you can use it just as you would a string. It represents the lexeme that was actually parsed.


Map SFPD Incident Reports
Address
Radius (ft)
Time period
Download CSV
Open with Geojson.io
Open with CartoDB
IncidntNum
Category
Descript
Resolution
IncidntNum
Category
Descript
Resolution


I am a computer vision and machine learning researcher, pursuing a Ph.D. degree in Electrical and Computer Engineering at the University of Memphis. I graduated from the Sharif University of Technology with an M.Sc. in Artificial intelligence. I have the expertise and interests in machine learning algorithms, especially deep learning methods for solving computer vision problems such as scene understanding, image classification, and visual relationship detection.
I have more than three years of industry research and development experience. During my R&D work as a senior developer, I have designed developed and deployed several commercial machine learning projects many of which are serving as core components of thousands of road surveillance systems all over the country.
My current research focus is on developing deep learning algorithms for modeling motion in visual data.
Advisor: Dr. Madhusudhanan Balasubramanian
Lab: web page
Email: alisalehi [at] memphis [dot] edu
Electrical and Computer Engineering
The University of Memphis, Department of Electrical and Computer Engineering
M.Sc. in Artificial Intelligence
Sharif University of Technology, Department of Computer Engineering
Bachelor of Computer Engineering
University College Of Omran and Toseeh(UCOT)
My research areas are mainly computer vision and machine learning.
2012, Statistical Pattern Recognition course project
2011 Neural Networks and Fuzzy Systems course
2012, Computational Intelligence course
2012, Complex Dynamical Networks course
2013, Digital Video Processing course
2012, Computational Intelligence course
2012, Machine Learning course
International Journal of Computer Applications 129(16):6-11, November 2015. Published by Foundation of Computer Science (FCS), NY, USA


Chapter: Select Boxes
Creating a Select Box Using ng-options
ng-options vs ng-repeat
What Do I Use?
You selected: {{selectedCar}}
you selected: {{selectedCar2.model}}
and its color is: {{selectedCar2.color}}
The Data Source as an Object
You selected {{selectedCarObject}}
You selected {{selectedCarObject2}}


The Universal Protein Resource (UniProt) is a comprehensive resource for protein sequence and annotation data. The UniProt databases are the UniProt Knowledgebase (UniProtKB), the UniProt Reference Clusters (UniRef), and the UniProt Archive (UniParc).
UniProt is a collaboration between the European Bioinformatics Institute (EMBL-EBI), the SIB Swiss Institute of Bioinformatics and the Protein Information Resource (PIR). Across the three institutes more than 100 people are involved through different tasks such as database curation, software development and support.


Data structure¶
Neuroimaging experiments generate a complex set of data that can be organized in many different ways. For many years, the research community has been trying to find a way to effectively store and manage the data collected from the fMRI scanner.
Brain Imaging Data Structure¶
Brain Imaging Data Structure (BIDS) was originally designed to describe and apply consistent naming conventions to raw data (Gorgolewski et al., 2016). Derivatives of the raw data (other than products of DICOM to NIfTI conversion) MUST be kept separate from the raw data. This way one can protect the raw data from accidental changes by file permissions.
Where a data file has been collected in a session from a given subject, the name of the filename must start with the string
sub-<label>_ses-<label>
.If the session level is omitted from the folder structure, the filename must begin with the
sub-<label>
, without theses-<label>
.
sub-<label>
corresponds to an entity, where <label>
in the real feed would correspond to that entity’s unique identifier, for example 01. The same goes for a session entity with its ses-
key and <label>
value.
Figure 1. Illustration of a BIDS structured dataset.: BIDS is a format for standardizing and describing outputs of neuroimaging experiments, as you can see on the left, in a way that is intuitive to understand and easy to use with existing analysis tools, on the right. (Gorgolewski et al., 2016a)
To understand the organization of files and their format, just refer to the BIDS documentation.
Create a BIDS compatible dataset¶
The whole process of creating a BIDS compatible dataset was described by the authors (Gorgolewski et al. 2016) and mapped below for information purposes.
Convert DICOM files to NIfTI
Usually the datasets are acquired using an MRI scanner that outputs DICOM files so we can use a DICOM to NIfTI converter such as dcm2niix. The software is an open source and it should run on macOS, Linux and Windows, typically without requiring any other software. To get more specific information, go here.
Create folder structure
BIDS relies on a particular folder structure and naming scheme of files. We start with creating the folder structure with creating one subfolder for each participant named ‘sub-01’, ‘sub-02’ and so on. Inside each of these we create subfolders such as: ‘anat’ for anatomical scans, ‘dwi’ (for diffusion scans),‘func’ (for task fMRI) and ‘fmap’ for field mapping. After creating the base, we have to move specific scans to an accurate folder and rename it.
sub-01
∟ anat
#data type
∟ sub-01_run-01_Tww.nii.gz
#entities, suffix and exntension
Every name has to be renamed following the BIDS standard. See more information here.
Add remaining data
We need to provide details on the experimental paradigm for modality-specific files. To see possibilities, go here.
BIDS aspires to describe a majority of datasets, but acknowledges that there will be cases that do not fit the present version of BIDS.
Add missing metadata
There is a need to provide the name of each task, but it is optional to add additional information such as task instructions and description. Although, it is recommended to include external ontology such as Cognitive Atlas or Cognitive Paradigm Ontology to clarify research purposes.
Validate the dataset
BIDS Validator has been developed to easily check whether a dataset accurately follows the BIDS standard. Once the dataset is organized into BIDS format, the BIDS Validator can be used to check if any of the required or recommended metadata are missing.
Note
We recommend using the Web version with no need to install additional software which requires two steps:
Open Google Chrome or Mozilla Firefox (the only supported browsers).

If the validator seems to be working longer than a couple of minutes, open developer tools and report the error in the designated place.
The validator works in the browser performs the validation on the client side (no data is uploaded or shared) so it is suitable for sensitive datasets that are not intended for public sharing.


New TV programme reveals which quiz show contestants are cleverest
Jeremy Vine will find out who would triumph between a University Challenge winner or a contestant on The Chase with a new quiz show.
Quizmaster will pit winning intellects against each other to see who dominates the favourite TV format.
Former contestants from Who Want To Be A Millionaire?, Mastermind, Fifteen To One, The Chase, and University Challenge will go head to head.
ITV has commissioned the show, which seeks to find who is the cleverest of them all.
Vine said: “How clever do you have to be to win a million on Who Wants To Be A Millionaire? Cleverer than a Mastermind Champion?
“Or are the students on University Challenge the brainiest? Well, we decided to find out. And you could have cut the tension in the studio with a knife.”
The 15 quiz champions tackle a series of rounds, with eliminations whittling the group down to just two, who face each other in the final.
Daniela Neumann, of show producers Spun Gold, added: “We Brits love a quiz show – from the intellectual rigours of Mastermind to the high drama and life-changing moments of Who Wants To Be A Millionaire, we are a nation of quiz addicts.
“But we’ve never seen the contestants of these shows competing against each other. Quizmaster will answer the ultimate question all fans want to know – who is the cleverest of them all?”
The air date for Quizmaster is yet to be announced.


WITNESS LIST Pensions & Investments Committee May 3, 2005-8:00A HB 2568 For: Lee, Tim (Texas Retired Teachers Association) Against: Bacon, Tim (TX State Teachers Assoc.) Fickel, Ann (Texas Classroom Teachers Association) Gregg, Brock (Association of TX Professional Educators) Raab, Ted Melina (Texas Federation of Teachers) On: Borden, Sandi (Texas Elementary Principals & Supervisors Association) Featherston, Pattie (Teacher Retirement System) Floyd, Beaman (Texas Association of School Administrators) Jung, Ronnie G. (Teacher Retirement System of Texas) Martin, Dr. Alejandra A. (Texas Association of School Personnel Administrators (TASPA)) Reeves, Gary (Texas Association School Personnel Adms. (TASPA))


MICKEY BLUE EYES A film review by Mark R. Leeper
Capsule: A callow young auctioneer finds out that the father of the woman he wants to marry is a mobster and he is marrying into a crime family. Hugh Grant is developing into a very uninteresting actor incapable of putting any depth into his characters. This film starts with a rudimentary plot and then just fills time until it has enough to make this a feature film length. Rating: 4 (0 to 10), 0 (-4 to +4)
Michael Felgate (played by Hugh Grant) is Manhattan art auctioneer with a mild, non-assertive personality. He lets the truckers he deals with walk all over him. He wants to marry Gina (Jean Tripplehorn) and she seems to love him, but she is strangely reticent to marry for reasons she will not say. When Michael goes to her father's bar and restaurant he finds out part of the reason why. Her father (James Caan) and her uncles make up a dangerous crime family. Gina is sure that if Michael marries into the family he will be pulled into the criminal activity. Mike is just as certain that there is no reason that he would do that. But almost immediately he is asked as a favor to use his auction house to auction off a garish painting created by one of the crime family members. This starts an escalating chain of reluctant favors and counter-favors and a chain of events that pull Mike into the whirlpool associating him closer and closer to organized crime.
The problem with this film is that it seems to have been written by formula. It started with a skeleton of a cliched plot and then apparently the writers started hanging jokes on it like ornaments on a Christmas tree. The jokes all have little to do with each other. The most that they have in common is that they use of screen time. One can almost see the writers sitting there saying, "Okay, now we have a 45- minute story. Let's throw in a comic FBI agent. Now we are up to 50 minutes...." Even then the central plot builds to a very predictable ending. Anyone surprised by the surprise ending is probably new to 1990s cinema.
Hugh Grant was charming early in his career with his boyish smile and youthful charm. But he seems incapable of stretching himself as an actor or leaving his comfort zone. In this film we care for his character about to the extent that we want to cuddle and protect a small child. Listening to him try to talk like a gangster is like watching a child trying to sound like an adult in a school play. It is cute but it is not really entertaining and shows very little accomplishment. Here we are not pulled into the plot or the irony of the situation and the jokes are not particularly perceptive. And worst of all they are rarely funny. The views we have of crime figures are largely cliched. That is part of the joke, that they are instantly recognizable as crime figures. That worked in THE FRESHMAN, but that film had a much better story behind it. James Caan provides the only interesting role interpretation and even he can not make things click.
This comedy overall seems tired with far too few jokes that hit home. It is for fans of Hugh Grant and nobody else. I give it a 4 on the 0 to 10 scale and a +0 on the -4 to +4 scale.
Mark R. Leeper<EMAIL_ADDRESS>Copyright 1999 Mark R. Leeper
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews