text:
(119) Altea és un asteroide que forma part del cinturó d'asteroides i va ser descobert el 3 d'abril de 1872 per James Craig Watson des de l'observatori Detroit d'Ann Arbor, als Estats Units d'Amèrica. Rep aquest nom per Altea, un personatge de la mitologia grega. Està situat a una distància mitjana de 2,582 ua del Sol, i pot apropar-se fins a 2,373 ua. La seva inclinació orbital és 5,782° i l'excentricitat 0,08101. Triga a completar una òrbita al voltant del Sol 1.515 dies.

Vegeu també
 Cos menor del sistema solar

Referències

Planetes menors anomenats en referència a la mitologia grega

Altea


Students should bring the Almanac to school every day.
No child shall leave the school premises during school hours without the prior permission of the principal.While changing class rooms or venues between periods students must move in a line and observe complete silence. When using stair cases and corridors, all students must keep to the left, students should also refrain from running in the corridors.
Vivekanand Public School students should observe standards wherever they go. They should always remember that the school is judge by them. Bulling language is prohibited and punishable as per school rules.
Disciplinary action will be taken against students found using unfair means during examinations which may result in expulsion from the school, students are required to expulsion to behave politely. They should not use indecent language or indulge in fights and quarrels with others.
All the students must wear neat and proper school uniform.
On Wednesday students must wear white uniform.
Boys are not permitted to keep long hair.
Girl students are not allowed to wear fancy jewellery, nail polish, fancy clips etc. They have to wear either a white ribbon or a simple white hair band.
In disciplined behavior in the school bus will result in the student being debarred from using the same.
Any objectionable conduct outside the school will make the student liable for disciplinary action. Every student should take care of his/her personal belongings.
No student is allowed to bring any kind of crackers in the school premises. The fact that the student has been dismissed from the school on disciplinary grounds shall be so mentioned on the transfer certificate.
Bi- cycles must be kept locked and in the space provided. Unlocked bi-cycles will be removed from the school premises. No other vehicle is allowed in the school. School authorities will not be responsible for any theft of the same.


Pictures below will take you on a virtual tour around 300 acres of tulips in bloom!
Tulip fields are located between the towns of La Conner and Mount Vernon.
Parking at fields is $5.
Make your spring really bright and colorful by visiting Skagit Valley Tulip Festival in the Skagit Valley of Washington State. It is one of the most beautiful, spectacular and magnificent floral displays in the country.
The Skagit Valley Tulip Festival is the main and the largest floral festival in the state. More than 1 million people come here to enjoy and explore more than 300 acres of colorful flowers annually. April is the month when the festival is held. Experts say that tulips start to bloom in the beginning of April, and the second week of April is the time for the fields to be in full bloom.
Keep in mind that you will drive a lot, because it is a driving festival, main attractions and numerous events are located far from each other throughout the Skagit Valley.
The Skagit Valley, to my mind, may be surely called Little Holland, because Skagit tulips grow in similar conditions as Holland tulips: similar soil, latitude and altitude, as well as similar marine influence.
Tulip Town and RoozenGaarde are the two main farms where thousands of tulips are grown.
Tulip Town offers acres of colorful tulips (over 60 varieties) that brighten the fields. This farm is very kids-friendly, they have numerous activities for kids, such as kite-flying opportunities, trolley rides, face painting, etc. Tulip Town works Monday through Friday from 9 a.m. till 5 p.m. Parking is free here. Admission cost for adults is $6, children ages 6 and under are allowed to enjoy the fields free of charge. Keep in mind that no pets are allowed here.
The second tulip growing company is the Washington Bulb Co., famous for its' ornamental garden RoozenGaarde with 750,000 tulips of 100 varieties. RoozenGaarde offers wonderful views not only of the blooming tulips, but also of the snowy and famous Mount Baker that sets a perfect background for the blooming fields.
William Roozen emigrated from the Netherlands in 1947 and started his family bulb company here. It should be said that his company has started as a bulb farm on five acres of land, the meetings were held in garage and the tractors and farm equipment was used. But this small business has become the largest in the United States and is still owed by the Roozen family. Nowadays the company owns more than 1200 acres of fields with blooming tulips, daffodils and irises and 15 acres of greenhouses.
The Skagit Valley Tulip Festival is a must-visit event, but you need to know several things to be prepared for this unusual trip.
First of all, remember that the weather in Washington State is changeable; the temperature can change every minute, that's why we recommend wearing several layers of clothes. It is also important to bring umbrellas with you or to wear waterproof clothes in case there will be April showers. Don't forget to wear waterproof shoes, because you'll be walking along dirty farm roads and fields.
The Skagit Valley Tulip Festival attracts millions of tourists and of course traffic jams are usual for this period of time. If you want to avoid the crowds and fully enjoy the beauty of the flowers, we recommend taking a trip to the valley during a weekday. If Saturday of Sunday are the only days you can visit the festival, try to come here before 9 a.m. or after 3 p.m.
Be very careful with the parking and obey the "NO-PARKING" signs in order not to receive a ticket.
If you travel from Seattle, it will take you about an hour to get here, depending on traffic, of course. But the tulips are usually grown in a 15-mile triangle, which is bordered by Highway 20, the Skagit River, and the Swinomish River Channel, so this driving tour can be really called a scenic one.
Before you decide to go, check the Skagit Valley Tulip Festival website and look for additional information.


Like it or not, most professional communications nowadays is on email. And if communications are about building personal connections and trust (which they are), then getting email right is important. It's a way to differentiate yourself in a crowded, noisy world.
Never email someone who isn't expecting to hear from you. Or if you do, you'd better have a heck of a way to introduce yourself. If they don't know you or why you're contacting them, you're sending spam.
Overwhelm people with your responsiveness. This matters more than you think. Get back to them quickly. If it's going to take you more than a day to respond, let them know.
Be personal. Have your personality come through. Really. Give them a glimpse of where you are, of what's going in the world or in your world – something that places your email in a place and in time and shares a little bit about where your head is when writing the note.
Use different tones of voice for different people. Formal or informal can work for email, it just depends who you're writing (but informal still means full sentences). Just don't be generic. Ever.
Be specific. Tell someone why you're writing them. If you're asking them for something, ask. Be clear, direct, and polite.
Assume people are reading on a handheld device – even if they're not, that will keep you short and to the point, and you'll avoid graphics and tables and fancy stuff.
EVERY email you write needs to strengthen and reinforce the relationship you have with someone. Every one. No exceptions.
If you're hesitating about sending an email, pick up the phone. Don't hide behind an impersonal medium, especially for tough conversations.
I absolutely love this post. Your points on emailing are salient and should be adopted by all. Thanks for sharing them. I intend to keep them with me at all times.
I disagree on the folder point. Not for the faint of heart, but it is doable to file your mail and make sense of it.


rqlite: Replicated SQLite using the Raft Consensus Protocol — A distributed system that provides a replicated SQLite database. It's written in Go and uses Raft to achieve consensus across all the instances of the SQLite databases.
Ask HN: How to Handle 50GB of Transaction Data Each Day? — An interesting discussion on Hacker News about how to handle large amounts of data arriving on a continuous basis.
Moving from MySQL to a 'Database-Free' Architecture — A look at how a busy search data service moved from MySQL to a programming language specific binary marshalling approach, and why.
Building a Streaming Search Platform — An interesting story of how several developers approached building a search platform for streaming data using Storm and Redis.
Awesome MongoDB: A Curated Set of MongoDB Resources — About 60 links for you to enjoy.
Spark 2.0 to Introduce New 'Structured Streaming' Engine — A new 'Structured Streaming' engine that leans on the Spark SQL API to simplify the development of real-time, continuous big data apps.
Amazon RDS Now Supports MySQL 5.7 — 5.7 not only offers better performance and security, but also a native JSON data type and built-in JSON functions for working with documents.
SQL-on-Hadoop Test: Each Engine Has 'Sweet Spots' — With business intelligence being one of Hadoop's key uses, the role of SQL-on-Hadoop engines has become significant.
30 Years Ago: The Rise, Fall and Survival of Ashton-Tate's dBASE — Well this takes me back. You may also enjoy A Personal History of dBASE.
Portfolio Risk Analysis in SQL — A quick look at doing some math with SQL to calculate the risk within an investment portfolio.
The Lambda Architecture Simplified — A guide to building a scalable data architecture for real-time workloads.
Protector: A Circuit Breaker for Time Series Databases — A circuit breaker limits CPU and memory usage for each query, preventing out-of-memory exceptions. This system is aimed at InfluxDB for now but may be extended over time.
restdb.io - The Plug And Play Database Service — Aimed at people who want a database in the cloud with no coding to get going.


text:
networkcultures.org networkcultures.org
No Problem: Design School as Promise | ENTREPRECARIAT
bauhouse 14 Oct 2021
Victor Papanek's Design Problem, 1975.
The Design Problem
Three diagrams will explain the lack of social engagement in design. If (in Figure 1) we equate the triangle with a design problem, we readily see that industry and its designers are concerned only with the tiny top portion, without addressing themselves to real needs.
(Design for the Real World, 2019. Page 57.)
The other two figures merely change the caption for the figure.
Figure 1: The Design Problem
Figure 2: A Country
Figure 3: The World
Victor Papanek design problem problem-solving capitalism neoliberalism Design for the Real World entreprecariat
entreprecariat
Victor Papanek
Design for the Real World
bauhouse
networkcultures.org/entreprecariat/no-problem-design/
en.wikipedia.org en.wikipedia.org
Edge effects - Wikipedia
In ecology, edge effects are changes in population or community structures that occur at the boundary of two or more habitats.[1] Areas with small habitat fragments exhibit especially pronounced edge effects that may extend throughout the range. As the edge effects increase, the boundary habitat allows for greater biodiversity.
Edge Effects
It was in the Design Science Studio that I learned about edge effects.
Yesterday, I was thinking about how my life embodies the concept of edge effects. That same day, a book was delivered to our door, Design for the Real World by Victor Papanek.
Today, I was reading these words:
Design for Survival and Survival through Design: A Summation
Integrated, comprehensive, anticipatory design is the act of planning and shaping carried on across the various disciplines, an act continuously carried on at interfaces between them.
Victor Papanek goes on to say:
It is at the border of different techniques or disciplines that most new discoveries are made and most action is inaugurated. It is when two differing areas of knowledge are brought into contact with one another that… a new science may come into being.
(Page 323)
Exiles and Emigrés
The Bauhaus spread its ideas because it existed at the boundaries, the avant-garde, the edges of what was thought to be possible, especially as a socialist utopian idea found its way to a capitalist industrial-military complex, where the concept of modernism was co-opted and colonized by globalizing economic forces beyond the control of the individual. Design was the virus that propagated around the world through the vehicle of corporate globalization.
That same design ethic is infecting corporations with a conscience, with empathy, with a process that begins with listening to people. Design is the virus that can spread the values of unconditional love throughout the body of neoliberal capitalism.
Design for the Real World Victor Papanek edge effects comprehensive anticipatory design science Design Science Studio Buckminster Fuller biodiversity exile
Design Science Studio
anticipatory
en.wikipedia.org/wiki/Edge_effects
thamesandhudson.com thamesandhudson.com
You have to make up your mind either to make sense or to make money, if you want to be a designer.
— R. Buckminster Fuller
Victor Papanek Design for the Real World Buckminster Fuller
Victor Papanek's book includes an introduction written by R. Buckminster Fuller, Carbondale, Illinois. (Sadly, the Thames & Hudson 2019 Third Edition does not include this introduction. Monoskop has preserved the following text as a PDF file of images. I have transcribed a portion below.)
Buckminster Fuller on Design
In this book, Victor Papanek speaks about everything as design. I agree with that and will elaborate on it in my own way.
To me the word "design" can mean either a weightless, metaphysical conception or a physical pattern. I tend to differentiate between design as a subjective experience, i.e., designs which affect me and produce involuntary and often subconscious reactions, in contradistinction to the designs that I undertake objectively in response to stimuli. What I elect to do consciously is objective design. When we say there is a design, it indicates that an intellect has organized events into discrete and conceptual inter-patternings. Snowflakes are design, crystals are design, music is design, and the electromagnetic spectrum of which the rainbow colors are but one millionth of its range is design; planets, stars, galaxies, and their contained behaviours such as the periodical regularities of the chemical elements are all design-accomplishments. If a DNA-RNA genetic code programs the design of roses, elephants, and bees, we will have to ask what intellect designed the DNA-RNA code as well as the atoms and molecules which implement the coded programs.
The opposite of design is chaos. Design is intelligent or intelligible. Most of the design subjectively experienced by humans is a priori the design of sea waves, winds, birds, animals, grasses, flowers, rocks, mosquitoes, spiders, salmon, crabs, and flying fish. Humans are confronted with an a priori, comprehensive, designing intellect which for instance has designed the sustenance of life on the planet we call earth through the primary impoundment of Sun energy on Earth by the photosynthetic functioning of vegetation, during which process all the by-product gases given off by the vegetation are designed to be the specific chemical gases essential to sustaining all mammalian life on Earth, and when these gases are consumed by the mammals, they in turn are transformed again by chemical combining and disassociations, to product the by-product gases essential to the regeneration of the vegetation, thus completing a totally regenerative ecological design cycle.
If one realizes that the universe is sum-totally an evolutionary design integrity, then one may be prone to acknowledge that an a priori intellect of infinitely vast considerateness and competence is everywhere and everywhere overwhelmingly manifest.
In view of a number of discoveries such as the ecological regeneration manifest in the mammalian-vegetation interexchange of gases, we can comprehend why responsibly thinking humans have time and again throughout the ages come to acknowledge a supra-human omniscience and omnipotence.
The self-regenerative scenario universe is an a prior design integrity. The universe is everywhere, and continually, manifesting an intellectual integrity which inherently comprehends all macro-micro event patterning and how to employ that information objectively with omni-consideration of all inter-effects and reactions. The universe manifests an extraordinary aggregate of generalized principles, none of which contradict one another and all of which are inter-accommodative, with some of the inter-accommodations exhibiting high exponential levels of synergetic surprise. Some of them involve fourth-power geometrical levels of energy interactions.
Buckminster Fuller design metaphysical Victor Papanek
by Victor Papanek
Papanek on the Bauhaus
Many of the "sane design" or "design reform" movements of the time, such as those engendered by the writings and teachings of William Morris in England and Elbert Hubbard in the United States, were rooted in a sort of Luddite antimachine philosophy. By contrast Frank Llloyd Wright said as early as 1894 that "the machine is here to stay" and that the designer should "use this normal tool of civilization to best advantage instead of prostituting it as he has hitherto done in reproducing with murderous ubiquity forms born of other times and other conditions which it can only serve to destroy." Yet designers of the last century were either perpetrators of voluptuous Victorian-Baroque or members of an artsy-craftsy clique who were dismayed by machine technology. The work of the Kunstgewerbeschule in Austria and the German Werkbund anticipated things to come, but it was not until Walter Gropius founded the German Bauhaus in 1919 that an uneasy marriage between art and machine was achieved.
No design school in history had greater influence in shaping taste and design than the Bauhaus. It was the first school to consider design a vital part of the production process rather than "applied art" or "industrial arts." It became the first international forum on design because it drew its faculty and students from all over the world, and its influence traveled as these people later founded design offices and schools in many countries. Almost every major design school in the United States today still uses the basic foundation course developed by the Bauhaus. It made good sense in 1919 to let a German 19-year-old experiment with drill press and circular saw, welding torch and lathe, so that he might "experience the interaction between tool and material." Today the same method is an anachronism, for an American teenager has spent much of his life in a machine-dominated society (and cumulatively probably a great deal of time lying under various automobiles, souping them up). For a student whose American design school slavishly imitates teaching patterns developed by the Bauhaus, computer sciences and electronics and plastics technology and cybernetics and bionics simply do not exist. The courses the Bauhaus developed were excellent for their time and place (telesis), but American schools following this pattern in the eighties are perpetuating design infantilism.
The Bauhaus was in a sense a nonadaptive mutation in design, for the genes contributing to its convergence characteristics were badly chosen. In boldface type, it announced its manifesto: "Architects, sculptors, painters, we must all turn to the crafts.… Let us create a new guild of craftsmen!" The heavy emphasis on interaction between crafts, art, and design turned out to be a blind alley. The inherent nihilism of the pictorial arts of the post-World War I period had little to contribute that would be useful to the average, or even to the discriminating, consumer. The paintings of Kandinsky, Klee, Feininger, et al., on the other hand, had no connection whatsoever with the anemic elegance some designers imposed on products.
(Pages 30-31)
Victor Papanek Design for the Real World design education Luddites art machine Bauhaus Walter Gropius history influence
thamesandhudson.com/design-for-the-real-world-9780500295335
monoskop.org monoskop.org
Papanek_Victor_Design_for_the_Real_World.pdf
Victor Papanek's book includes an introduction written by R. Buckminster Fuller, Carbondale, Illinois. (Sadly, the Thames & Hudson 2019 Third Edition does not include this introduction. Monoskop has preserved this text as a PDF file of images. I have transcribed a portion here.)
Victor Papanek Design for the Real World design education philosophy ethics social responsibility
monoskop.org/images/f/f8/Papanek_Victor_Design_for_the_Real_World.pdf
Victor Papanek - Monoskop
design education Victor Papanek Design for the Real World
monoskop.org/Victor_Papanek
bauhouse 24 Sep 2021
Mike Monteiro references Victor Papanek's book, Design for the Real World, in his article, Design's Lost Generation.
The Anti UX UX Club will be discussing Mike Monteiro's article on Clubhouse.
Anti UX UX Club design Mike Monteiro Victor Papanek
Mike Monteiro
Anti UX UX Club

redpajama_set_name: RedPajamaCommonCrawl


text:
Q: SFINAE/enable_if based on the contents of a string parameter? I can not get my head around the following problem. I don't even really know how I could approach it.
Consider this code:
struct fragment_shader {
    std::string mPath;
};

struct vertex_shader {
    std::string mPath;
};

template <typename T>
T shader(std::string path) {
    return T{ path };
}

To create the different structs, I can write the following:
auto fragmentShader = shader<vertex_shader>("some_shader.frag");
auto vertexShader = shader<fragment_shader>("some_shader.vert");

I am wondering, if it is possible to let the compiler figure out the type based on the path parameter which is passed to the shader function, so I would only have to write:
auto fragmentShader = shader("some_shader.frag");
auto vertexShader = shader("some_shader.vert");

and because of the file ending ".frag", the type fragment_shader would be inferred, and for a path ending with ".vert", vertex_shader would be inferred.
Is that possible?
I was reading up a bit on enable_if, but actually I have no idea how I could use that to achieve what I am trying to achieve. I would try something like follows:
template<>
typename std::enable_if<path.endsWith(".frag"), fragment_shader>::type shader(std::string path) {
    return fragment_shader{ path };
}

template<>
typename std::enable_if<path.endsWith(".vert"), vertex_shader>::type shader(std::string path) {
    return vertex_shader{ path };
}

But obviously, this doesn't compile. It's just to make clear what I am trying to do.

A: If all paths are known at compile time, I have a solution. It turns out that fixed size char arrays that are declared with static linkage can be used as template arguments (as opposed to string literals), and thus you can make a function return two different types depending on that template argument:
This is a helper function that can determine at compile time if the file ending is .frag (you may want to have an equivalent function for .vert):
template <std::size_t N, const char (&path)[N]>
constexpr bool is_fragment_shader()
{
    char suf[] = ".frag";
    auto suf_len = sizeof(suf);

    if (N < suf_len)
        return false;

    for (int i = 0; i < suf_len; ++i)
        if (path[N - suf_len + i] != suf[i])
            return false;

    return true;
}

This function returns two different types depending on the file ending. As you tagged the question with C++17, I used if constexpr instead of enable_if which I find much more readable. But having two overloads via enable_if will work, too:
template <std::size_t N, const char (&path)[N]>
auto shader_impl()
{
    if constexpr (is_fragment_shader<N, path>())
        return fragment_shader{ path };
    else
        return vertex_shader{ path };
}

And finally, to use it, you need to do this:
static constexpr const char path[] = "some_shader.frag"; // this is the important line
auto frag = shader_impl<sizeof(path), path>();

This is of course a little annoying to write. If you are OK with using a macro, you can define one that defines a lambda holding the static string and executes that immediately like so:
#define shader(p) \
[]{ \
    static constexpr const char path[] = p; \ // this is the important line
    return shader_impl<sizeof(path), path>(); \
}() \

Then the call syntax is just as you want it:
auto frag = shader("some_shader.frag");
static_assert(std::is_same_v<decltype(frag), fragment_shader>);

auto vert = shader("some_shader.vert");
static_assert(std::is_same_v<decltype(vert), vertex_shader>);

Please find a fully working example here.

Edit:
As it turns out that MSVC only allows char arrays as template arguments if they are declared in the global namespace, the best solution I can think of is to declare all needed paths just there.
static constexpr char some_shader_frag[] = "some_shader.frag";
static constexpr char some_shader_vert[] = "some_shader.vert";

If you slightly alter the macro, the calls can still look quite nice (although having to declare the strings elsewhere remains being a big PITA, of course):
#define shader(p) \
[]{ \
    return shader_impl<sizeof(p), p>(); \
}() \

void test()
{
    auto frag = shader(some_shader_frag);
    static_assert(std::is_same_v<decltype(frag), fragment_shader>);

    auto vert = shader(some_shader_vert);
    static_assert(std::is_same_v<decltype(vert), vertex_shader>);
}

See it working here.

Edit 2:
This issue has been fixed in VS 2019 version 16.4 (msvc v19.24): https://developercommunity.visualstudio.com/content/problem/341639/very-fragile-ice.html
See it working here.

A:
Is that possible?

Short answer: no.
Long answer.
C++ is a statically typed language and the compiler require to decide the returned type of a function at compile time.
In your case with
auto fragmentShader = shader("some_shader.frag");
auto vertexShader = shader("some_shader.vert");

you're trying to obtain two different return types from the same function and decide the return type from a run-time known value.
I know that "some_shader.frag" is a char const [17] known at compile time, but the problem is that shader() receive also std::string  known only at run-time
std::string s;

std::cin >> s;

auto foo = shader(s);  // which type, in this case, at run-time ?

redpajama_set_name: RedPajamaStackExchange


Father Kevin and I would like to thank a committee of very talented and dedicated parishioners from Our Lady of Grace Parish, who together helped us identify opportunities to enhance our parish and school identities, to bring greater simplicity, and unity between the two. Comprised of Bill and Stevie Sislo, Shawn Murnan, Todd Piper-Hauswirth, Paul and Alison James, Danette Halloran, Maureen Trenary, and Adam Groebner, this experienced and insightful group made it easy to come together quickly, and work collaboratively. We especially want to thank Todd Piper-Hauswirth for his graphic design expertise, and tireless dedication to find the precise solution for Our Lady of Grace. We hope you love our new look as much as we do! More specific information on our new identity can be found here.


If there is a book that you want to read but it hasn't been written yet, then you must write it.
" Book collecting is an obsession, an occupation, a disease, an addiction, a fascination, an absurdity, a fate. It's not a hobby. Those who do it must do it."
@Anders_als_du  Ich komme aus Bayern und hab erst ab nächsten Dienstag wieder schule alle anderen Bundesländer haben aber bereits wieder schule.


HONOLULU (HawaiiNewsNow) – Kamehameha Schools has partnered with Microsoft on educational opportunities geared toward computer science.
One of the ways they're doing it is through the popular video game, Minecraft.
The video game is being used as an educational tool for students to learn more about Native Hawaiian Issues.


text:
Movie: Godzilla (2014) - Semi Spoileriffic
As far as Godzilla movies go the latest 2014 Godzilla movie is about as spot on as I've seen for believing that Godzilla isn't a guy in a suit and actually could be real.
Although I knew there were other very big monsters in this movie apart from Godzilla (not really a spoiler since almost from the beginning you learn there's more than one monster) the trailers gave the distinct impression this was a people versus Godzilla movie.
Whilst it was certainly that in some respects the people in this film really did little more than get in the way. Literally and metaphorically.
In the same way that Raiders of the Lost Ark would have exactly the same outcome if you took Indiana Jones out of the picture, Godzilla would have exactly the same outcome but with few less lives lost if all the people just stayed out of the way.
In the trailers Bryan Cranston's character, Joe Brody, a former Nuclear Power Plant employee, emphatically accuses "Because what's really happening is that you're hiding something out there! And it is going to send us back to the Stone Age! God help us all..." It's a great line but it really makes no sense... Big monsters wandering the Earth... maybe... but they didn't have cities or even people in the stone age.
In the end it was dramatically overstating on the events that unfold in the film and might have seemed more relevant if the movie delivered what the trailer implied. A real battle between humans and Godzilla.
What I got was a movie with some soldier, Ford Brody (Aaron Taylor-Johnson) wrestling with his Dad's erratic, crackpot ideas. Then kind of trying to stay alive because he's the only guy that knows how to work the machinery that may or may not stop the monsters that are causing havoc on American cities.
Ford Brody is a character I might have cared about more if he didn't spend so much time just reacting to the events around him. Even when he had a goal all you could really do was watch him attempt to carry it out and hope he doesn't die in the process. He was no great intellect trying to match wits with a monster or two.
I can't really fault this movie in terms of the monsters, other than it took a long time for Godzilla to get into the main action. However when he did, it was full on Godzilla awesome complete with atomic laser breath. It's well worth seeing for just the monster sequences alone. It's definitely franchise worthy because it would be amazing to see this very realistic Godzilla go up against realistic versions of some of his previous foes in the early films.
The human story however really needed some work. I would've liked to have seen more back story come into play. The movie states that nuclear bomb tests conducted in the 1950's were attempts to kill the monster but none of what they learned back then seemed to come into play in the present day storyline.
It felt like no one was really communicating to make sure civilians got out of harms way once they understood each monsters motivations. The strategy seemed to be all about stopping the monsters simply by blocking their path with as much military hardware as possible despite knowing how ineffective that was.
Yes I know the military did have a strategy to try and redirect the monsters but they still persisted in setting up troops in harms way knowing they didn't really stand a chance.
If there is a sequel to this film - and I'm sure there will be - I hope they manage to give us some pseudo science that the characters can really get their teeth into.
If this movie's subtext is really about 'man versus nature', as director Gareth Edwards suggests, then there's a whole story there about man trying to control nature that could give the people of the next film something really interesting to do.
To sum up. Godzilla is a really good monster movie. For me it was pretty much how I imagined Godzilla should be. I was very happy that the movie started in Japan before moving to the USA because above all else, Godzilla is a Japanese creation - even if he was born out of the US nuclear bombing of Japan.
If I could have got more interesting and better developed human characters it would have been just about perfect but perhaps we'll see that in a sequel... certainly don't kill off the most interesting character half way through next time!
Well worth seeing. I really hope to see another Godzilla movie that builds on this and perhaps goes a bit more into the science and intellectual side of things whilst still giving us great monster battles.
Movies and Entertainment
TET Life Topics: Movies and Entertainment


Export Import Data Korutech Inc No33 Sem, is a premier company that exports and imports goods from countries including , Republic Of Korea and host of other countries.
Korutech Inc No33 Sem, is a premier company that exports and imports goods from countries including , Republic Of Korea and host of other countries.
Korutech Inc No33 Sem is also a leading importer of TUNGSTEN CARBIDE COATED INSERTS CCMT 09T308-HMP PC 9030, TUNGSTEN CARBIDE COATED INSERTS WNMG 060408-HM NC 9020, TUNGSTEN CARBIDE COATED INSERTS CCGT 060202-AK H01, TUNGSTEN CARBIDE COATED INSERTS SNMG 120408-HM NC 330, TUNGSTEN CARBIDE COATED INSERTS WNMG 080408-NC 315K, having HS Codes 82090090.


text:
Inter-NGO / Charity Donations in India - NGO Finance – 03-12
DONATION TO ANOTHER CHARITABLE ORGANISATION
01 => It has been held in various cases that donation made by one Charitable Organisation to another shall be considered as application of income for the objectives of the organisation provided the receiving organisation also has objects similar to the object donor organisation.
DONATIONS TO OTHER CHARITABLE INSTITUTIONS AFTER 1-4-2002
02 => The Finance Act, 2002 has inserted an Explanation to sub-section (2) of section 11. This Explanation prohibits donations to other Charitable Organisations out of the accumulated funds. This amendment can have far-reaching practical implications. The new amendment puts restriction on donations to other charities only out of accumulated funds. In other words, funds once accumulated under section 11(2) can only be applied for charitable purposes directly by the concerned organisation and any inter-organisational transfer would not be possible.
DONATION OUT OF CURRENT INCOME IS NOT BANNED
03 => However inter-organisational donations are possible from current year's income, but the newly amended provision will certainly create hurdles for organisations, which were used as conduct for channel rising funds to other organisations. The new Explanation inserted by the Finance Act, 2002, to section 11(2) has debarred organisations from applying its accumulated or set-apart income by way of payment or credit to other such organisations. Now, payments or credits out of accumulated funds to any other organisation would not be treated as application for charitable or religious purpose. There is no apparent bar on payment or credit to such other organisations out of previous year's income subject to the provisions of section 11(1).
INTER-CHARITY DONATION
04 => In the light of the above, funds once accumulated are no longer available for credit or payment to any other Charitable Organisation, though such transfer may still be possible out of the current year's income under section 11. CBDT has also issued a clarificatory circular no. 8, dt. 27.08.2002.
05 => In the light of the aforesaid and the amendments by virtue of Finance Act, 2002, donations to other Charitable Organisation are still possible but only out of the current years income. Once the funds are accumulated then it will not be permissible to make inter-trust donation and treat them as application.
AMENDMENT IN FINANCE ACT, 2003
06 => The Finance Act, 2003 has inserted another proviso to sub-section (3A) of section 11 which provides that inter-charity donation out of accumulated funds will be permissible in case of dissolution of a Charitable Organisation. This amendment has been made to reduce the hardship of Charitable Organisations on the brink of dissolution.
TAX PLANNING THROUGH DEEMED APPLICATION
07 => In the light of what is discussed in this chapter, the amended provisions with regard to inter-charity donations will cause hardship to those organisations which act as a mother NGO to many small charitable organisations and funds through various foreign and domestic sources are routed through them. Many donors prefer to fund through one mother NGO which subsequently distributes the funds to smaller NGOs. After the amendment made in 2002 there is an apprehension in the fraternity of Charitable Organisations, that it may become difficult to disburse funds received towards the end of the year. And since accumulated income is not available for inter-charity donations, the funds could neither be applied nor could be donated to other charities.
08 => For instance if a Charitable Organisation receives funds in the month of March - which is required to be distributed to other charitable Organisations - and is unable to make inter-charity donations within the year of receipt, then it has to accumulate the same. Once the income is accumulated under section 11(2) then it is not permissible to make inter-charity donations.
09 => Under the above mentioned circumstances, a Charitable Organisation may exercise the option available under Explanation to section 11. The Explanation to the section 11 refers to two situations where the income applied falls short of 85% and still can be deemed to have been applied in the previous year other reason. Under the second situation, the assessee may exercise its option by applying in writing before the expiry of the time allowed under section 139(1) for filing of return. After exercise of the option, the income will be deemed to have been applied in the previous year even though it is spent in the succeeding or the year of receipt.
10 => Inter-charity donations being valid application of income, there is no reason why option under Explanation 2 to section 11(1) could not be applied and the income be actually spent/disbursed in the succeeding year. But the reasons have to be genuine, the organisation must have valid reasons for not being able to apply the income as inter-charity donations.
i) Donation to another charity with similar objects is considered as an application of income for charitable or religious purposes.
ii) CBDT Instruction No.1132 (1978), has clarified that if the donee organisation does not utilise in the year of receipt, then the exemption to donor will not be affected.
iii) The Assessing Officer should be satisfied that the donation is a bonafide initiative and would be used by the donee for charitable purposes only. In other words, unqualified benefit to the donor is not available.
iv) High Courts have held that an even inter-charity donation towards corpus is a valid application. But this contention may require re-consideration.
v) After 01.04.2002, inter-charity donation out of accumulated funds is not possible except in the case of dissolution of the donor organisation.
vi) Organisations receiving funds towards the end of the year can still make inter-charity donations by applying the option under Explanation to section 11.
The Global NGOs Consultants
Email: ngo.consultant@sudeshkumar.net
Website: http://ngo.sudeshkumar.org
Keywords – NGO.Consultants, NGO Resources, NGO Café, FCRA Fund for NGO, Foreign Funding to India Charity and Trust, Education and Health Trust Funding, Sudesh Kumar NGO Finance Courses, NGO Charted Accountants, NGO Consulting, Global Nonprofit Consulting, FCRA registration, Sudesh Kumar Foundation, India NGO, Grants, FCRA Foreign Funding, International Organization, CSR Funding, Fundraising Program, Sudesh Kumar London, NGO Auditing, NGO Balance sheet, NGO Registration, 80g NGO, Non-governmental Organization FCRA Directory, Fund Generation, NPO, Nonprofit Funding, Global NGO, 35AC Funding Agency, Indian Foundation Donation, Indian Educational Trust, SudeshKumar Grassroots FCRA Grant, Sudesh Kumar Organization, Sudesh Kumar Fellowships, Microfinance Charity Fund, Bank Multilateral Funding, Society Funding projects, UN non-governmental organization, foreign donations, India FCRA funding sources, social capital, American foundation


This machine is single Phase input power, but is a full three phase machine internally with variable speed and forward and reverse, this also means that this machine is vastly more reliable then the regular single phase machines from competitive sources.
Abrasive Plates Three 8" counter-rotating grinding heads on rotating drum.
The 460 is all gear design with drive to each of the three flex heads as well as power to the drum for the highest production rate in its size.
The Avenger 460 comes with the Magnetic Instant-change tool mounting system. All you will need to purchase is the diamond tools you will need for your particular project. The system can mount scrapper tools ,regular metal trapezoid tools, and velcro mount tools.
The Avenger 460 has all the features of much larger machines, such as forward and reverse directions on the grinding heads. This allows you to run directional tools such as scrapper tools to remove epoxy and glue. Most diamond tools do not have a direction so you can run those either way. The 460 also has variable speed to grind rough floors by slowing down the grinding heads to keep them from bouncing which will stop them from cutting. By speeding up the grinding heads you can polish and burnish the floor with the proper tooling. Variable speed also allows you to work on marble and granite floors.


text:
Rethinking "The Political Unconscious"
Muhlestein, Daniel Kay
Morris, Wesley A.
Although The Political Unconscious is an effective advocate of "the perspectives of Marxism as necessary preconditions for adequate literary comprehension" (75), Fredric Jameson's method of interpretation suffers from a number of determinate insufficiencies: (1) its claim to a properly structural causality is ultimately unjustifiable; (2) its "horizon" of Cultural Revolution is grounded in mechanical and expressive causality; (3) its application to literary texts is an act of interpretive impoverishment; (4) its defense of a Marxian "master narrative" of history is a conflation of the Historical Real and its histories; and (5) its attempt at "articulating a properly Marxian version of meaning beyond the purely ideological" (285) is a kind of ideological conditioning in which an impulse common to all classes is harnessed to the ideological production of a single class. Nevertheless, The Political Unconscious is a critically important text in that it points toward--though it does not make clear--the means of production by which that physical necessity which is the material effect of the Historical Real is in the Symbolic Order (re)textualized into the various narrative forms of causality with which we attempt to understand and explain the determinate relations between the Real and its alienating necessities.
American literature; Philosophy; Political science
Muhlestein, Daniel Kay. "Rethinking "The Political Unconscious"." (1992) Diss., Rice University. https://hdl.handle.net/1911/16552.


Empowering you with the ability to engage people with cloud communications.
We make it easy for businesses to connects with customers anytime and anywhere around the globe.
Prioritize security in your business, prevent the increasing counts of frauds and scams, to ensure the top quality for your business.
Integrate Messaging service with your ecommerce business, and build a better relationship with your buyers.
SMS have never been easier.
No problem, we got you covered.
Can I send international messages?
Yes. We are an international SMS provider. You can send out SMS both locally and internationally based on our price list.
You can get 20 FREE credits from here and credits are valid for 14 days.
You can type the long message into the system. The system will count the characters and show how many SMS will be deducted.
No. There are no set-up charges or monthly fees with us. You buy credits, use them, and top them up when you need to. It really is that simple.


Angel City Audio had their loudspeakers on exhibition in the TriangleArt room.
Angel City Audio brought their Seraphim Prime speakers to the show.
These speakers were able to fill the room with a detailed, incisive well-controlled sound.
This is the last of pour three posts on the TriangleArt, Angel City Audio exhibition room.


text:
ESRs
ESR Projects
Technologies for the analysis of single extracellular vesicles
Single-vesicle imaging and analysis methodologies focus attention towards extracellular vesicles research. Recent advances in the single-vesicle analysis have facilitated their application in medical diagnosis and therapies.
The Exosomes Lab and metabolomics platform, led by Dr. Juan Manuel Falcón-Pérez (https://www.cicbiogune.es/people/jfalcon), reported in Bordanaba-Florit et al., Nature Protocols the current and prospective single-vesicle methodologies but also the recent scientific advances achieved thanks to these technologies (Full-text access to a view-only version: https://rdcu.be/cmEWB)
Short abstract:
Since the description of minute bodies found in a piece of cork by Robert Hooke in 1665, both our scientific knowledge and technical abilities have increased enormously. As techniques have become more accurate and intricate, so has our understanding of biological processes and structures. Technological advances in the field of imaging have resulted in the identification of cell structures, such as the mitochondria and nuclei, and the discovery of different levels of cellular complexity. In 1967, Peter Wolf visualised platelet dust in fresh platelet-free blood plasma using an electron microscope; thus, a mammalian vesicle-like structure was described for the first time. Gradually, these vesicles were characterised in more detail.
Nowadays, these secreted vesicles are extensively reported and widely known as extracellular vesicles (EVs). EVs are heterogeneous, nano- to micrometre-sized, bilayer lipid containers secreted by most cell types. They are multi-purpose carriers that can contain a wide variety of cargos such as lipids, proteins, metabolites, sugars, RNA (mRNA, miRNA, siRNA) and even DNA. In mammals, EVs have been found in body fluids like plasma, urine, saliva, breast milk and seminal fluid, among others.
EVs play a key role in pathophysiological processes, however, the heterogeneity of their structure and composition hinders their application in medical diagnosis and therapies. This diversity makes it difficult to establish their exact physiological roles, and the functions and composition of different EV (sub)populations. Ensemble averaging approaches currently employed for EV characterisation, such as Western blotting or "omics" technologies, tend to obscure rather than reveal these heterogeneities. We describe the contributions of these recent technological advances to the characterisation and phenotyping of EVs, examination of the role of EVs in cell–to–cell communication pathways and the identification and validation of EVs as disease biomarkers. Finally, we discuss the potential of innovative single-vesicle imaging and analysis methodologies using microfluidic devices, which promise to deliver rapid and effective basic and practical applications for minimally invasive prognosis systems.
Original publication:
Bordanaba-Florit, G., Royo, F., Kruglik, S.G. et al. Using single-vesicle technologies to unravel the heterogeneity of extracellular vesicles. Nat Protoc (2021).
DOI: https://doi.org/10.1038/s41596-021-00551-z
Schematic overview of the main single-vesicle analysis techniques discussed in this review. Data visualization and single-vesicle interpretation are depicted.
Technologies for the analysis of single extracellular vesicles2021-06-222021-06-22https://proevlifecycle.eu/wp-content/uploads/2019/07/logo.pngproEVLifeCyclehttps://proevlifecycle.eu/wp-content/uploads/2021/06/bild1-1.jpg200px200px
Doctor Molewaterplein 40
3015 GD Rotterdam
E-mail: proevlifecycle@erasmusmc.nl
proEVLifeCycle is funded by the European Union's Horizon 2020 research and innovation programme under the Marie Skłodowska-Curie grant agreement No 860303
So here we are, finally all together in the beautiful city of Cardiff! #proEVLifeCycle #prostatecancer #EVs… https://t.co/qquT2d22S0	3 months ago
RT @GSEV10 : Well deserved - congratulations, @AnHendrix2 ! https://t.co/72GdDEljkH	8 months ago
All rights reserved Erasmus MC ©2019 | Website by Xinner Media
We use cookies to ensure that we give you the best experience on our website. If you continue to use this site we will assume that you are happy with it.OkPrivacy statement


I'd never heard of the song "Pineapple Picker." It took me a while to run down Lanza's version, and as I listened to the song, all I could think of was Carmen Miranda. That sent me off on another search, to see if she might have sung "Pineapple Picker." I couldn't find that, but I did find this, which left me laughing heartily.
All in all, a perfect post and segue(s) for a Sunday afternoon.
Thanks for that clip. "Lucy" never gets old.


text:
Lady Antebellum - Need You Now
Guest Author - Kathy Lyngholm
The reigning CMA Group of the Year has released their sophomore album and it is even better than the first! There is no sophomore slump for this trio with this CD, it is pure listening pleasure for your ears.
I couldn�t wait for this release to hit the stores so I could buy it because with the success of the single Need You Now I knew it was going to be an awesome release and the group did not disappoint me. I waited a little bit to post the review to make sure after listening to the different tracks that I wasn�t just over reacting to Lady A�s newest creation.
Need You Now is just the tip of the iceberg on this CD, if you like that song you�ll love the rest of the CD. Charles, Hillary and Dave co-wrote 7 of the 11 songs in total. Charles actually co-wrote one other too. Their stamp is all over the music that they sing.
One of my favorite songs on the entire CD is Ready to Love Again which features Hillary singing lead vocals and is the last track. It is a slower tempo and showcases Hillarys range of vocals without being overshadowed.
Another great thing that Lady A does for their fans that purchase their CD�s is to offer a new downloadable song each month. For March it is an acoustical version of I Run to You.
Need You Now is about former lovers that are trying to break off their affair and it just isn�t working in the middle of the night.
Our Kind of Love talks about having fun and enjoying a relationship and the love comes naturally.
American Honey speaks about a young girl growing up in a small town and missing it as she gets older.
Hello World is about a man who realizes that his family is his world, not work, not traveling but those most important to him.
Perfect Day talks about having a good time and things going your way, just enjoying life to the fullest.
Love This Pain is about someone that keeps going back to someone that is not good for them. All that seems to happen is that they get hurt.
When You Got a Good Thing is a ballad about a man and woman that have found each other and know that this is a forever kind of thing and don�t want to lose it.
Stars Tonight is a toe tapper that talks about band and having fun with the crowd, then being part of the crowd.
If I Knew Then talks about hindsight and how different a relationship could be if we knew then what we know now.
Something �Bout a Woman talks about a man that loves having a woman wearing his t-shirt and how he loves the things she does.
Ready to Love Again talks about a woman who is ready to enter a new relationship after being hurt before.
Content copyright © 2021 by Kathy Lyngholm. All rights reserved.
This content was written by Kathy Lyngholm. If you wish to use this content in any manner, you need written permission. Contact BellaOnline Administration for details.
Stop by and talk about your interest in Country Music!
Country Music Forum
Country Music Breakup Songs
Kathy Lyngholm
NOW That's What I Call The USA
2010 ACM Award Winners
Country Music : Independent Labels or Major Labels
Subscribe for free weekly updates from this Country Music site.
Follow Country Music
Country Music Categories
Christmas/Holiday Music
Country CDs, Posters & Books
Country Legends
Duos/Groups
Editor Recommended
Male Artists
Texas Music


text:
Q: How can I perform flood fill with HTML Canvas? Has anyone implemented a flood fill algorithm in javascript for use with HTML Canvas?
My requirements are simple: flood with a single color starting from a single point, where the boundary color is any color greater than a certain delta of the color at the specified point.
var r1, r2; // red values
var g1, g2; // green values
var b1, b2; // blue values
var actualColorDelta = Math.sqrt((r1 - r2)*(r1 - r2) + (g1 - g2)*(g1 - g2) + (b1 - b2)*(b1 - b2))

function floodFill(canvas, x, y, fillColor, borderColorDelta) {
  ...
}

Update:
I wrote my own implementation of flood fill, which follows. It is slow, but accurate. About 37% of the time is taken up in two low-level array functions that are part of the prototype framework. They are called by push and pop, I presume. Most of the rest of the time is spent in the main loop.
var ImageProcessing;

ImageProcessing = {

  /* Convert HTML color (e.g. "#rrggbb" or "#rrggbbaa") to object with properties r, g, b, a.
   * If no alpha value is given, 255 (0xff) will be assumed.
   */
  toRGB: function (color) {
    var r, g, b, a, html;
    html = color;

    // Parse out the RGBA values from the HTML Code
    if (html.substring(0, 1) === "#")
    {
      html = html.substring(1);
    }

    if (html.length === 3 || html.length === 4)
    {
      r = html.substring(0, 1);
      r = r + r;

      g = html.substring(1, 2);
      g = g + g;

      b = html.substring(2, 3);
      b = b + b;

      if (html.length === 4) {
        a = html.substring(3, 4);
        a = a + a;
      }
      else {
        a = "ff";
      }
    }
    else if (html.length === 6 || html.length === 8)
    {
      r = html.substring(0, 2);
      g = html.substring(2, 4);
      b = html.substring(4, 6);
      a = html.length === 6 ? "ff" : html.substring(6, 8);
    }

    // Convert from Hex (Hexidecimal) to Decimal
    r = parseInt(r, 16);
    g = parseInt(g, 16);
    b = parseInt(b, 16);
    a = parseInt(a, 16);
    return {r: r, g: g, b: b, a: a};
  },

  /* Get the color at the given x,y location from the pixels array, assuming the array has a width and height as given.
   * This interprets the 1-D array as a 2-D array.
   *
   * If useColor is defined, its values will be set. This saves on object creation.
   */
  getColor: function (pixels, x, y, width, height, useColor) {
    var redIndex = y * width * 4 + x * 4;
    if (useColor === undefined) {
      useColor = { r: pixels[redIndex], g: pixels[redIndex + 1], b: pixels[redIndex + 2], a: pixels[redIndex + 3] };
    }
    else {
      useColor.r = pixels[redIndex];
      useColor.g = pixels[redIndex + 1]
      useColor.b = pixels[redIndex + 2];
      useColor.a = pixels[redIndex + 3];
    }
    return useColor;
  },

  setColor: function (pixels, x, y, width, height, color) {
    var redIndex = y * width * 4 + x * 4;
    pixels[redIndex] = color.r;
    pixels[redIndex + 1] = color.g,
    pixels[redIndex + 2] = color.b;
    pixels[redIndex + 3] = color.a;
  },

/*
 * fill: Flood a canvas with the given fill color.
 *
 * Returns a rectangle { x, y, width, height } that defines the maximum extent of the pixels that were changed.
 *
 *    canvas .................... Canvas to modify.
 *    fillColor ................. RGBA Color to fill with.
 *                                This may be a string ("#rrggbbaa") or an object of the form { r: red, g: green, b: blue, a: alpha }.
 *    x, y ...................... Coordinates of seed point to start flooding.
 *    bounds .................... Restrict flooding to this rectangular region of canvas.
 *                                This object has these attributes: { x, y, width, height }.
 *                                If undefined or null, use the whole of the canvas.
 *    stopFunction .............. Function that decides if a pixel is a boundary that should cause
 *                                flooding to stop. If omitted, any pixel that differs from seedColor
 *                                will cause flooding to stop. seedColor is the color under the seed point (x,y).
 *                                Parameters: stopFunction(fillColor, seedColor, pixelColor).
 *                                Returns true if flooding shoud stop.
 *                                The colors are objects of the form { r: red, g: green, b: blue, a: alpha }
 */
 fill: function (canvas, fillColor, x, y, bounds, stopFunction) {
    // Supply default values if necessary.
    var ctx, minChangedX, minChangedY, maxChangedX, maxChangedY, wasTested, shouldTest, imageData, pixels, currentX, currentY, currentColor, currentIndex, seedColor, tryX, tryY, tryIndex, boundsWidth, boundsHeight, pixelStart, fillRed, fillGreen, fillBlue, fillAlpha;
    if (Object.isString(fillColor)) {
      fillColor = ImageProcessing.toRGB(fillColor);
    }
    x = Math.round(x);
    y = Math.round(y);
    if (bounds === null || bounds === undefined) {
      bounds = { x: 0, y: 0, width: canvas.width, height: canvas.height };
    }
    else {
      bounds = { x: Math.round(bounds.x), y: Math.round(bounds.y), width: Math.round(bounds.y), height: Math.round(bounds.height) };
    }
    if (stopFunction === null || stopFunction === undefined) {
      stopFunction = new function (fillColor, seedColor, pixelColor) {
        return pixelColor.r != seedColor.r || pixelColor.g != seedColor.g || pixelColor.b != seedColor.b || pixelColor.a != seedColor.a;
      }
    }
    minChangedX = maxChangedX = x - bounds.x;
    minChangedY = maxChangedY = y - bounds.y;
    boundsWidth = bounds.width;
    boundsHeight = bounds.height;

    // Initialize wasTested to false. As we check each pixel to decide if it should be painted with the new color,
    // we will mark it with a true value at wasTested[row = y][column = x];
    wasTested = new Array(boundsHeight * boundsWidth);
    /*
    $R(0, bounds.height - 1).each(function (row) {
      var subArray = new Array(bounds.width);
      wasTested[row] = subArray;
    });
    */

    // Start with a single point that we know we should test: (x, y).
    // Convert (x,y) to image data coordinates by subtracting the bounds' origin.
    currentX = x - bounds.x;
    currentY = y - bounds.y;
    currentIndex = currentY * boundsWidth + currentX;
    shouldTest = [ currentIndex ];

    ctx = canvas.getContext("2d");
    //imageData = ctx.getImageData(bounds.x, bounds.y, bounds.width, bounds.height);
    imageData = ImageProcessing.getImageData(ctx, bounds.x, bounds.y, bounds.width, bounds.height);
    pixels = imageData.data;
    seedColor = ImageProcessing.getColor(pixels, currentX, currentY, boundsWidth, boundsHeight);
    currentColor = { r: 0, g: 0, b: 0, a: 1 };
    fillRed = fillColor.r;
    fillGreen = fillColor.g;
    fillBlue = fillColor.b;
    fillAlpha = fillColor.a;
    while (shouldTest.length > 0) {
      currentIndex = shouldTest.pop();
      currentX = currentIndex % boundsWidth;
      currentY = (currentIndex - currentX) / boundsWidth;
      if (! wasTested[currentIndex]) {
        wasTested[currentIndex] = true;
        //currentColor = ImageProcessing.getColor(pixels, currentX, currentY, boundsWidth, boundsHeight, currentColor);
        // Inline getColor for performance.
        pixelStart = currentIndex * 4;
        currentColor.r = pixels[pixelStart];
        currentColor.g = pixels[pixelStart + 1]
        currentColor.b = pixels[pixelStart + 2];
        currentColor.a = pixels[pixelStart + 3];

        if (! stopFunction(fillColor, seedColor, currentColor)) {
          // Color the pixel with the fill color.
          //ImageProcessing.setColor(pixels, currentX, currentY, boundsWidth, boundsHeight, fillColor);
          // Inline setColor for performance
          pixels[pixelStart] = fillRed;
          pixels[pixelStart + 1] = fillGreen;
          pixels[pixelStart + 2] = fillBlue;
          pixels[pixelStart + 3] = fillAlpha;

          if (minChangedX < currentX) { minChangedX = currentX; }
          else if (maxChangedX > currentX) { maxChangedX = currentX; }
          if (minChangedY < currentY) { minChangedY = currentY; }
          else if (maxChangedY > currentY) { maxChangedY = currentY; }

          // Add the adjacent four pixels to the list to be tested, unless they have already been tested.
          tryX = currentX - 1;
          tryY = currentY;
          tryIndex = tryY * boundsWidth + tryX;
          if (tryX >= 0 && ! wasTested[tryIndex]) {
            shouldTest.push(tryIndex);
          }
          tryX = currentX;
          tryY = currentY + 1;
          tryIndex = tryY * boundsWidth + tryX;
          if (tryY < boundsHeight && ! wasTested[tryIndex]) {
            shouldTest.push(tryIndex);
          }
          tryX = currentX + 1;
          tryY = currentY;
          tryIndex = tryY * boundsWidth + tryX;
          if (tryX < boundsWidth && ! wasTested[tryIndex]) {
            shouldTest.push(tryIndex);
          }
          tryX = currentX;
          tryY = currentY - 1;
          tryIndex = tryY * boundsWidth + tryX;
          if (tryY >= 0 && ! wasTested[tryIndex]) {
            shouldTest.push(tryIndex);
          }
        }
      }
    }
    //ctx.putImageData(imageData, bounds.x, bounds.y);
    ImageProcessing.putImageData(ctx, imageData, bounds.x, bounds.y);

    return { x: minChangedX + bounds.x, y: minChangedY + bounds.y, width: maxChangedX - minChangedX + 1, height: maxChangedY - minChangedY + 1 };
  },

  getImageData: function (ctx, x, y, w, h) {
    return ctx.getImageData(x, y, w, h);
  },

  putImageData: function (ctx, data, x, y) {
    ctx.putImageData(data, x, y);
  }

};

BTW, when I call this, I use a custom stopFunction:
  stopFill : function (fillColor, seedColor, pixelColor) {
    // Ignore alpha difference for now.
    return Math.abs(pixelColor.r - seedColor.r) > this.colorTolerance || Math.abs(pixelColor.g - seedColor.g) > this.colorTolerance || Math.abs(pixelColor.b - seedColor.b) > this.colorTolerance;
  },

If anyone can see a way to improve performance of this code, I would appreciate it. The basic idea is:
  1) Seed color is the initial color at the point to start flooding.
  2) Try four adjacent points: up, right, down and left one pixel.
  3) If point is out of range or has been visited already, skip it.
  4) Otherwise push point onto to the stack of interesting points.
  5) Pop the next interesting point off the stack.
  6) If the color at that point is a stop color (as defined in the stopFunction) then stop processing that point and skip to step 5.
  7) Otherwise, skip to step 2.
  8) When there are no more interesting points to visit, stop looping.
Remembering that a point has been visited requires an array with the same number of elements as there are pixels.

A: To create a flood fill you need to be able to look at the pixels that are there already and check they aren't the color you started with so something like this.

const ctx = document.querySelector("canvas").getContext("2d");

ctx.beginPath();
ctx.moveTo(20, 20);
ctx.lineTo(250, 70);
ctx.lineTo(270, 120);
ctx.lineTo(170, 140);
ctx.lineTo(190, 80);
ctx.lineTo(100, 60);
ctx.lineTo(50, 130);
ctx.lineTo(20, 20);
ctx.stroke();

floodFill(ctx, 40, 50, [255, 0, 0, 255]);

function getPixel(imageData, x, y) {
  if (x < 0 || y < 0 || x >= imageData.width || y >= imageData.height) {
    return [-1, -1, -1, -1];  // impossible color
  } else {
    const offset = (y * imageData.width + x) * 4;
    return imageData.data.slice(offset, offset + 4);
  }
}

function setPixel(imageData, x, y, color) {
  const offset = (y * imageData.width + x) * 4;
  imageData.data[offset + 0] = color[0];
  imageData.data[offset + 1] = color[1];
  imageData.data[offset + 2] = color[2];
  imageData.data[offset + 3] = color[0];
}

function colorsMatch(a, b) {
  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];
}

function floodFill(ctx, x, y, fillColor) {
  // read the pixels in the canvas
  const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);

  // get the color we're filling
  const targetColor = getPixel(imageData, x, y);

  // check we are actually filling a different color
  if (!colorsMatch(targetColor, fillColor)) {

    fillPixel(imageData, x, y, targetColor, fillColor);

    // put the data back
    ctx.putImageData(imageData, 0, 0);
  }
}

function fillPixel(imageData, x, y, targetColor, fillColor) {
  const currentColor = getPixel(imageData, x, y);
  if (colorsMatch(currentColor, targetColor)) {
    setPixel(imageData, x, y, fillColor);
    fillPixel(imageData, x + 1, y, targetColor, fillColor);
    fillPixel(imageData, x - 1, y, targetColor, fillColor);
    fillPixel(imageData, x, y + 1, targetColor, fillColor);
    fillPixel(imageData, x, y - 1, targetColor, fillColor);
  }
}
<canvas></canvas>

There's at least 2 problems with this code though.

*

*It's deeply recursive.
So you might run out of stack space

*It's slow.
No idea if it's too slow but JavaScript in the browser is mostly single threaded so while this code is running the browser is frozen. For a large canvas that frozen time might make the page really slow and if it's frozen too long the browser will ask if the user wants to kill the page.
The solution to running out of stack space is to implement our own stack. For example instead of recursively calling fillPixel we could keep an array of positions we want to look at. We'd add the 4 positions to that array and then pop things off the array until it's empty

const ctx = document.querySelector("canvas").getContext("2d");

ctx.beginPath();
ctx.moveTo(20, 20);
ctx.lineTo(250, 70);
ctx.lineTo(270, 120);
ctx.lineTo(170, 140);
ctx.lineTo(190, 80);
ctx.lineTo(100, 60);
ctx.lineTo(50, 130);
ctx.lineTo(20, 20);
ctx.stroke();

floodFill(ctx, 40, 50, [255, 0, 0, 255]);

function getPixel(imageData, x, y) {
  if (x < 0 || y < 0 || x >= imageData.width || y >= imageData.height) {
    return [-1, -1, -1, -1];  // impossible color
  } else {
    const offset = (y * imageData.width + x) * 4;
    return imageData.data.slice(offset, offset + 4);
  }
}

function setPixel(imageData, x, y, color) {
  const offset = (y * imageData.width + x) * 4;
  imageData.data[offset + 0] = color[0];
  imageData.data[offset + 1] = color[1];
  imageData.data[offset + 2] = color[2];
  imageData.data[offset + 3] = color[0];
}

function colorsMatch(a, b) {
  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];
}

function floodFill(ctx, x, y, fillColor) {
  // read the pixels in the canvas
  const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);

  // get the color we're filling
  const targetColor = getPixel(imageData, x, y);

  // check we are actually filling a different color
  if (!colorsMatch(targetColor, fillColor)) {

    const pixelsToCheck = [x, y];
    while (pixelsToCheck.length > 0) {
      const y = pixelsToCheck.pop();
      const x = pixelsToCheck.pop();

      const currentColor = getPixel(imageData, x, y);
      if (colorsMatch(currentColor, targetColor)) {
        setPixel(imageData, x, y, fillColor);
        pixelsToCheck.push(x + 1, y);
        pixelsToCheck.push(x - 1, y);
        pixelsToCheck.push(x, y + 1);
        pixelsToCheck.push(x, y - 1);
      }
    }

    // put the data back
    ctx.putImageData(imageData, 0, 0);
  }
}
<canvas></canvas>

The solution to it being too slow is either to make it run a little at a time OR to move it to a worker. I think that's a little too much to show in the same answer though here's an example.
I tested the code above on a 4096x4096 canvas and it took 16 seconds to fill a blank canvas on my machine so yes it's arguably too slow but putting it in a worker brings new problems which is that the result will be asynchronous so even though the browser wouldn't freeze you'd probably want to prevent the user from doing something until it finishes.
Another issue is you'll see the lines are antialiased and so filling with a solid color fills close the the line but not all the way up to it. To fix that you can change colorsMatch to check for close enough but then you have a new problem that if targetColor and fillColor are also close enough it will keep trying to fill itself. You could solve that by making another array, one byte or one bit per pixel to track places you've ready checked.

const ctx = document.querySelector("canvas").getContext("2d");

ctx.beginPath();
ctx.moveTo(20, 20);
ctx.lineTo(250, 70);
ctx.lineTo(270, 120);
ctx.lineTo(170, 140);
ctx.lineTo(190, 80);
ctx.lineTo(100, 60);
ctx.lineTo(50, 130);
ctx.lineTo(20, 20);
ctx.stroke();

floodFill(ctx, 40, 50, [255, 0, 0, 255], 128);

function getPixel(imageData, x, y) {
  if (x < 0 || y < 0 || x >= imageData.width || y >= imageData.height) {
    return [-1, -1, -1, -1];  // impossible color
  } else {
    const offset = (y * imageData.width + x) * 4;
    return imageData.data.slice(offset, offset + 4);
  }
}

function setPixel(imageData, x, y, color) {
  const offset = (y * imageData.width + x) * 4;
  imageData.data[offset + 0] = color[0];
  imageData.data[offset + 1] = color[1];
  imageData.data[offset + 2] = color[2];
  imageData.data[offset + 3] = color[0];
}

function colorsMatch(a, b, rangeSq) {
  const dr = a[0] - b[0];
  const dg = a[1] - b[1];
  const db = a[2] - b[2];
  const da = a[3] - b[3];
  return dr * dr + dg * dg + db * db + da * da < rangeSq;
}

function floodFill(ctx, x, y, fillColor, range = 1) {
  // read the pixels in the canvas
  const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);

  // flags for if we visited a pixel already
  const visited = new Uint8Array(imageData.width, imageData.height);

  // get the color we're filling
  const targetColor = getPixel(imageData, x, y);

  // check we are actually filling a different color
  if (!colorsMatch(targetColor, fillColor)) {

    const rangeSq = range * range;
    const pixelsToCheck = [x, y];
    while (pixelsToCheck.length > 0) {
      const y = pixelsToCheck.pop();
      const x = pixelsToCheck.pop();

      const currentColor = getPixel(imageData, x, y);
      if (!visited[y * imageData.width + x] &&
           colorsMatch(currentColor, targetColor, rangeSq)) {
        setPixel(imageData, x, y, fillColor);
        visited[y * imageData.width + x] = 1;  // mark we were here already
        pixelsToCheck.push(x + 1, y);
        pixelsToCheck.push(x - 1, y);
        pixelsToCheck.push(x, y + 1);
        pixelsToCheck.push(x, y - 1);
      }
    }

    // put the data back
    ctx.putImageData(imageData, 0, 0);
  }
}
<canvas></canvas>

Note that this version of colorsMatch is kind of naive. It might be better to convert to HSV or something or maybe you want to weight by alpha. I don't know what a good metric is for matching colors.
Update
Another way to speed things up is of course to just optimize the code. Kaiido pointed out an obvious speedup which is to use a Uint32Array view on the pixels. That way looking up a pixel and setting a pixel there's just one 32bit value to read or write. Just that change makes it about 4x faster. It still takes 4 seconds to fill a 4096x4096 canvas though. There might be other optimizations like instead of calling getPixels make that inline but don't push a new pixel on our list of pixels to check if they are out of range. It might be 10% speed up (no idea) but won't make it fast enough to be an interactive speed.
There are other speedups like checking across a row at a time since rows are cache friendly and you can compute the offset to a row once and use that while checking the entire row whereas now for every pixel we have to compute the offset multiple times.
Those will complicate the algorithm so they are best left for you to figure out.
Let me also add, given the answer above freezes the browser while the fill is happening and that on a larger canvas that freeze could be too long, you can easily make the algorithm span over time using ES6 async/await. You need to choose how much work to give each segment of time. Choose too small and it will take a long time to fill. Choose too large and you'll get jank as the browser freezes.
Here's an example. Set ticksPerUpdate to speed up or slow down the fill rate

const ctx = document.querySelector("canvas").getContext("2d");

ctx.beginPath();
ctx.moveTo(20, 20);
ctx.lineTo(250, 70);
ctx.lineTo(270, 120);
ctx.lineTo(170, 140);
ctx.lineTo(100, 145);
ctx.lineTo(110, 105);
ctx.lineTo(130, 125);
ctx.lineTo(190, 80);
ctx.lineTo(100, 60);
ctx.lineTo(50, 130);
ctx.lineTo(20, 20);
ctx.stroke();

floodFill(ctx, 40, 50, 0xFF0000FF);

function getPixel(pixelData, x, y) {
  if (x < 0 || y < 0 || x >= pixelData.width || y >= pixelData.height) {
    return -1;  // impossible color
  } else {
    return pixelData.data[y * pixelData.width + x];
  }
}

async function floodFill(ctx, x, y, fillColor) {
  // read the pixels in the canvas
  const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);

  // make a Uint32Array view on the pixels so we can manipulate pixels
  // one 32bit value at a time instead of as 4 bytes per pixel
  const pixelData = {
    width: imageData.width,
    height: imageData.height,
    data: new Uint32Array(imageData.data.buffer),
  };

  // get the color we're filling
  const targetColor = getPixel(pixelData, x, y);

  // check we are actually filling a different color
  if (targetColor !== fillColor) {

    const ticksPerUpdate = 50;
    let tickCount = 0;
    const pixelsToCheck = [x, y];
    while (pixelsToCheck.length > 0) {
      const y = pixelsToCheck.pop();
      const x = pixelsToCheck.pop();

      const currentColor = getPixel(pixelData, x, y);
      if (currentColor === targetColor) {
        pixelData.data[y * pixelData.width + x] = fillColor;

        // put the data back
        ctx.putImageData(imageData, 0, 0);
        ++tickCount;
        if (tickCount % ticksPerUpdate === 0) {
          await wait();
        }

        pixelsToCheck.push(x + 1, y);
        pixelsToCheck.push(x - 1, y);
        pixelsToCheck.push(x, y + 1);
        pixelsToCheck.push(x, y - 1);
      }
    }
  }
}

function wait(delay = 0) {
  return new Promise((resolve) => {
    setTimeout(resolve, delay);
  });
}
<canvas></canvas>

update update
Instead of setTimeout which is throttled by the browser, you can abuse postMessage which is not
function makeExposedPromise() {
  let resolve;
  let reject;
  const promise = new Promise((_resolve, _reject) => {
    resolve = _resolve;
    reject = _reject;
  });
  return { promise, resolve, reject };
}

const resolveFns = [];

window.addEventListener('message', (e) => {
  const resolve = resolveFns.shift();
  resolve();
});

function wait() {
  const {resolve, promise} = makeExposedPromise();
  resolveFns.push(resolve);
  window.postMessage('');
  return promise;
}

If you use that it there's less need to choose a number of operations. Also note: the slowest part is calling putImageData. The reason it's inside the loop above is only so we can see the progress. Move that to the end and it will run much faster

function makeExposedPromise() {
  let resolve;
  let reject;
  const promise = new Promise((_resolve, _reject) => {
    resolve = _resolve;
    reject = _reject;
  });
  return { promise, resolve, reject };
}

const resolveFns = [];

window.addEventListener('message', (e) => {
  const resolve = resolveFns.shift();
  resolve();
});

function wait() {
  const {resolve, promise} = makeExposedPromise();
  resolveFns.push(resolve);
  window.postMessage('');
  return promise;
}

const ctx = document.querySelector("canvas").getContext("2d");

ctx.beginPath();
ctx.moveTo(20, 20);
ctx.lineTo(250, 70);
ctx.lineTo(270, 120);
ctx.lineTo(170, 140);
ctx.lineTo(100, 145);
ctx.lineTo(110, 105);
ctx.lineTo(130, 125);
ctx.lineTo(190, 80);
ctx.lineTo(100, 60);
ctx.lineTo(50, 130);
ctx.lineTo(20, 20);
ctx.stroke();

floodFill(ctx, 40, 50, 0xFF0000FF);

function getPixel(pixelData, x, y) {
  if (x < 0 || y < 0 || x >= pixelData.width || y >= pixelData.height) {
    return -1;  // impossible color
  } else {
    return pixelData.data[y * pixelData.width + x];
  }
}

async function floodFill(ctx, x, y, fillColor) {
  // read the pixels in the canvas
  const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);

  // make a Uint32Array view on the pixels so we can manipulate pixels
  // one 32bit value at a time instead of as 4 bytes per pixel
  const pixelData = {
    width: imageData.width,
    height: imageData.height,
    data: new Uint32Array(imageData.data.buffer),
  };

  // get the color we're filling
  const targetColor = getPixel(pixelData, x, y);

  // check we are actually filling a different color
  if (targetColor !== fillColor) {

    const pixelsToCheck = [x, y];
    while (pixelsToCheck.length > 0) {
      const y = pixelsToCheck.pop();
      const x = pixelsToCheck.pop();

      const currentColor = getPixel(pixelData, x, y);
      if (currentColor === targetColor) {
        pixelData.data[y * pixelData.width + x] = fillColor;

        await wait();

        pixelsToCheck.push(x + 1, y);
        pixelsToCheck.push(x - 1, y);
        pixelsToCheck.push(x, y + 1);
        pixelsToCheck.push(x, y - 1);
      }
    }
    // put the data back
    ctx.putImageData(imageData, 0, 0);
  }
}
<canvas></canvas>

It's still better to choose a number of operations per call to wait
There are also faster algorithms. The issue with the one above is there is for every pixel that matches, 4 are added to the stack of things to pixels to check. That's lots of allocations and multiple checking. A faster way is to it by span.
For a given span, check as far left as you can, then as far right as you can, now fill that span. Then, check the pixels above and/or below the span you just found and add the spans you find to your stack. Pop the top span off, and try to expand it left and right. There's no need to check the pixels in the middle since you already checked them. Further, if this span was generated from one below then you don't need to check the pixels below the starting sub-span of this span since you know that area was already filled. Similarly if this pan was generated from one above then you don't need to check the pixels above the starting sub-span of this span for the same reason.

function main() {
  const ctx = document.querySelector("canvas").getContext("2d");

  ctx.beginPath();

  ctx.moveTo(20, 20);
  ctx.lineTo(250, 70);
  ctx.lineTo(270, 120);
  ctx.lineTo(170, 140);
  ctx.lineTo(100, 145);
  ctx.lineTo(110, 105);
  ctx.lineTo(130, 125);
  ctx.lineTo(190, 80);
  ctx.lineTo(100, 60);
  ctx.lineTo(50, 130);
  ctx.lineTo(20, 20);

  ctx.stroke();

  floodFill(ctx, 40, 50, 0xFF0000FF);
}
main();

function getPixel(pixelData, x, y) {
  if (x < 0 || y < 0 || x >= pixelData.width || y >= pixelData.height) {
    return -1;  // impossible color
  } else {
    return pixelData.data[y * pixelData.width + x];
  }
}

function floodFill(ctx, x, y, fillColor) {
  // read the pixels in the canvas
  const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);

  // make a Uint32Array view on the pixels so we can manipulate pixels
  // one 32bit value at a time instead of as 4 bytes per pixel
  const pixelData = {
    width: imageData.width,
    height: imageData.height,
    data: new Uint32Array(imageData.data.buffer),
  };

  // get the color we're filling
  const targetColor = getPixel(pixelData, x, y);

  // check we are actually filling a different color
  if (targetColor !== fillColor) {
    const spansToCheck = [];

    function addSpan(left, right, y, direction) {
      spansToCheck.push({left, right, y, direction});
    }

    function checkSpan(left, right, y, direction) {
      let inSpan = false;
      let start;
      let x;
      for (x = left; x < right; ++x) {
        const color = getPixel(pixelData, x, y);
        if (color === targetColor) {
          if (!inSpan) {
            inSpan = true;
            start = x;
          }
        } else {
          if (inSpan) {
            inSpan = false;
            addSpan(start, x - 1, y, direction);
          }
        }
      }
      if (inSpan) {
        inSpan = false;
        addSpan(start, x - 1, y, direction);
      }
    }

    addSpan(x, x, y, 0);

    while (spansToCheck.length > 0) {
      const {left, right, y, direction} = spansToCheck.pop();

      // do left until we hit something, while we do this check above and below and add
      let l = left;
      for (;;) {
        --l;
        const color = getPixel(pixelData, l, y);
        if (color !== targetColor) {
          break;
        }
      }
      ++l

      let r = right;
      for (;;) {
        ++r;
        const color = getPixel(pixelData, r, y);
        if (color !== targetColor) {
          break;
        }
      }

      const lineOffset = y * pixelData.width;
      pixelData.data.fill(fillColor, lineOffset + l, lineOffset + r);

      if (direction <= 0) {
        checkSpan(l, r, y - 1, -1);
      } else {
        checkSpan(l, left, y - 1, -1);
        checkSpan(right, r, y - 1, -1);
      }

      if (direction >= 0) {
        checkSpan(l, r, y + 1, +1);
      } else {
        checkSpan(l, left, y + 1, +1);
        checkSpan(right, r, y + 1, +1);
      }
    }
    // put the data back
    ctx.putImageData(imageData, 0, 0);
  }
}
<canvas></canvas>

Note: I didn't test this well, there might be an off by 1 error or other issue. I'm 99% sure I wrote the span method in 1993 for My Paint but don't remember if I have the source. But in any case, it's fast enough there's no need for wait

A: Here's an implementation that I've been working on. It can get really slow if the replacement color is too close to the original color. It's quite a bit faster in Chrome than Firefox (I haven't tested it in any other browsers).
I also haven't done exhaustive testing yet, so there may be edge cases where it doesn't work.
function getPixel(pixelData, x, y) {
    if (x < 0 || y < 0 || x >= pixelData.width || y >= pixelData.height) {
        return NaN;
    }
    var pixels = pixelData.data;
    var i = (y * pixelData.width + x) * 4;
    return ((pixels[i + 0] & 0xFF) << 24) |
           ((pixels[i + 1] & 0xFF) << 16) |
           ((pixels[i + 2] & 0xFF) <<  8) |
           ((pixels[i + 3] & 0xFF) <<  0);
}

function setPixel(pixelData, x, y, color) {
    var i = (y * pixelData.width + x) * 4;
    var pixels = pixelData.data;
    pixels[i + 0] = (color >>> 24) & 0xFF;
    pixels[i + 1] = (color >>> 16) & 0xFF;
    pixels[i + 2] = (color >>>  8) & 0xFF;
    pixels[i + 3] = (color >>>  0) & 0xFF;
}

function diff(c1, c2) {
    if (isNaN(c1) || isNaN(c2)) {
        return Infinity;
    }

    var dr = ((c1 >>> 24) & 0xFF) - ((c2 >>> 24) & 0xFF);
    var dg = ((c1 >>> 16) & 0xFF) - ((c2 >>> 16) & 0xFF);
    var db = ((c1 >>>  8) & 0xFF) - ((c2 >>>  8) & 0xFF);
    var da = ((c1 >>>  0) & 0xFF) - ((c2 >>>  0) & 0xFF);

    return dr*dr + dg*dg + db*db + da*da;
}

function floodFill(canvas, x, y, replacementColor, delta) {
    var current, w, e, stack, color, cx, cy;
    var context = canvas.getContext("2d");
    var pixelData = context.getImageData(0, 0, canvas.width, canvas.height);
    var done = [];
    for (var i = 0; i < canvas.width; i++) {
        done[i] = [];
    }

    var targetColor = getPixel(pixelData, x, y);
    delta *= delta;

    stack = [ [x, y] ];
    done[x][y] = true;
    while ((current = stack.pop())) {
        cx = current[0];
        cy = current[1];

        if (diff(getPixel(pixelData, cx, cy), targetColor) <= delta) {
            setPixel(pixelData, cx, cy, replacementColor);

            w = e = cx;
            while (w > 0 && diff(getPixel(pixelData, w - 1, cy), targetColor) <= delta) {
                --w;
                if (done[w][cy]) break;
                setPixel(pixelData, w, cy, replacementColor);
            }
            while (e < pixelData.width - 1 && diff(getPixel(pixelData, e + 1, cy), targetColor) <= delta) {
                ++e;
                if (done[e][cy]) break;
                setPixel(pixelData, e, cy, replacementColor);
            }

            for (cx = w; cx <= e; cx++) {
                if (cy > 0) {
                    color = getPixel(pixelData, cx, cy - 1);
                    if (diff(color, targetColor) <= delta) {
                        if (!done[cx][cy - 1]) {
                            stack.push([cx, cy - 1]);
                            done[cx][cy - 1] = true;
                        }
                    }
                }
                if (cy < canvas.height - 1) {
                    color = getPixel(pixelData, cx, cy + 1);
                    if (diff(color, targetColor) <= delta) {
                        if (!done[cx][cy + 1]) {
                            stack.push([cx, cy + 1]);
                            done[cx][cy + 1] = true;
                        }
                    }
                }
            }
        }
    }

    context.putImageData(pixelData, 0, 0, 0, 0, canvas.width, canvas.height);
}

A: I would not treat the canvas as a bitmap image.
Instead I would keep a collection of painting-objects and modify that collection.
Then for example you can fill a path or shape or add a new shape that has the boundaries of the objects you are trying to fill.
I can't see how "normal" floodFill makes sense in vector drawing..


Just in time for the Holidays keep an eye on the new page about Box Sets, because they won't appear in the Books listings. All box sets are 4.99$ in e-book format only.
Besides the Books of the Immortals Box Set, not there's the Complete Chronicles of the Varian Empire. Soon another will follow.
And there are sales coming up on Kobo only. Axelle (This promo will be advertised to Kobo customers worldwide) and Brainwaves (for the holidays and boxing week in the following territories: Canada, United States, the UK, Australia & New Zealand) so keep an eye on the Kobo store! Happy Holiday Season!


Cobos, Ellington, Maduabum & McKenzie, LLC is a full service firm with offices in New Jersey and New York. The principals of the firm have extensive legal experience in both litigation and transactional matters representing a diverse client base from Fortune 500 Companies to individuals.
Our practice also includes representation before the United States Patent and Trademark Office, United States Court of International Trade and International Commercial Arbitrations.


text:
Posted on August 21, 2017 September 1, 2017 by anthonybut
The merits of Zweli Mkhize (from 2013)
Mkhize the man to watch as stalwarts in the ANC age
29 NOVEMBER 2013 – 07:27 ANTHONY BUTLER
IT IS unlikely that President Jacob Zuma will retire to his Nkandla security estate before his second term expires in 2019. His successor will probably aim to serve out two full terms as African National Congress (ANC) and state president. For these reasons, age may play a significant role in the forthcoming leadership succession process.
Nkosazana Dlamini-Zuma was born in 1949. If she were to be elected ANC president at the movement's 2017 conference, she would be 68 years old. She would be 70 by the time she reached the Union Buildings. Cyril Ramaphosa is no spring chicken. Born in November 1952, he would be ANC president at 65 and state president at 66.
At 52, ANC Gauteng chairman Paul Mashatile is just young enough to bide his time. (In any event, his province's current marginalisation makes a 2017 run impossible.) Malusi Gigaba was born only in 1971.
Zweli Mkhize, however, is a man in a hurry. Born in 1956, he probably cannot afford to wait for a rival to serve even a single term.
The present dominance of KwaZulu-Natal may also be a passing phenomenon and he will want to fully exploit the coherent political machine he helped to build.
Mkhize undoubtedly has the demeanour of a potential president. Like Ramaphosa, he came from a humble background and internalised a strong sense of personal discipline. The child of labour tenants in Willowfountain, he was rescued from farm labour by the sacrifices of his family and by his keen intelligence.
He is a moderniser but he has negotiated the traditional politics of KwaZulu-Natal with great dexterity. He is proud of his heritage as a descendant of the Mkhizes of Nkandla.
He claims that he cannot wait to retire from politics and devote all his time to his real passion: breeding Nguni cows in the thornveld.
His interest in politics was awakened by the protests of one of Pietermaritzburg's most extraordinary eccentrics, the late David Cecil Oxford Matiwane in apartheid times.
The Latin-spouting Matiwane would arrive in town dressed in a suit to which he had pinned dozens of political pamphlets. He would encourage people to take them off his suit and keep them and arrest almost invariably followed. Mkhize was awestruck.
He qualified as a doctor despite his student political commitments, and he completed his internship in Durban in 1983.
He worked briefly at Edendale Hospital before going into exile in 1986. He practised medicine and worked for the ANC in Swaziland and Zimbabwe, before returning to South Africa in 1991.
He rose steadily from ANC regional treasurer in the violence-wracked Natal Midlands (where he was involved in peacemaking in the 1980s and 1990s) to provincial ANC chairman.
He was MEC for health from 1994 to 2004 and formed a close political alliance with Zuma. After a term as finance and economic development MEC, he became premier of KwaZulu-Natal in 2009. At Mangaung, he was elected the ANC's treasurer-general.
Mkhize has been deeply immersed in the intricate game of provincial patronage politics, but he has escaped major scandal. He was recently attacked for spending R1.2m on 45 private jet trips when he was premier but disarmed critics by agreeing to repay the money if asked to do so by his successor.
He appears to be equally comfortable with diverse constituencies, from traditional leaders to businesspeople and the media. He can speak coherently for 30 minutes without notes. His family is a model of sanity and charm despite the obvious demands made on them by political life.
Mkhize has an interest in public policy and his views on economic and social policy seem to be broadly orthodox or conservative. He backs the National Development Plan.
He exhibits only one weakness. Despite his age, he is essentially a provincial politician who was elected to the national executive committee as late as 1997. It remains to be seen if he can use the office of treasurer-general to cement national political alliances. He will be hard to stop.
• Butler teaches politics at the University of Cape Town.
Previous PostPrevious Spiritual tourism in South Africa (from 2013)
Next PostNext Some thoughts on the EFF and parliament (from 2014)


text:
O'Barr named new Pike County fire chief
By Staff Writer on December 22, 2014
Pike County commissioners voted unanimously to approve Richard O'Barr of Zebulon as Pike's new fire chief at their Dec. 10 meeting. 'The panel unanimously decided on O'Barr as the county's new fire chief,' said county manager John Hanson. 'We think he has what it takes to take our county forward. We think what he brings to the table will be an added advantage to the citizens of Pike. He'll provide communication we need for an efficient department.' Commissioners, administrative employees and audience members gave him a round of applause. 'I'm looking forward to working with the commissions and all the departments,' said O'Barr. 'I have a big job but we're going to provide the best customer service this county has ever seen from the fire department.'


text:
Alexis Mbongo Tekumu (ur. 20 lipca 1982) – piłkarz z Demokratycznej Republiki Konga grający na pozycji pomocnika. W swojej karierze 7 razy wystąpił w reprezentacji Demokratycznej Republiki Konga.

Kariera klubowa
W swojej karierze piłkarskiej Tekumu grał między innymi w szwajcarskich Servette FC i CS Chênois, a także w maltańskim Hibernians FC.

Kariera reprezentacyjna
W reprezentacji Demokratycznej Republiki Konga Tekumu zadebiutował w 2000 roku. W 2002 roku został powołany do kadry na Puchar Narodów Afryki 2002. Jego dorobek na tym turnieju to 4 spotkania: z Kamerunem (0:1), z Togo (0:0) i z Wybrzeżem Kości Słoniowej (3:1) i ćwierćfinale z Senegalem (0:2), w którym otrzymał czerwoną kartkę. W kadrze narodowej grał do 2002 roku i rozegrał w niej 7 meczów.

Bibliografia

Reprezentanci Demokratycznej Republiki Konga w piłce nożnej
Piłkarze Servette FC
Piłkarze CS Chênois
Piłkarze Hibernians Paola
Uczestnicy Pucharu Narodów Afryki 2002
Urodzeni w 1978

redpajama_set_name: RedPajamaWikipedia


text:
Four children dead after train hits school bus in France
It was not immediately clear why the accident happened on the crossing in Millas, nine miles west of Perpignan, close to the border with Spain
The incident happened on the crossing in Millas, nine miles west of Perpignan, close to the border with Spain. (Image: Google)
A regional train has hit a school bus on a crossing in southern France, killing four children and critically injuring seven other people on the bus.
Photos from the scene showed the train derailed and the bus cut in half.
It was not immediately clear why the incident happened on the crossing in Millas, nine miles west of Perpignan, close to the border with Spain.
France's SNCF national rail authority said witnesses described the crossing gates as functioning properly.
Regional President Carole Delga told broadcaster France-Info that "it appears that there was no mechanical problem at this crossing".
The school bus was taking children home from the Christian Bourquin school in the small village of Millas. It was carrying around 20 children aged between 11 and 15, the local authority said.
Psychological help is being offered in a local sports hall from Friday morning.
(Image: Google)
Nine other people on the bus and three on the train had less severe injuries.
An SNCF official said that the train was carrying 25 people including passengers and crew and all are accounted for and being offered psychological care. The official added that the train normally travels at 80km per hour at that location.
The official said "several witnesses said the barrier was down" at the time of the crash. She said the people on the train were "totally shocked".
Transport Minister Elisabeth Borne and Education Minister Jean-Michel Blanquer were at the scene on Thursday evening along with 70 firefighters, 10 emergency ambulances and four helicopters.
Mr Blanquer tweeted: "France is in mourning."
Prime Minister Edouard Philippe also arrived at the scene on Thursday evening.
French President Emmanuel Macron tweeted: "All my thoughts go to the victims of this terrible accident and their families. The government is fully mobilised to give them emergency help."
Latest infection rates for Greater Manchester as lockdown starts to slow down spread of coronavirus
CoronavirusThere has been a levelling off in the number of new infections in our region
TraffordTesco confirms employee has died as store hit with Covid-19 outbreak with 'number' of staff off workIt has been claimed that fifty members of staff working at the Tesco Extra store are currently off with coronavirus