Journal entry
1/23/94
After interviewing Nick Herbert and being stuck with the check for lunch, I discovered that Mr. Herbert had scribbled a phone number on the back of the reciept before leaving. It was a New Jersey exchange, I recognized it almost instantly,and underneath it the letters E.C. were scrawled. Finally, a lead ! This had to be the phone number for none other than Emory Cranston, proprietor of INCUNABULA books. So, Cranston was still on Earth Prime, and accessible by phone. I went back to my motel room and dialed the number.
[ring]
[ring]
EC: Hello ?
JM: Hi, is this Emory Cranston ?
EC: Who wants to know ?
JM: My name is Joseph Matheny. I got your phone number from Nick Herbert. I'm a reporter investigating the Ong's Hat story, and I thought you might give me some insight into where you came across all the material in INCUNABULA. I got the catalogue from a group of Culture Hackers in San Francisco.
(silence)
Is this Emory Cranston ?
EC: Who did you say you were again ?
JM: A freelance investigative reporter, doing a story on the travel cults and the Ong's Hat Institute.
EC: And who gave you this phone number ?
JM: Nick Herbert. I was trying to find out where INCUNABULA is located now.
EC: (Audible sigh on other end of line) Oh, well. At least he could have warned me. But it doesn't really matter...after all, there's no "here" here anyway, so I won't be here tommorrow. Does that answer your first question ?
JM: You mean INCUNABULA is located in "virtual space" ?
EC: As far as you're concerned, yes.
JM: Well, in the introduction to the INCUNABULA catalogue, you stated that you had uncovered "...a conspiracy so deep that no other researcher has yet become aware of it (outside of certain intelligence circles, needless to say)..." Is that still true? Why hasn't this become a more popular conspiracy theory? How did you come across this information?
EC: No, it's no longer true. Since I published the catalogue, everthing has changed. Everthing ! And look, this is no longer a "theory". I admit, when I first published, I really didn't know jack-shit about anything. Yes, I was a "conspiracy theorist", how pathetic! Let me ask you, what kind of epistemological black hole...I mean, if the conspiratoligists "know" anything it wouldn't be a "theory" anymore, would it? It'd be "fact". Who killed Kennedy? Where are the UFOs from? They don't "know", do they?
JM: You have answers to these questions ?
EC: Pal, I've got lots of answers! Alternative answers. Get it? But that's not important. You ask why "my theory" isn't better known or more "popular" ? Why aren't they discussing it at UFO conferences, eh? Why isn't it on TV? Well, there's an easy answer to that. The truth is never popular, and it's never seen on TV ! You know in your heart I'm right about this don't you? If you think about what's really important to you, you'll realize it's not popular and it's never been seen on TV (or if it has...well then I'm sorry for you). It's true, when I first came across the information...I was living in Chatsworth, in the Pine Barrens, near Ong's Hat...I was doing a catalogue...Tesla, Reich, Bioshamanics, Hollow Earth, crop circles, Mae Brussell...that sort of thing. Strange stories were circulating about the Institute out at Ong's Hat. They wouldn't talk to me. Then they disappeared. That's when I got "really" interested, and began collecting the literature. A few years later I published the catalogue to see if they'd get in touch with me. I wanted to flush them out. I wanted to know.
JM: So what happened?
 You know, most conspiratologists would die of shock if they suddenly received proof that their thoeries were real. You'll notice that not one UFO "expert" has ever been abducted. And not one Kennedy-Conspiracy nut has ever been assassinated. These things happen to other people, not to Conspiracy Theorists, right? Well, let's just say...that's what I mean when I say...this isn't a "theory" anymore.
JM: Do you feel endangered in anyway, being so outspoken about info that has obviously gotten some people killed? How do you deal with the danger, what precautions have you taken? Why are you talking to me for example?
EC: Why am I talking to you? There are reasons...reasons you don't really need to know. Just go ahead and do what ever you intend to do. Publish. But be careful. At this point, the cat's out of the bag, as Alice Schröedinger would say, (laughs). I doubt they...I don't think anyone would bother anymore...it's gone so far beyond that. Now, as to my state of savvy when I published the INCUNABULA catalogue...you know how conspiracy buffs like to pretend they're running a great risk...that hidden forces will try to silence them, blah blah. So buy my stuff now, before it's too late, etc., etc. Not one of them really believes it. I didn't believe it. I was extremely fortunate. The catalogue fell into the right hands...just about five minutes before it fell into the wrong hands. I was contacted. I was protected. Literally whisked away. In the nick of time. Next question, please.
JM: But...
EC: No no no. Read the catalogue. Think about it. Chance are you'll figure it out. You were smart enough to find this phone number, after all. That's why I'm talking to you. Next question.
JM: Ok. How many books have you sold? How many people do you think you've convinced?
EC: I'm not really running the catlogue anymore. It can't be suppressed - it's out there, it's circulating. But I'm not selling the books now. Those who need the books, get the books. I don't need the money, after all. Those who can really read the catalogue and figure out the next step...well, not everything in INCUNABULA is accurate, of course. But the clues are there. Follow the garden of forking paths. Ah, how many, you ask? I can tell you exactly. The answer is precisely 16 people have followed the thread so far. We're aware of another dozen or so who are working on it. At a certain point in their researches they'll be helped...if possible. One may blunder, you see. Some tracks lead to the Minotaur, know what I mean? And some of those dozen or so are working for the wrong people. They won't be helped.
JM: How did you obtain the more "esoteric" material, like Alternate Dimensions by "Jabir ibn Hayaan" aka Nick Herbert?
EC: Oh, Alternate Dimensions can hardly be called one of the more "esoteric" titles in the list. After all, Herbert was still a Theorist when he wrote it. The book is actually wrong on a number of points, though quite brilliant as an approach. The fact is, I tracked down Dr. Herbert when I was assembling the catalogue. I'd read his other work, and realized he must be heading in the right direction. At first he wouldn't talk to me at all. He suspected I was an agent of whatever Shadowy Forces were trying to suppress the book, and succeeding. From various angry remarks he dropped I was able to piece together the story. His manuscript and files had been stolen right out of his house, and the publishers refused to return their copies, or any of the page proofs. They were stonewalling him. So I...well, I stole it.
JM: What?
EC: I went to the publisher. I had a very strong intuition as to which group was blocking publication. I posed as an agent of that group. Apparently I was correct, and it seems I knew enough to convince the publisher of my bona fides, so to speak. He was so glad to hand over the book you'd've thought it was a bomb! Later he was fired. I suppose he's lucky to be alive, the schmuck. I copied the proofs and returned the originals to Dr. Herbert. He agreed to let me list it. After all, it was the only way his work was ever going to be distributed. Of course it's a moot point now.
JM: Well, it's obvious that you've been in contact with some of the travel cult members. Can you tell me who?
EC: That would be telling.
JM: Aw, come on! This is not turning out to be much of an interview.
EC: Nonsense, young man. What I'm giving you is gold, pure gold. All right, then...would it surprise you to hear that you've already met a fair number of "cult members"? The heiress in the Berkeley Hills who knows all about Tarantula venom? That Irish humorist who lives in James Joyce's Martello tower in Howth, outside Dublin? The aging psychedelic guru...the so called Persian Anarchist...the so called Satanic rock-star...the Montana cowboy-secret-agent-hacker...the cyberpunk SciFi Surrealist...
JM: No! They would've told me...
EC: Guess again.
JM: I believe you're...you're disinforming me here, Mr. Cranston.
EC: Check it out.
JM: I will.
EC: Do. Next question.
JM: Um, ok. Uh...what new information have you come across since the catlogue was published? What new developments have there been in this "science" of travel?
EC: I can't really tell you that. "Cult member" means nothing now. All the players know who the other players are. I'm not giving anything away. But...new developments on the tech end? No. Certain people could gain an edge just from a vague description...well, I can tell you a few things. A paper came out right after my catalogue, so it's not listed, but everyone knows about it by now. It's by Suhrawardi, it's called Not the Egg, the Joke, a bad pun on yoga. Eggless travel has become S.O.P. for advanced travellers. Some permanent doorways have been constructed which work even for non-initiates, sort of like The Lion the Witch and the Wardrobe. They're very nicely camouflaged - Fu Manchu couldn't do better. And of course they're guarded.
JM: Raiders of the Lost Ark...
EC: Eh? Oh yes...booby trapped. Definitely. It's a zero-sum game I'm afraid. Either you're on the bus or you're not on the bus. The Gateways...that's what we call them, the Gateways have to be there for those few who, shall we say, solve the catalogue without any help from any group. People that smart do exist - I have to admit I wasn't one of them! I compiled the catalogue and even I didn't "get it"! But people who are capable of such...such quantum jujitsu, are people we need. For them the Gateways aren't guarded, but protected. As for the others who might somehow locate the translational nexi...well, you know who I mean...
JM: No, who?
EC: The Tri-Lateral Commission! Read the catalogue! Figure it out! Who knows? Maybe you'll need to know, one of these days.
JM: Is the secret goverment still active in this area, and if so what do they hope to achieve?
 Haven't you heard of the present leader's fascination with "virtual reality"? Where do you suppose power comes from, an" Invisible College" of "Illuminati"? (I use the terms metaphorically , of course.) Nothing has changed - only gotten hotter. In Baghdad...no, forget I said that. Scratch that. Dump the whole file. Next?
JM: Hmmmm, ok. Have you been to Earth2 or any of the other "worlds" and is this where you've been hiding?
EC: Well, no harm in telling you I suppose. Yes, in fact I've been spending quite a lot of time in Java2. It's not even a security thing anymore, really. Or not always. The truth is that, well, you can't possibly imagine - a whole world for a utopia, complete with flora, fauna, picturesque ruins, and maybe, oh, ten people per square continent. Fresh air! That alone is enough to...a universe next door, let's go! (was it e.e.cummings who said that?)
JM: And if that one gets too crowded?
EC: Precisely. A number of Davy Crockett types have already "moved on" where they can't see the smoke of their neighbors fires, to put it mildly. We have no idea of the extent of the Series - it may be "infinite" for all practical (or impractical) purposes.
JM: Why not just tell everbody, then?
EC: Would you want to be responsible for infecting the halls of infinity with, say the L.A. Police? Do you think the Penatgon deserves infinity? (and what if it isn't infinite?) Etcetera?
JM: Who were the occupants of Java2 , that left behind the ruins?
EC: Well, that's the biggest news of all really. We found them - or rather they've found us. They claim to be an alternative evolutionary branch of Homo Sapiens through h.Javanesis and h.Neanderthalensis. They look like they're descended from lemurs rather tha chimps, like us. A bit like the characters from Javanese shadow puppet plays. They discovered how to travel long ago, in a time we might think of as the time of Atlantis or Mu (only we would be wrong...) It's all rather Lovecraftian, inas much as they claim to be responsible for certain aspects of human culture, aspects which are uncanny, but not maleficent. Not only in Java. The Tuartha de Danaan of Ireland who vanished "underground ", and other "faery" and "hollow earth" clues...the whole idea of another physical world, not a heaven or hell, but a Magickal universe next door...anyway, we were wrong about them. Travelling in time, either fast forward or backward. They simply set out to explore the Series. They think it may be endless, and some decided to return "home" to Java2. They're a completely non-hierarchic segmentary society, like primitive hunter/gatherers, but with a highly evolved culture. A lot of Terrans have completely "converted" to their way of life, even their language. You should hear their music! The returnees brought back some of their artifacts and...well, "furniture" I guess you'd call it. Their ancestors built a city during a "High Civilization" period in their history, but they rejected hard technology for cognitive sciences long ago. Our travel techniques are crude by comparison and lacking their whole mythopoetic value sytem. We're planning soon to release certain archival material here in Earth Prime, certain bits of art and music, which we expect to act in a viral fashion to produce profound paradigm shifts. The traveller's culture is now, I beleive, our most effective "weapon".
JM: So what's your bottom line, is this all co-creative or what?
EC: A smartass question.
JM: No, really.
EC: Who can say? What about our own cosmic locale, our own provincial reality? You can't make it go away by ceasing to believe in it. "Give me a place to stand and I'll move the world" - but there is no place, no "outside" vantage point, from which to challenge consensus reality. "Magick" is notoriously difficult and vague, and terribly incremental - the utopian imagination seems futile - reforms of consciousness appear to fail, unless they implement the emergence of new ruling classes or elites. "Religion" is a perfect case in point. But was religion the cause of "civilization" - or the effect? Now, however, you see, it's a whole new game. There is an "outside" now, maybe an infinite number of outsides, places to stand with a lever in one hand - and a magic mushroom in the other. The disposessed have always believed in a millenium, a magickal resistance, a heaven on earth, a world turned upside down. This is it. Well, time's up.
JM: I had a million more questions. In fact...
EC: This phone number and address will become inoperative.  And don't worry. The Reality check is in the mail. [click]
(JM's note: the phone was indeed disconnected the next day, and the premises it was registered to vacated with no forwarding address left)
INCUNABULA
A Catalogue of Rare Books, Manuscripts & Curiosa
Ong's Hat: Gateway to the Dimensions!
Advances in Skin Science: Quantum Tantra
» Joseph Matheny's Journal: Emory Cranston Interview
Incunabula Research Center
hyperspace.tantricsphilosophos
E=±mc²=Thé Ðëòxÿríßøñµçlëìç HÿÞêrdïmèñsîøñ


|
| Last modified on Sat Jul 22 11:14:10 2023 UTC. | Improve this page |
Semaphores are one of the oldest mechanisms introduced by multitasking systems, being used both for managing common resources and synchronisation.
Managing common resources, in its simple form, prevents several threads to concurrently use a shared resource by blocking access of all other threads until the thread that acquired the resource releases it.
Synchronisation is generally required to efficiently implement blocking I/O; when a thread requires some data that is not yet available (for example by performing a read()
), it is not efficient to poll until the data becomes available, but it is much better to suspend the thread and arrange for the data producer (usually an ISR) to resume the thread when the data is available.
In µOS++ there are two basic synchronisations mechanisms: semaphores and event flags.
A semaphore is a synchronisation mechanism offered by most multitasking systems. In its simplest form, a semaphore is similar to the real-world traffic light, which blocks access to a segment of road in certain conditions.
The semaphore concept was introduced in 1965 by the Dutch computer scientist Edsger Dijkstra and historically it is said to be inspired by the railway semaphore (the binary semaphore, which controls access to a single resource by bracing the critical section with the P(S)
and V(S)
primitives).
The concept was later extended by another Dutchman, Carel S. Scholten, to control access to an arbitrary number of resources. In his proposal the semaphore can have an initial value (or count) greater than one (thus the counting semaphore).
Semaphores were originally used to control access to shared resources. However, depending on the application, better mechanisms exist now to manage shared resources, like locks, mutexes, etc. Semaphores are best used to synchronize a thread with an ISR or with another thread (unilateral rendezvous).
There are two types of semaphores: binary and counting.
Note: In µOS++, even if binary and counting semaphores are defined by different classes, the objects created are actually the same, but constructed with different parameters; binary semaphores are in fact counting semaphores with the maximum value set to 1.
Since we mentioned the analogy with the railway system, let’s imagine we have a small train station, with a single platform. The first arriving train enters the station without any restrictions, and stops at the platform. To prevent a second train from entering the station and bumping onto the first, a semaphore is installed at a certain distance before the station. The railway semaphore has a red hand which can be either lowered or raised. Modern semaphores are electric, and also have lights (red and green). After the first train enters the station, the hand is lowered and the light turns red. If a second train arrives, it reads this as “stop” and waits. When the first train leaves the station, the semaphore arm swings up, the light turns green, and the second train can enter the station.
Like a railway semaphore which has two states, a binary semaphore has only two values, 0 or 1. If the value is 0, the resource associated with the semaphore is not available, and whoever needs it, must wait, like the train that stops at a red semaphore. When the resource becomes available, the semaphore is “posted”, allowing the next thread waiting for the semaphore to resume.
Depending on the semaphore usage, it can start either with 0 (when used for synchronisation) or 1 (when used to protect a single shared resource).
What a binary semaphore has in addition to a railway semaphore, is a signalling method (think of this mechanism as a loud horn used to wakeup the sleeping train driver, waiting for the semaphore).
To continue the analogy with the railway system, what if we have a larger train station, with multiple platforms, where many trains can be present at the same time? Well, the solution is similar, but the semaphore logic should keep track of the number of trains in the station, and turn red when all tracks are busy. When one train leaves the station, the semaphore can be turned green, and, if there is a train waiting, it’ll be allowed to enter the station.
A counting semaphore has a counter with a limit, representing the maximum number of available resources.
Depending on the semaphore usage, it usually starts either at 0 (when used for synchronisation) or at the limit (when used to protect a multiple shared resources).
Assuming it starts at zero, with no resources available, the semaphore is “posted” each time a new resource becomes available, which increments the counter. When the maximum is reached, further “posts” will fail and the counter will remain unchanged.
On the other side, when resources need to be consumed, as long as the counter is positive, the requesting thread will be allowed access to the resource, and, at each request, the counter will be decremented.
When the counter reaches 0, no more resources are available, and the requesting thread is suspended, until the semaphore will be posted.
A counting semaphore is used when elements of a resource can be used by more than one thread at the same time. For example, a counting semaphore can be used in the management of a buffer pool.
Semaphore services
For convenience reasons, µOS++ has several functions for creating semaphores. Semaphores can be created as local objects on the function stack, or as global objects, semaphores can be binary, or counting, semaphores can be created with default characteristics or with custom attributes, and so on.
When used to synchronise threads with ISRs, the easiest way to access semaphores is when they are created as global objects.
The initial value for the semaphore is typically zero (0), indicating that the event has not yet occurred, or there are no resources. It is possible to initialize the semaphore with a value other than zero, indicating that the semaphore initially contains that number of resources.
In C++, the global semaphores are created and initialised by the global static constructors mechanism.
/// @file app-main.cpp
#include <cmsis-plus/rtos/os.h>
using namespace os;
using namespace os::rtos;
// Create a global binary semaphore object instance,
// with the initial count as 0.
semaphore_binary sb1 { "sb1", 0 };
// Create a global binary semaphore object instance,
// Create a global binary semaphore,
// with the initial count as 1.
semaphore_binary sb2 { "sb2", 1 };
// Create a global binary semaphore object instance,
// with max 7 items and the initial count as 0.
semaphore_counting sc1 { "sc1", 7, 0 };
// Create a global binary semaphore object instance,
// with max 7 items and the initial count as 7.
semaphore_counting sc2 { "sc2", 7, 7 };
int
os_main (int argc, char* argv[])
{
// ...
// Not much to do, the semaphores were created by the static
// constructors, before entering main().
// ...
return 0;
}
// All global semaphores are automatically destroyed if os_main() returns.
A similar example, but written in C:
/// @file app-main.c
#include <cmsis-plus/rtos/os-c-api.h>
// Global static storage for the semaphore objects instances.
os_semaphore_t sb1;
os_semaphore_t sb2;
os_semaphore_t sc1;
os_semaphore_t sc2;
int
os_main (int argc, char* argv[])
{
// ...
// Create a global binary semaphore object instance,
// with the initial count as 0.
os_semaphore_binary_construct(&sb1, "sb1", 0);
// Create a global binary semaphore object instance,
// with the initial count as 1.
os_semaphore_binary_construct(&sb2, "sb2", 1);
// Create a global binary semaphore object instance,
// with max 7 items and the initial count as 0.
os_semaphore_counting_construct(&sc1, "sc1", 7, 0);
// Create a global binary semaphore object instance,
// with max 7 items and the initial count as 7.
os_semaphore_counting_construct(&sc2, "sc2", 7, 7);
// ...
// For completeness, destroy the semaphores.
os_semaphore_destruct(&sb1);
os_semaphore_destruct(&sb2);
os_semaphore_destruct(&sc1);
os_semaphore_destruct(&sc2);
return 0;
}
In C++, if it is necessary to control the moment when global objects instances are created, it is possible to separately allocate the storage as global variables, then use the placement new
operator to initialise them.
/// @file app-main.cpp
#include <cmsis-plus/rtos/os.h>
using namespace os;
using namespace os::rtos;
// Global static storage for the semaphore object instance.
// This storage is set to 0 as any uninitialised variable.
std::aligned_storage<sizeof(semaphore_binary), alignof(semaphore_binary)>::type sb1;
int
os_main (int argc, char* argv[])
{
// ...
// Use placement new, to explicitly call the constructor
// and initialise the semaphore.
// Create a global binary semaphore object instance,
// with the initial count as 1.
new (&sb1) semaphore_binary { "sb1", 1 };
// Local static storage for the semaphore object instance.
static std::aligned_storage<sizeof(semaphore_counting), alignof(semaphore_counting)>::type sc1;
// Use placement new, to explicitly call the constructor
// and initialise the semaphore.
// Create a static counting semaphore object instance,
// max 7 items and the initial count as 0.
new (&sc1) semaphore_counting { "sc1", 7, 0 };
// ...
// For completeness, call the semaphores destructors, which for placement new
// is no longer called automatically.
sb1.~semaphore_binary();
sc1.~semaphore_counting();
return 0;
}
Semaphore objects instances can also be created on the local stack, for example on the main thread stack. Just be sure the stack is large enough to store all defined local objects.
/// @file app-main.cpp
#include <cmsis-plus/rtos/os.h>
using namespace os;
using namespace os::rtos;
int
os_main (int argc, char* argv[])
{
// ...
// Create a local binary semaphore object instance,
// with the initial count as 0.
semaphore_binary sb1 { "sb1", 0 };
// Create a local binary semaphore object instance,
// with the initial count as 1.
semaphore_binary sb2 { "sb2", 1 };
// Create a local binary semaphore object instance,
// with max 7 items and the initial count as 0.
semaphore_counting sc1 { "sc1", 7, 0 };
// Create a local binary semaphore object instance,
// with max 7 items and the initial count as 7.
semaphore_counting sc2 { "sc2", 7, 7 };
// Beware of local static instances, since they'll use atexit()
// to register the destructor; avoid and prefer placement new, as before.
// static semaphore_binary sb3 { "sb3" };
// ...
// The local semaphores are destroyed automatically before exiting this block.
return 0;
}
A similar example, but written in C:
/// @file app-main.c
#include <cmsis-plus/rtos/os-c-api.h>
int
os_main (int argc, char* argv[])
{
// ...
// Local storage for the semaphore object instance.
os_semaphore_t sb1;
// Create a binary semaphore,
// with the initial count as 0.
os_semaphore_binary_construct(&sb1, "sb1", 0);
// Local storage for the semaphore object instance.
os_semaphore_t sb2;
// Create a binary semaphore,
// with the initial count as 1.
os_semaphore_binary_construct(&sb2, "sb2", 1);
// Local storage for the semaphore object instance.
os_semaphore_t sc1;
// Create a counting semaphore,
// with max 7 items and the initial count as 0.
os_semaphore_counting_construct(&sc1, "sc1", 7, 0);
// Local storage for the semaphore object instance.
os_semaphore_t sc2;
// Create a counting semaphore,
// with max 7 items and the initial count as 7.
os_semaphore_counting_construct(&sc2, "sc2", 7, 7);
// ...
// For completeness, destroy the semaphores.
os_semaphore_destruct(&sb1);
os_semaphore_destruct(&sb2);
os_semaphore_destruct(&sc1);
os_semaphore_destruct(&sc2);
return 0;
}
For a total control over the semaphore creation (for example to set a custom clock), the semaphore attribute mechanism can be used.
/// @file app-main.cpp
#include <cmsis-plus/rtos/os.h>
using namespace os;
using namespace os::rtos;
int
os_main (int argc, char* argv[])
{
// ...
semaphore::attribute_binary attr_b1 { 0 };
attr_b1.clock = &rtclock;
// Create a local binary semaphore object instance,
// the initial count as 0.
semaphore sb1 { "sb1", attr_b1 };
semaphore::attribute_counting attr_c2 { 7, 0 };
attr_c2.clock = &rtclock;
// Create a local binary semaphore object instance,
// with max 7 items and the initial count as 0.
semaphore sc1 { "sc1", attr_c2 };
// Attributes for a generic counting semaphore, with max 7 items
// and the initial count as 7.
semaphore::attribute attr_g1;
attr_g1.sm_max_value = 7;
attr_g1.sm_initial_value = 7;
attr_g1.clock = &rtclock;
// Create a generic counting semaphore, fully defined by attributes.
semaphore sg1 { "sg1", attr_g1 };
// ...
// The local semaphores and the attributes are destroyed automatically
// before exiting this block.
return 0;
}
A similar example, but written in C:
/// @file app-main.c
#include <cmsis-plus/rtos/os-c-api.h>
int
os_main (int argc, char* argv[])
{
// ...
os_semaphore_attr_t attr_b1;
os_semaphore_attr_binary_init(&attr_b1, 0);
attr_b1.clock = os_clock_get_rtclock();
// Local storage for the semaphore object instance.
os_semaphore_t sb1;
// Create a binary semaphore,
// with the initial count as 0.
os_semaphore_construct(&sb1, "sb1", &attr_b1);
os_semaphore_attr_t attr_c2;
os_semaphore_attr_counting_init(&attr_c2, 7, 0);
attr_c2.clock = os_clock_get_rtclock();
// Local storage for the semaphore object instance.
os_semaphore_t sc1;
// Create a counting semaphore,
// with max 7 items and the initial count as 0.
os_semaphore_construct(&sc1, "sc1", &attr_c2);
os_semaphore_attr_t attr_g1;
os_semaphore_attr_init(&attr_g1);
attr_g1.sm_max_value = 7;
attr_g1.sm_initial_value = 7;
attr_g1.clock = os_clock_get_rtclock();
// Local storage for the semaphore object instance.
os_semaphore_t sg1;
// Create a generic counting semaphore, with max 7 items
// and the initial count as 7.
os_semaphore_construct(&sg1, "sg1", &attr_g1);
// ...
// For completeness, destroy the semaphores.
os_semaphore_destruct(&sb1);
os_semaphore_destruct(&sc1);
os_semaphore_destruct(&sg1);
return 0;
}
The application programmer can create an unlimited number of semaphores (limited only by the available RAM).
When one resource associated with the semaphore becomes available, the semaphore is notified.
The name post comes from POSIX; other names used are P, signal, release.
result_t res;
res = sem.post();
if (res == result::ok)
{
// The semaphore was posted.
}
else if (res == EGAIN)
{
// The maximum count value was exceeded.
}
A similar example, but written in C:
os_result_t res;
res = os_semaphore_post(&sem);
if (res == os_ok)
{
// The semaphore was posted.
}
else if (res == EGAIN)
{
// The maximum count value was exceeded.
}
When the semaphore is correctly posted, the value is increased and the oldest high priority thread waiting (if any) is added to the READY list, allowing it to acquire the semaphore.
If any of the waiting threads has a higher priority than the currently running thread, µOS++ will run the highest-priority thread made ready by post()
. The current thread is suspended until it’ll become the highest-priority thread that is ready to run.
It is perfectly possible to post semaphores from ISRs, generally to synchronise waiting threads with events occurring on interrupts.
To synchronise access to a resource, a thread must invoke the semaphore wait()
function.
If the resource is available, in other words if the semaphore was posted and the count value is positive, the count is decremented and the call returns.
If the count value is zero, this means that no more resources are available, and the calling thread will be suspended. The thread will resume either when the semaphore is posted, a timeout occurs, or the thread is interrupted.
Along with the semaphore’s value, µOS++ also keeps track of the threads waiting for the semaphore’s availability (a double linked list, ordered by thread priorities).
result_t res;
res = sem.timed_wait(100); // The timeout is 100 clock ticks.
if (res == result::ok)
{
// The wait ended when the semaphore was posted.
}
else if (res == ETIMEDOUT)
{
// The wait ended due to timeout.
}
else if (res == EINTR)
{
// The wait ended due to an explicit interruption request.
}
A similar example, but written in C:
os_result_t res;
res = os_semaphore_timed_wait(&sem, 100); // The timeout is 100 clock ticks.
if (res == os_ok)
{
// The wait ended when the semaphore was posted.
}
else if (res == ETIMEDOUT)
{
// The wait ended due to timeout.
}
else if (res == EINTR)
{
// The wait ended due to an explicit interruption request.
}
The name wait comes from POSIX; other names used are V, acquire, pend.
When semaphores are used to manage common resources, it is possible for several threads to wait on the same semaphore, each with its own timeout.
Multiple threads waiting on a semaphore
When the semaphore is posted, µOS++ makes the highest-priority thread waiting on the semaphore ready to run. If at this moment any of the waiting threads has a higher priority than the currently running thread, µOS++ will run all higher-priority threads and only then return to the current thread.
The µOS++ semaphore API basically implements the POSIX semaphores, with several extensions.
The semaphore name is an optional string defined during the semaphore object instance creation. It is generally used to identify the semaphore during debugging sessions.
The C++ API is:
semaphore_binary sem { "sem", 0 };
const char* name = sem.name();
The C API is:
os_semaphore_t sem;
os_semaphore_construct(&sem, "sem", 0 };
const char* name = os_semaphore_get_name(&sem);
The semaphore value is the instantaneous counter value, if positive, or 0 if the semaphore exhausted its resources and there are threads waiting for it.
The C++ API is:
std::size_t value = sem.value();
The C API is:
size_t value = os_semaphore_get_value(&sem);
The semaphore maximum value is a constant value set at semaphore creation, representing the total number of resources associated with the semaphore. For binary semaphores, these functions return 1.
The C++ API is:
std::size_t value = sem.max_value();
The C API is:
size_t value = os_semaphore_get_max_value(&sem);
The semaphore initial value is a constant value set at semaphore creation, representing the number of initial resources associated with the semaphore. Applications using semaphores for synchronisation usually start with this value set to 0, while applications that use semaphores for resource management start with this value equal to the number of resources.
The C++ API is:
std::size_t value = sem.initial_value();
The C API is:
size_t value = os_semaphore_get_initial_value(&sem);
Real-world applications may include monitoring mechanisms to detect erroneous conditions. Recovering from such conditions may require to return the semaphore to stable state; µOS++ provides a function to return the semaphore to the initial state after construction.
The C++ API is:
sem.reset();
The C API is:
os_semaphore_reset(&sem);
In C++, if the semaphores were created using the normal way, the destructors are automatically invoked when the current block exits, or, for the global semaphores instances, after the main()
function returns. Semaphores created with placement new
need to be destructed manually.
In C, all semaphores must be destructed by explicit calls to os_semaphore_destruct()
.
There should be no threads waiting on the semaphore when it is destroyed, otherwise an assert check will trigger.
Originally semaphores were used to control access to shared resources, for example to I/O devices.
The classical example includes two or more threads writing messages to an I/O port. Without any control mechanism, the characters from one thread messages might get intermingled with characters from other thread messages.
The solution is to add a mechanism that allows one thread to gain exclusive access to the device and prevent other threads to write characters before the message is fully transferred. Such a critical section may use a binary semaphore, initialised to 1, and brace writing messages with wait()
and post()
calls.
/// @file app-main.cpp
#include <cmsis-plus/rtos/os.h>
using namespace os;
using namespace os::rtos;
// Create a binary semaphore, with the initial count as 1.
semaphore_binary sem { "sem", 1 };
void
write_message(const char* msg)
{
// Wait until no other thread is using the device and lock access to it.
sem.wait();
// Write the message, one character at a time, without fear
// that other threads will intervene.
while (*msg)
{
write_char(*msg);
++msg;
}
// Unlock access to the device.
sem.post();
}
A similar example, but written in C:
/// @file app-main.c
#include <cmsis-plus/rtos/os-c-api.h>
// Global static global storage for the semaphore object instance.
os_semaphore_t sem;
int
os_main (int argc, char* argv[])
{
// ...
// Create a binary semaphore, with the initial count as 1.
os_semaphore_binary_construct(&sem, "sem", 1);
// ...
os_semaphore_destruct(&sem);
return 0;
}
void
write_message(const char* msg)
{
// Wait until no other thread is using the device and lock access to it.
os_semaphore_wait(&sem);
// Write the message, one character at a time, without fear
// that other threads will intervene.
while (*msg)
{
write_char(*msg);
++msg;
}
// Unlock access to the device.
os_semaphore_post(&sem);
}
**
It is mandatory for the binary semaphore to be initialised with 1 (i.e. device available) for the first wait()
to not block.
It is common for a thread to wait for event generated by an ISR (or another thread). In this case, no data needs to be exchanged, only the fact that the ISR or the thread (on the left) has occurred is important. Using a semaphore for this type of synchronization is called a unilateral rendezvous.
Unilateral rendezvous
A unilateral rendezvous is used when a thread initiates an I/O operation and waits (i.e., calls wait()
) for the semaphore to be posted. Lower priority threads are executed. When the I/O operation is complete, an ISR (or another thread) signals the semaphore (i.e., calls post()
), and the thread is resumed.
Unilateral rendezvous timeline
An example code in C++ is:
/// @file app-main.cpp
#include <cmsis-plus/rtos/os.h>
using namespace os;
using namespace os::rtos;
// Create a binary semaphore, with the initial count as 0.
semaphore_binary sem { "sem", 0 };
int
os_main (int argc, char* argv[])
{
// ...
// Not much to do, the semaphore was created by the static
// constructors, before entering main().
return 0;
}
static volatile uint8_t device_byte;
uint8_t
read_byte(void)
{
// Wait until the semaphore is posted.
sem.wait();
return device_byte;
}
void
device_interrupt_service_routine(void)
{
// Store the device data in a static location.
device_byte = read_device_register();
// Inform the reader that new data is available.
sem.post();
}
A similar example, but written in C:
/// @file app-main.c
#include <cmsis-plus/rtos/os-c-api.h>
// Global static global storage for the semaphore object instance.
os_semaphore_t sem;
int
os_main (int argc, char* argv[])
{
// ...
// Create a binary semaphore, with the initial count as 0.
os_semaphore_binary_construct(&sem, "sem", 0);
// ...
os_semaphore_destruct(&sem);
return 0;
}
static volatile uint8_t device_byte;
uint8_t
read_byte(void)
{
// Wait until the semaphore is posted.
os_semaphore_wait(&sem);
return device_byte;
}
void
device_interrupt_service_routine(void)
{
// Store the device data in a static location.
device_byte = read_device_register();
// Inform the reader that new data is available.
os_semaphore_post(&sem);
}
This example is for demonstrative purposes only. A real-world example would probably need to use a circular buffer to store multiple bytes, to avoid loosing data when multiple interrupts occur before the read_byte()
is called.
Semaphores are great synchronisation objects, especially with events occurring on interrupts.
However semaphores are subject to several problems, which must be known and addressed during system design.
When using the semaphores for managing common resources, it is absolutely mandatory to begin the critical section with wait()
and to end it with post()
. Any possibility to leave the critical section in the middle of it (via return
, break
, continue
, goto
, etc) will result in a deadlock and should be avoided.
Recursive deadlock can occur if a thread tries to lock a semaphore it has already locked. This can typically occur in libraries or recursive functions.
A typical scenario is to have a functional program, like the one protecting the write_message()
function and try to “improve” it to protect a series of messages:
/// @file app-main.cpp
#include <cmsis-plus/rtos/os.h>
using namespace os;
using namespace os::rtos;
// Create a binary semaphore, with the initial count as 1.
semaphore_binary sem { "sem", 1 };
void
write_message(const char* msg)
{
// Wait until no other thread is using the device and lock access to it.
sem.wait();
// Write the message, one character at a time, without fear
// that other threads will intervene.
while (*msg)
{
write_char(*msg);
++msg;
}
// Unlock access to the device.
sem.post();
}
// ...
void
write_many_messages(void)
{
sem.wait();
write_message("one");
write_message("two");
write_message("three");
sem.post();
}
A similar example, but written in C:
/// @file app-main.c
#include <cmsis-plus/rtos/os-c-api.h>
// Global static global storage for the semaphore object instance.
os_semaphore_t sem;
int
os_main (int argc, char* argv[])
{
// ...
// Create a binary semaphore, with the initial count as 1.
os_semaphore_binary_construct(&sem, "sem", 1);
// ...
os_semaphore_destruct(&sem);
return 0;
}
void
write_message(const char* msg)
{
// Wait until no other thread is using the device and lock access to it.
os_semaphore_wait(&sem);
// Write the message, one character at a time, without fear
// that other threads will intervene.
while (*msg)
{
write_char(*msg);
++msg;
}
// Unlock access to the device.
os_semaphore_post(&sem);
}
void
write_many_messages(void)
{
os_semaphore_wait(&sem);
write_message("one");
write_message("two");
write_message("three");
os_semaphore_post(&sem);
}
Well… bad idea! Since the semaphore was created as binary, the first wait()
in write_many_messages()
will lock it, and the inner wait()
in write_message()
will find it locked and block forever.
For such scenarios, recursive mutexes are definitely more appropriate.
What if a thread that locked a semaphore is terminated? Since the semaphore does not keep track of its owner, most implementations are not able to detect this and all thread waiting (or may wait in the future) will never acquire the semaphore and deadlock. To partially address this, it is recommended to use the timed_wait()
, which specifies a timeout.
Semaphores are subject to a serious problem in real-time systems called priority inversion, where a high priority thread becomes delayed for an indefinite period by a low priority thread, preventing it to meet its deadlines. A very high profile case was the NASA JPL’s Mars Pathfinder spacecraft (see What really happened on Mars?)
One of the best solutions to prevent priority inversion is to use mutexes with priority inheritance.
If using semaphores for mutual exclusion is problematic, using them for synchronisation is fine, and the the typical scenario is unilateral rendezvous. However, for this to work, the semaphore must be created with an initial count value of 0 (zero).


First part of the course introduces students to the profession, including the disciplines of chemical, civil, computer, electrical, environmental, and mechanical engineering. Prepares students for success through the integration of the following important skills: technical problem solving and engineering design, ethical decision-making, teamwork, and communicating to diverse audiences. Second part is aimed at students with little or no programming experience. It aims to provide students with an understanding of the role computation can play in solving problems. It also aims to help students, regardless of their major, to feel justifiably confident of their ability to write small programs that allow them to accomplish useful goals. The class will use the Python programming language.
In mathematics and computer science, an algorithm is a step-by-step procedure for calculations. Algorithms are used for calculation, data processing, and automated reasoning. More precisely, an algorithm is an effective method expressed as a finite list[1] of well-defined instructions[2] for calculating a function.[3] Starting from an initial state and initial input (perhaps empty),[4] the instructions describe a computation that, when executed, will proceed through a finite [5] number of well-defined successive states, eventually producing "output"[6] and terminating at a final ending state. The transition from one state to the next is not necessarily deterministic; some algorithms, known as randomized algorithms, incorporate random input.
Numerical analysis is the study of algorithms that use numerical approximation (as opposed to general symbolic manipulations) for the problems of mathematical analysis (as distinguished from discrete mathematics). One of the earliest mathematical writings is a Babylonian tablet from the Yale Babylonian Collection(YBC 7289), which gives a sexagesimal numerical approximation of , the length of the diagonal in a unit square. Being able to compute the sides of a triangle (and hence, being able to compute square roots) is extremely important, for instance, in carpentry and construction.


{% extends 'layout.html' %} {% block pageTitle %} Upload evidence {% endblock %} {% block content %}
We have confirmed your child's eligibility. Your document(s) have been approved and your application is in progress.


Sign In
Sign in today for better experience.
Sign In
Sign in today for better experience.
Other Form Elements
Readonly Plain Text
Select Boxes
Input Validation
Nice!
You have to give your password
Size of Input Controls
Input Groups
@
.00
$
.00
Input & Button Groups


Exception hierarchy for Spring's remoting infrastructure, independent of any specific remote method invocation system.


Qpid Dispatch 1.0.0 Release Notes
Dispatch is a lightweight AMQP message router library. More about
Qpid
Dispatch.
For more information about this release, including download links and
documentation, see the release overview.
New features and improvements
- DISPATCH-209 - Three+ router test is needed in the system test suite.
- DISPATCH-390 - New pn_proactor-based IO driver
- DISPATCH-525 - What are proper names and units for protocol configuration settings?
- DISPATCH-551 - disconnect connections that do not complete initial protocol handshake within a given time
- DISPATCH-584 - Large, highly redundant router networks generate excessive inter-router message traffic
- DISPATCH-731 - Support wildcard tenant vhosts in address prefix configuration
- DISPATCH-744 - Reject unsettled deliveries to multicast addresses by default
- DISPATCH-767 - Message Cut-Through/Streaming for efficient handling of large messages
- DISPATCH-770 - Show error if creating an entity using web console fails
- DISPATCH-771 - Mark mandatory fields when creating a new entity in the web console
- DISPATCH-775 - allow authentication against a remote server
- DISPATCH-788 - Create peer linkage for presettled deliveries so we can use this to handle muticast dispositions
- DISPATCH-795 - Sort entity names on Schema page to make them easier to find
- DISPATCH-796 - The Python and the C management agents do not have an AMQP header in their responses.
- DISPATCH-803 - refuse attach to undefined addresses
- DISPATCH-809 - Add options to enable Sanitizers to CMake build
- DISPATCH-813 - Support wildcard format for link-routes
- DISPATCH-818 - Honor failoverList provided by connected brokers
- DISPATCH-827 - Large message discard buffer too small
- DISPATCH-828 - Discarded message processing does not close callback window
- DISPATCH-839 - Improve the batching of allocated objects
- DISPATCH-844 - Make TLS cipher suites configurable
- DISPATCH-858 - Simplify hard to follow LICENSE file
Bugs fixed
- DISPATCH-421 - Toasts messages are not logged in the rolldown "logging console"
- DISPATCH-430 - Cursor snaps way above peaks in a rate chart
- DISPATCH-571 - Driver spins when a listener accepts a socket while FDs are all in use
- DISPATCH-737 - qdstat and qdmanage always force sasl exchange
- DISPATCH-741 - Coverity scan reported errors in Qpid Dispatch master
- DISPATCH-743 - Intermittent SSL Failure
- DISPATCH-747 - Console does not handle connection errors well
- DISPATCH-748 - Error message shown when rapidly clicking treeview on left side of hawtio console: Uncaught TypeError: Cannot read property 'height' of null
- DISPATCH-749 - unmapping all link-routing addresses leaves half of addresses mapped
- DISPATCH-750 - Missing icons and bad rendering of dynatree treeviews in Microsoft Edge 14
- DISPATCH-752 - With more than one outbound SSL connections, failure in one affects all others
- DISPATCH-753 - Neither version of console is usable on Internet Explorer 10 or 11
- DISPATCH-754 - Output of qdstat shows authentication on client SSL connections as anonymous (x.509)
- DISPATCH-756 - Fix Fedora and Ubuntu docker files to use libuv and libwebsockets
- DISPATCH-757 - Qpid Dispatch does not compile under Ubuntu
- DISPATCH-758 - test_listen_error() in system_tests_one_router.py and system_tests_http.py hang inside a docker environment
- DISPATCH-759 - Core thread consumed deleting deliveries
- DISPATCH-761 - Router crash on abrupt close of sender/receiver connections
- DISPATCH-762 - Hawtio console does not show details about a connection whereas stand-alone console does
- DISPATCH-763 - Router crashes when config file defines listener { addr: } instead of { host: }
- DISPATCH-765 - Three unit tests failing under travis on trusty
- DISPATCH-766 - Update Dockerfile-ubuntu to include libwebsockets
- DISPATCH-768 - On topology page, show connections that go to more than one router
- DISPATCH-769 - Links popup on topology page only shows a single link
- DISPATCH-772 - Buttons to Create and Delete entity disappear after navigation in either version of console
- DISPATCH-777 - [system_tests_drain] pn_object_free: corrupted double-linked list
- DISPATCH-779 - Credit is not issued for multicast address when no receiver is connected
- DISPATCH-780 - When link is disallowed due to target/source name it should not return amqp:resource-limit-exceeded
- DISPATCH-784 - Delivery annotations are not propagated by the router
- DISPATCH-787 - c epoll proactor can raise SIGPIPE
- DISPATCH-789 - Console breaks when quickly moving between tabs (both hawtio and stand-alone)
- DISPATCH-790 - The right-mouse-click menu on Topology tab appears off-center in the stand-alone console
- DISPATCH-791 - The node representing Console in Topology tab is not displayed
- DISPATCH-792 - Freezing and moving nodes is somewhat broken (in either version of console)
- DISPATCH-794 - Arrows in topology graph for IE 11 are hollow
- DISPATCH-798 - Policy description in Dispatch Router book seems to be incorrect
- DISPATCH-799 - Using USE_VALGRIND does not invoke valgrind when running tests
- DISPATCH-800 - Hawtio version of the console is unable to connect to a router when running offline
- DISPATCH-802 - refuse transaction coordination links if they can't be routed to a coordinator
- DISPATCH-804 - connectors ignore addr
- DISPATCH-805 - System test system_tests_sasl_plain fails in systems with TLSv1.2
- DISPATCH-806 - Go thru every deprecated entity and make sure a warning is put out when a deprecated entity is used.
- DISPATCH-807 - Message handling requires flow control to limit memory consumption
- DISPATCH-808 - Setting defaultDistribution: unavailable blocks qdmanage
- DISPATCH-810 - auto link fails to trigger
- DISPATCH-811 - Attributes tab label spelled 'Attriutes'
- DISPATCH-814 - Killing qdrouterd process takes a long time
- DISPATCH-815 - shebang python (#!/usr/bin/env python) gets evaluated on make install
- DISPATCH-816 - Router crashes if connection closed while router is processing attach on that connection
- DISPATCH-820 - double delete of address hash
- DISPATCH-821 - recreating an address immediately after deleting it, results in error
- DISPATCH-822 - loss of SSL connection breaks other SSL connections
- DISPATCH-823 - Improve logging for lost connections
- DISPATCH-824 - Remove deprecated entities and attributes from the router schema.
- DISPATCH-826 - Specifying an invalid host on the connector crashes the router
- DISPATCH-829 - The router does not set the "aborted" indication on truncated, streamed deliveries
- DISPATCH-835 - The DETACH/CLOSE sequence causes a memory leak
- DISPATCH-837 - Coverity scan reported errors in Qpid Dispatch master
- DISPATCH-841 - Decrease default limit of rows returned by qdstat from 1000 to 100
- DISPATCH-842 - Include missing license information in the LICENSE file
- DISPATCH-846 - Memory leaks in ctest with valgrind
- DISPATCH-847 - Fix issues discovered by Coverity
- DISPATCH-855 - Router crash when disconnecting from console
- DISPATCH-857 - Router crash when ctrl-c on router that has a libwebsockets listener connected to a console
- DISPATCH-860 - Link Route tests failing intermittently.
- DISPATCH-865 - Segmentation fault while running 2-node Artemis tests
- DISPATCH-867 - Messages stuck going through link route
- DISPATCH-870 - connection improperly reopened from closed connector
- DISPATCH-871 - Performance issues with large messages
- DISPATCH-873 - new routes calculated wrongly after connector deletion
- DISPATCH-924 - [CVE-2017-15699] Denial of Service Vulnerability when specially crafted frame is sent to the Router
Tasks
- DISPATCH-812 - Remove the console stress test directories
- DISPATCH-832 - Ensure the hawtio and stand-alone consoles work with deprecated entities removed
Apache Qpid, Messaging built on AMQP; Copyright © 2015
The Apache Software Foundation; Licensed under
the Apache
License, Version 2.0; Apache Qpid, Qpid, Qpid Proton,
Proton, Apache, the Apache feather logo, and the Apache Qpid
project logo are trademarks of The Apache Software
Foundation; All other marks mentioned may be trademarks or
registered trademarks of their respective owners


com.thoughtworks.xstream.io.xml
Classes
CompactWriter
Dom4JDriver
Dom4JReader
Dom4JWriter
DomDriver
DomReader
PrettyPrintWriter
XppDomDriver
XppDomReader
XppDomWriter
XppDriver
XppReader


We have a few guides to get you started. Choose the one that's right for you:
Want Chicago Boss to support your favorite database? Then write an adapter! This page explains how.
Database adapters should conform to the boss_db_adapter
behaviour and need to implement the following nine functions:
Performs any initialization and return a Connection value (if needed).
Performs any tear-downs.
Returns a BossRecord matching the Id
. The Id
must be unique across data types.
Queries for BossRecords. The Conditions
are guaranteed to be in {Key, Operator, Value} format. See the BossDB API for a list of query operators you need to support.
Counts the number of BossRecords of type Type
matching Conditions
.
Retrieves the value of a counter, or 0 if the counter does not exist.
Increments the value of a counter by Increment
, and returns the new value.
Delete the BossRecord with the given Id
.
Saves (that is, creates or updates) the given BossRecord in the database. If the ID is set to 'id'
, the function must generate an ID that is unique across data types. This function should not perform validation or run save hooks.
When you're finished, just:
- Put the adapter into SRC/boss/db_adapters
- Specify the adapter name as the
db_adapter
in boss.config - Add any test configuration to SRC/boss/db_adapters/test_config
- Add a
test_<adapter name>
target to the bottom of Makefile - Test the adapter by running
make test_<adapter name>
- Send a note to the Chicago Boss mailing list


Lavender Hotel is located at such a serene geographical place in Lagos, the western part of Nigeria. All 24 hours room are different as far as space, decor and view are concerned. However, they are all well funished with state of the art to beat the taste of our visitors.
In addition to the comfortability of our rooms, we have top-notch hotel amenities such as well treated swimming polls, state of the art gym/fitness center, all kinds of sport halls, a free shuttle service and lot more. Whether you have a hotel, resort, lodge, or a vacation rental, we strive to be your partner in creating memorable guest experiences.
Lavender has everything you could possibly wish for in a tropical beach resort, and much more. There’s something to suit everyone, whether you’re visiting for business or pleasure, relaxation or stimulation. Meet the dolphins in our private lagoon, relax by the white sand beach, learn to surf or scuba, and take an exercise class overlooking the ocean.
 That’s why our kitchen offers excellent cuisine every single day of the week, while weekend diners are in for a real treat as our restaurant hosts special banquets, traditional Alpine entertainment evenings and even a themed Greek night!
Discover true paradise at Lavender Hotel. To create more memorable experiences, you can now enjoy up to 10% discount in daily hotel credit when you book directly on Lavenderhotels.com.
Book NowTravel is a celebration of life The Lavender Breakfast Inclusive package now allows you to celebrate one more night of your stay free with our complement, if you have lodged for up to 3 days.
Book NowGet connected to the Lavender experience by exploring the hashtag #AtLavenderHotels
To me Lavender is home. From there indoor sport halls to the pool, to the meals, nothing can be compared to such experience. Can’t wait for my next visit.
On my visit visit to Nigeria, it was difficult making a decision on where to lodge. I chose Lavender Hotels and I never regreted it. They have all kinds of assorted meals: African, Chinese, even German dishes. I do wish I could visit once more
I spent my honey-moon at Lavender Hotels. Their hospitality and customer friendliness was topnotch. I also enjoyed the feel of nature the environment conveys. It was an experience i wont forget in a very long time
Take an Online tour of the prestigious Lavender Hotel and its environs


org.jclouds.blobstore.attr
Classes
BlobCapabilities
BlobCapability
BlobScope
BlobScopes
Charge
Charges
ConsistencyModel
ContainerCapabilities
ContainerCapability
ContainerVisibilities
ContainerVisibility
FolderCapability


The Gallery of Horns
Page 1
Page 2
Sort By
Sort by Horns
Sort by Title
Filter by Keyword
Narwhal
Rhino
Unicorn
Unilego
Triceratops
Markhor
Mouflon
Addax
Chameleon
Lizard
Jackalope
Horn
Music
Giraffe
Saiga


The data report displays the findings of one analyses.
Counted steps, acceleration, heart rate and sleep can be seen.
In the option, shown information can be selected or deselected and the accuracy
and time period can be changed.
In every chart you can zoom in by selecting a time period with the mouse.
With right click you can zoom out again.
Furthermore, you can store the chart as PDF or image on the PC.
Main chart
The main chart shows the selected information, either all in one diagram or
parallel to each other.
Calendar
The calendar shows the walked steps over the year to view active and inactive days.
A click on the day zooms the main chart to this particular day.
Sleep chart
The sleep chart is a boxplot which indicates the distribution of the sleeping hours.
It shows the average start and end of the user's sleep.


Your Professional Catering Technician
At Dedeoglu Technic we understand that any downtime can have a large impact on your business, as catering engineering specialists in the commercial field, we offer a variety of services and solutions that ensure any disruption is kept to a minimum.
ENQUIRY
To make an enquiry either use the form below or call:
07429150000


|
|
A previous series of articles covered the basic tools of computational geometry. In this article I'll explore some more advanced algorithms that can be built from these basic tools. They are all based on the simple but powerful idea of a sweep line: a vertical line that is conceptually “swept” across the plane. In practice, of course, we cannot simulate all points in time and so we consider only some discrete points. In several places I'll refer to the Euclidean and Manhattan distances. The Euclidean distance is the normal, everyday distance given by Pythagoras' Theorem. The Manhattan distance between points (x1, y1) and (x2, y2) is the distance that must be travelled while moving only horizontally or vertically, namely |x1 − x2| + |y1 − y2|. It is called the Manhattan distance because the roads in Manhattan are laid out in a grid and so the Manhattan distance is the distance that must be travelled by road (it is also called the "taxicab distance," or more formally the L1 metric). In addition, a balanced
binary tree is used in some of the
algorithms. Generally you can just use a Closest pair Suppose that we have processed points 1 to N − 1 (ordered by X) and the shortest distance we have found so far is h. We now process point N and try to find a point closer to it than h. We maintain a set of all already-processed points whose X coordinates are within h of point N, as shown in the light grey rectangle. As each point is processed, it is added to the set, and when we move on to the next point or when h is decreased, points are removed from the set. The set is ordered by y coordinate. A balanced binary tree is suitable for this, and accounts for the log N factor. To search for points closer than h to point N, we need only consider points in the active set, and furthermore we need only consider points whose y coordinates are in the range yN − h to yN + h (those in the dark grey rectangle). This range can be extracted from the sorted set in O(log N) time, but more importantly the number of elements is O(1) (the exact maximum will depend on the metric used), because the separation between any two points in the set is at least h. It follows that the search for each point requires O(log N) time, giving a total of O(N log N). Line segment intersections To handle either of the horizontal line events, we simply need to add or remove an element from the set. Again, we can use a balanced binary tree to guarantee O(log N) time for these operations. When we hit a vertical line, a range search immediately gives all the horizontal lines that it cuts. If horizontal or vertical segments can overlap there is some extra work required, and we must also consider whether lines with coincident endpoints are considered to intersect, but none of this affects the computational complexity. If the intersections themselves are required, this takes O(N log N + I) time for I intersections. By augmenting the binary tree structure (specifically, by storing the size of each sub-tree in the root of that sub-tree), it is possible to count the intersections in O(N log N) time. In the more general case, lines need not be horizontal or vertical, so lines in the active set can exchange places when they intersect. Instead of having all the events pre-sorted, we have to use a priority queue and dynamically add and remove intersection events. At any point in time, the priority queue contains events for the end-points of line-segments, but also for the intersection points of adjacent elements of the active set (providing they are in the future). Since there are O(N + I) events that will be reached, and each requires O(log N) time to update the active set and the priority queue, this algorithm takes O(N log N + I log N) time. The figure below shows the future events in the priority queue (blue dots); note that not all future intersections are in the queue, either because one of the lines isn't yet active, or because the two lines are not yet adjacent in the active list. Area of the union of rectangles We now know which rectangles are cut by the sweep line (red in the diagram), but we actually want to know the length of sweep line that is cut (the total length of the solid blue segments). Multiplying this length by the horizontal distance between events gives the area swept out between those two events. We can determine the cut length by running the same algorithm in an inner loop, but rotated 90 degrees. Ignore the inactive rectangles, and consider a horizontal sweep line that moves top-down. The events are now the horizontal edges of the active rectangles, and every time we cross one, we can simply increment or decrement a counter that says how many rectangles overlap at the current point. The cut length increases as long as the counter is non-zero. Of course, we do not increase it continuously, but rather while moving from one event to the next. With the right data structures, this can be implemented in O(N2) time (hint: use a boolean array to store the active set rather than a balanced binary tree, and pre-sort the entire set of horizontal edges). In fact the inner line sweep can be replaced by some clever binary tree manipulation to reduce the overall time to O(N log N), but that is more a problem in data structures than in geometry, and is left as an exercise for the reader. The algorithm can also be adapted to answer similar questions, such as the total perimeter length of the union or the maximum number of rectangles that overlap at any point. Convex hull Andrew's algorithm splits the convex hull into two parts, the upper and lower hull. Usually these meet at the ends, but if more than one points has minimal (or maximal) X coordinate, then they are joined by a vertical line segment. We'll describe just how to construct the upper hull; the lower hull can be constructed in similar fashion, and in fact can be built in the same loop. To build the upper hull, we start with the point with minimal X coordinate, breaking ties by taking the largest Y coordinate. After this, points are added in order of X coordinate (always taking the largest Y value when multiple points have the same X value). Of course, sometimes this will cause the hull to become concave instead of convex: The black path shows the current hull. After adding point 7, we check whether the last triangle (5, 6, 7) is convex. In this case it isn't, so we delete the second-last point, namely 6. The process is repeated until a convex triangle is found. In this case we also examine (4, 5, 7) and delete 5 before examining (1, 4, 7) and finding that it is convex, before proceeding to the next point. This is essentially the same procedure that is used in the Graham scan, but proceeding in order of X coordinate rather than in order of the angle made with the starting point. It may at first appear that this process is O(N2) because of the inner backtracking loop, but since no point can be deleted more than once it is in fact O(N). The algorithm over-all is O(N log N), because the points must initially be sorted by X coordinate. Manhattan minimum spanning tree We first break this down into a simpler problem. Standard MST algorithms for general graphs (e.g., Prim's algorithm) can compute the MST in O((E + N) log N) time for E edges. If we can exploit geometric properties to reduce the number of edges to O(N), then this is merely O(N log N). In fact we can consider, for each point P, only its nearest neighbors in each of the 8 octants of the plane (see the figure below). The figure shows the situation in just one of the octants, the West-Northwest one. Q is the closest neighbour (with the dashed line indicating points at the same Manhattan distance as Q), and R is some other point in the octant. If PR is an edge in a spanning tree, then it can be removed and replaced by either PQ or QR to produce a better spanning tree, because the shape of the octant guarantees that |QR| ≤ |PR|. Thus, we do not need to consider PR when building the spanning tree. This reduces the problem to that of finding the nearest neighbour in each octant. We'll just consider the octant shown; the others are no different and can be handled by symmetry. It should be clear that within this octant, finding the nearest neighbour is equivalent to just finding the point with the largest value of x − y, subject to an upper bound on x + y and a lower bound on y, and this is the form in which we'll consider the problem. Now imagine for the moment that the lower bound on y did not exist. In this case we could solve the problem for every P quite easily: sweep through the points in increasing order of x + y, and Q will be the point with the largest x − y value of those seen so far. This is where the divide-and-conquer principle comes into play: we partition the point set into two halves with a horizontal line, and recursively solve the problem for each half. For points P in the upper half, nothing further needs to be done, because points in the bottom half cannot play Q to their P. For the bottom half, we have to consider that by ignoring the upper half so far we may have missed some closer points. However, we can take these points into account in a similar manner as before: walk through all the points in x + y order, keeping track of the best point in the top half (largest x − y value), and for each point in the bottom half, checking whether this best top-half point is better than the current neighbour. So far I have blithely assumed that any set of points can be efficiently partitioned on Y and also walked in x + y order without saying how this should be done. In fact, one of the most beautiful aspects of this class of divide-and-conquer plus line-sweep algorithms is that it has essentially the same structure as a merge sort, to the point that a merge-sort by x + y can be folded into the algorithm in such a way that each subset is sorted on x + y just when this is needed (the points initially all being sorted on Y). This gives the algorithm a running time of O(N log N). The idea of finding the closest point within an angle range can also be used to solve the Euclidean MST problem, but the O(N log N) running time is no longer guaranteed in the worst cases, because the distance is no longer a linear equation. It is actually possible to compute the Euclidean MST in O(N log N) time, because it is a subset of the Delaunay triangulation. Sample problems
Conclusion References
|
|
|
Home |
About TopCoder |
Press Room |
Contact Us |
Careers |
Privacy |
Terms
Competitions | Cockpit |
| Copyright TopCoder, Inc. 2001-2011 |


Here is a list of projects I have created so far:
This project is a simple hello world display that uses HTML
This project is about my very first webpage and was created using html and styled with css.
This project invovled creating a webpage for displaying fruit images.It was created using html and styled with a bit of css
This project involved creating a webpage to practice media queries. The webpage was created using html and css.
This project involved creating a webpage that highlights some differences between cats and dogs. It was created using html and css
I have a background in electrical engineering. I recently graduated from the university of Nairobi with said degree. I decided to take a class in programming to take my progrmming skills to the next level ie become a world class software developer.
Some of my interests and hobbies include:


actionlint playground
Static checker for GitHub Actions workflow files
Permalink
Check
Loading WebAssembly binary...
Yay! No error was detected.


The Motorola Razr Is Back And People Reckon The 2000s Are Here Again
by Michelle RennexThe most iconic phone of the 2000s had to be the pink Motorola Razr.
The rush of power felt after slamming the phone shut following a bad phone call is a feeling I’ve been chasing for a decade.
Lucky for the sassy, the Motorola Razr is getting the same treatment as blue eyeshadow and platform shoes, and is coming back in 2020!
With a new look on the old classic, the 2020 Razr sill sports a stainless steel exterior.
Despite boasting the same name as the original, the clam shell Razr is basically just a foldable smartphone, similar to the Samsung Galaxy Fold. With a 6.2inch internal display and a 2.7inch ‘quick view’ outside panel, the Razr will, unsurprisingly, retail for $1499 USD. That’s approximately $2200 here in Australia.
As expected, people were flooded with memories and took to Twitter to express their excitement for the phone slamming possibilities.
But most people were fixated on the idea that 2020s is, excitedly, starting to look exactly like the 2000s again.
I don’t know about you but I’m looking forward to reliving the 2000s, where my biggest struggle was picking out my outfit the night before mufti day.


{{ printf "%s" .RelPermalink .Title | safeHTML }}
We are a student group acting independently of the University of California. We take full responsibility for our organization and this web site.


--- layout: default ---
{{ event.date }} @ {{ event.location}}
{{ event.description }}
Photos form event
{{ event.www }}


MKTableCellPickerControlled Class Reference
| Inherits from | MKTableCell : UITableViewCell |
| Conforms to | UIPickerViewDataSource UIPickerViewDelegate |
| Declared in | MKTableCellPickerControlled.h |
Overview
The MKTableCellPickerConrolled is a subclass of MKTableCell. This class creates a MKTableCell with two UILabels side by side. When the user touches a the cell a picker will appear on the screen. The picker appears the same way as a keyboard, sliding up from the bottom of the screen. A toolbar with a done button is placed on top of the picker for dismissing it. When the user changes the pickers selection the cell is update with the new selection. The only thing you need to do is set what kind of picker you want to display. You do this by setting pickerType property.
Supported picker types:
-
MKTableCellPickerTypeDate
: Sets the picker type to an instance of UIDatePicker. -
MKTableCellPickerTypeStandard
: Set the picker type to an instance of UIPickerView.
If you use the MKTableCellPickerTypeDate
you need to provide a pickerSubType.
-
MKTableCellDatePickerModeDate
: An UIDatePicker that allows the user to select a specific date. -
MKTableCellDatePickerModeTime
: An UIDatePicker that allows the user to select a specific time. -
MKTableCellDatePickerModeDateAndTime
: An UIDatePicker that allows the user to select a specific date and time. -
MKTableCellDatePickerModeCountdown
: An UIDatePicker that allows the user to select a specific length of time.
If you use the MKTableCellPickerTypeStandard
you need to provide an NSArray containing the data to fill the picker with. You do this by setting the pickerArray property. This picker array needs to contain NSString objects only to set the picker properly.
This class works with the MKTableCellTextEntry class by listening for and posting notifications. The two class make ensure that a keyboard and picker will not be displayed at the same time.
MKTableCellPickerControlled listens for the PICKER_SHOULD_DISMISS_NOTIFICATION
to dismiss itself without the user touching the done button.
MKTableCellPickerControlled sends a PICKER_DID_SHOW_NOTIFICAITON
when the picker appears on the screen.
Note When the a picker is displayed it is added to the applications keyWindow. When using this class your UITableViewController subclass needs to post the PICKER_SHOULD_DISMISS_NOTIFICATION
in its viewWillDisappear: method. This will dismiss the picker when the user navigates away from the view. If this is not done the picker will stay on the screen.
Here is an example on how to post the PICKER_SHOULD_DISMISS_NOTIFICATION
:
- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[NSNotificationCenter defaultCenter] postNotificationName:PICKER_SHOULD_DISMISS_NOTIFICATION object:self userInfo:nil]; }
Tasks
Cell Elements
-
pickerLabel
The label that the displays the pickers selected value. @warning Note The text of this label is set by the picker. -
placeholder
Sets a placeholder string in the pickerLabel.
Picker Types (Required)
-
pickerType
Sets the MKTableCellPickerType to be used by the cell. This can be set to one of two values:-
MKTableCellPickerTypeDate
: Sets the picker type to an instance of UIDatePicker. -
MKTableCellPickerTypeStandard
: Sets the picker type to an instance of UIPickerView.
-
-
pickerSubType
Sets the mode of the date picker. Only used if pickerType is set to MKTableCellPickerTypeDate.
Picker Data
-
pickerDate
The selected date when MKTableCellPickTypeDate is used. -
pickerArray
An array of NSString objects to supply the picker with data.Note This is required when the pickerType is set to
MKTableCellPickerTypeStandard
.
Display Opptions
-
pickerView
An MKPickerView instance used to display the picker. -
owner
The view controller that the picker drawn onto. -
pickerFrame
The frame that the picker will be drawn into. -
displayed
BOOL value that tells if the a picker is displayed or not.
Instance Methods
-
- changeDate:
Informs the delegate that an UIDatePicker has changed the selected date. This method should not be called directly. -
- doneButtonTouched:
Informs the delegate the the picker with be dismissed and dismisses the picker. This method should not be called directly
Instance Methods
Properties
displayed
BOOL value that tells if the a picker is displayed or not.
@property (assign, readonly) BOOL displayed
Declared In
MKTableCellPickerControlled.h
owner
The view controller that the picker drawn onto.
@property (assign) UIViewController *owner
Declared In
MKTableCellPickerControlled.h
pickerArray
An array of NSString objects to supply the picker with data.
Note This is required when the pickerType is set to MKTableCellPickerTypeStandard
.
@property (nonatomic, assign) NSArray *pickerArray
Declared In
MKTableCellPickerControlled.h
pickerDate
The selected date when MKTableCellPickTypeDate is used.
@property (nonatomic, retain, readonly) NSDate *pickerDate
Declared In
MKTableCellPickerControlled.h
pickerFrame
The frame that the picker will be drawn into.
@property (assign) CGRect pickerFrame
Declared In
MKTableCellPickerControlled.h
pickerLabel
The label that the displays the pickers selected value. @warning Note The text of this label is set by the picker.
@property (nonatomic, retain) UILabel *pickerLabel
Declared In
MKTableCellPickerControlled.h
pickerSubType
Sets the mode of the date picker. Only used if pickerType is set to MKTableCellPickerTypeDate.
@property (assign) MKTableCellDatePickerMode pickerSubType
Discussion
Sets the mode of the date picker. Only used if pickerType is set to MKTableCellPickerTypeDate.
This can be set the one of the following values.
-
MKTableCellDatePickerModeDate
: An UIDatePicker that allows the user to select a specific date. -
MKTableCellDatePickerModeTime
: An UIDatePicker that allows the user to select a specific time. -
MKTableCellDatePickerModeDateAndTime
: An UIDatePicker that allows the user to select a specific date and time. -
MKTableCellDatePickerModeCountdown
: An UIDatePicker that allows the user to select a specific length of time.
Declared In
MKTableCellPickerControlled.h
pickerType
Sets the MKTableCellPickerType to be used by the cell. This can be set to one of two values:
-
MKTableCellPickerTypeDate
: Sets the picker type to an instance of UIDatePicker. -
MKTableCellPickerTypeStandard
: Sets the picker type to an instance of UIPickerView.
@property (assign) MKTableCellPickerType pickerType
Declared In
MKTableCellPickerControlled.h
pickerView
An MKPickerView instance used to display the picker.
@property (nonatomic, retain) MKPickerView *pickerView
Declared In
MKTableCellPickerControlled.h
placeholder
Sets a placeholder string in the pickerLabel.
@property (nonatomic, copy) NSString *placeholder
Declared In
MKTableCellPickerControlled.h


Alphasense Air Sensors (A4)
- These are the A4 small (20mm) Alphasense AFE gas sensors mounted in a A4 x 3 configuration
- Available for measuring several gases including carbon monoxide, ozone, nitric oxide and more
- More information on the A4 air quality sensors can be found on the Alphasense website: http://www.alphasense.com/index.php/air/products/
Connecting to the Safecast Air Board
Ribbon Cable
- Flat ribbon cable, 1 mm pitch, 10 conductor e.g. Digikey Part # MC10L-5-ND.
- 10 pos, 2 mm pitch cable connector on each end of the ribbon cabble. Digikey part # WM14310-ND.
- Connect the ribbon cable to the header on the back of the air sensor board
- The Safecast Air Board includes two designated headers (P1 and P2) for the Alphasense air sensors.
- Connect the ribbon cable to one or both of these headers as shown below


Reduce stress by forest bathing
Take in nature by switching on your five senses and experience calm
by ESTELLE LOWIf you regularly spend time in the park, reservoir or a garden setting, you may be familiar with the calming effects of nature, whether it's from the therapeutic greenery, sound of birds or the smell of crisp, dewy air.
Now, there's an actual science to explain those benefits. There's even a term for immersing yourself in natural surroundings - forest bathing.
WHAT IS FOREST BATHING?
It is a metaphor for bathing yourself in the elements of a forest. There's no actual bathing involved, but you'll switch on your five senses - sight, smell, hearing, touch and taste - while taking in nature, one mindful movement at a time.
The concept started in Japan in the 1980s, when the Forestry Agency of Japan proposed a national health programme to reduce stress in workers.
Better known as shinrin-yoku (in Japanese, "shinrin" means forest and "yoku" means bath) in Japan, forest bathing has taken root and is being embraced all over the world, largely thanks to well documented and publicised research by Dr Qing Li of the Nippon Medical School in Tokyo, who's also the author of Forest Bathing: How Trees Can Help You Find Health and Happiness.
According to Dr Qing Li, here's how to do forest bathing: "First, find a spot. Make sure you have left your phone and camera behind. You are going to be walking aimlessly and slowly. You don't need any devices. Let your body be your guide. Listen to where it wants to take you. Follow your nose. And take your time. It doesn't matter if you don't get anywhere. You are not going anywhere. You are savouring the sounds, smells and sights of nature and letting the forest in.
"The key to unlocking the power of the forest is in the five senses. Let nature enter through your ears, eyes, nose, mouth, hands and feet. Listen to the birds singing and the breeze rustling in the leaves of the trees. Look at the different greens of the trees and the sunlight filtering through the branches. Smell the fragrance of the forest and breathe in the natural aromatherapy of phytoncides. Taste the freshness of the air as you take deep breaths. Place your hands on the trunk of a tree. Dip your fingers or toes in a stream. Lie on the ground. Drink in the flavour of the forest and release your sense of joy and calm. This is your sixth sense, a state of mind."
FOREST BATHING IS NOT HIKING
As forest bathing involves walking around aimlessly while mindfully, it's far from hiking, where you typically start with a route, destination and duration in mind. In fact, it demands the exact opposite - that you let go of projections, expectations and anything remotely goal-oriented, and just be.
All you need, really, is to show up - for at least two hours.
The best part? Forest bathing has proven health benefits. Dr Qing Li's research team documented these positive effects:
Improved immunity
Forest bathing increased the activity, as well as the number of disease-fighting cells, and this effect lasted for 30 days. Immune cells play an important role in defending against bacteria, viruses and tumours.
Lowered blood pressure and heart rate
Compared with walking in the city, forest bathing significantly reduced blood pressure as well as heart rate. And we all know that these two markers are closely linked to hypertension and heart diseases.
Reduced stress and stress hormones
Participants in Dr Qing Li's study reported lower scores in anxiety, depression, anger, fatigue and confusion. At the same time, they experienced lower levels of stress hormones, adrenaline and cortisol.
HOW TO DO FOREST BATHING IN SINGAPORE
Dr Qing Li said: "You can forest-bathe anywhere in the world - wherever there are trees; in hot weather or in cold; in rain, sunshine or snow. You don't even need a forest. Once you have learnt how to do it, you can do shinrin-yoku anywhere - in a nearby park or in your garden."
What this means is you can apply the principles of forest bathing in any nature spot.
Think Singapore Botanic Gardens, MacRitchie Reservoir, Bukit Timah Nature Reserve and even your neighbourhood park.
Or consider joining forest bathing classes led by Xiu Nature Connections. These sessions are meant to ease you into forest bathing, by guiding you to awaken your senses and tune into your body.
This article was first published in Shape (www.shape.com.sg)


Hello again!
First of all, I'd like to thank each and every one of those that contacted me today just to let me know they appreciate my work (or even "bought me a coffee").
Secondly, I want to thank to all of the others who are happily using my extension, but haven't contacted me. Honestly, I don't know how I would have managed to read 200.000 emails in a single day! :)
Finally, I want to apologize for the sometimes harsh language I'm using when communicating with you all, and also clear the air about something I said in my previous update notes, that seemed to trouble quite a few people!
I could have sold the extension to someone who would have gained access to all your passwords, emails, etc without you even knowing it.
That sounds really bad, especially when taken out of context.
That was not a threat, as some people misunderstood it! Also, I was not giving praise to myself, as others thought...
I only wanted to re-assure you that
your privacy is one of my main concerns when it comes to this extension and I wouldn't ever do anything to put you at risk.
I probably wouldn't have even thought about bringing it up if someone wouldn't have mentioned it in a review he left in the webstore.
A simple explanation for non-developers is this:
Basically, any extension that is able to interact with a web page by reading or modifying it's content, is able to read anything you enter in web forms,
from usernames & passwords to credit card details and other sensitive data (basically, any text displayed by your browser - even the stuff you type in password fields).
The thing is that most extension actually need the ability to interact with pages for legit reasons and it's hard to decide which you should trust and which not.
As an example from the top of my head, all ad blockers, color pickers, extensions that enable mouse gestures, form auto-completers, password managers (doh!), text highlighters (and the list could go on) have the technical capability to
silently steal your data without you even suspecting it, if their developer would choose to do so.
As for developers:
Extensions interact with webpages through "content scripts" which are plain JavaScript injected into every page that loads in the browser.
This means that the extension can read the DOM and attach keypress event handlers to anything and send the captured data anywhere using AJAX calls (yes, extensions can make cross-domain AJAX calls).
(In the case of Window Resizer, a content script is used to create the tooltip shown when you resize the window.)
I know this is really scary stuff; it's the same thing I fear every time I install a new extension myself. I just didn't wanted you to have these fears when it comes to Window Resizer; that's what I meant in my previous notes.
Once again, I'm sorry if I've disappointed you in any way! I hope that clears up the things a bit, but, if you have any other concerns,
feel free to contact me using the Support link in the webstore or by sending an email at
<EMAIL_ADDRESS>with the subject "Window Resizer"
Thank you!
P.S.: Instead of just sending me an "Thank you!" email to show your appreciation (or not!), please right click on the extension's icon then click on "Window Resizer". That would open the webstore, where you can leave a review or edit your previous one.
I'm not asking for 5 stars, I'm asking for your honest opinion, because people looking to install this extension should know all sides of the story, not only the negative comments about how I'm evil and I'm trying to conquer the internets... :)


We're adopting a child!
As of today, Janine and I have signed the papers to become the proud parents of baby Diane! We've been looking forward to this day for weeks.
As of today, Janine and I have signed the papers to become the proud parents of baby Diane! We've been looking forward to this day for weeks.


Houses hold 8 mice. You need 8 mice to build a house.
It takes 10 seconds to build a house.
You have 2 mice.
You have 1 house.


| 002:236 Khan | : |
There is no sin on you, if you divorce women while yet you have not touched (had sexual relation with) them, nor appointed unto them their Mahr (bridal money given by the husband to his wife at the time of marriage). But bestow on them ( a suitable gift), the rich according to his means, and the poor according to his means, a gift of reasonable amount is a duty on the doers of good. |
| 002:236 Maulana | : |
There is no blame on you if you divorce women while yet you have not touched them, nor appointed for them a portion. And provide for them, the wealthy according to his means and the strained according to his means, a provision according to usage. (This is) a duty on the doers of good. |
| 002:236 Pickthal | : |
It is no sin for you if ye divorce women while yet ye have not touched them, nor appointed unto them a portion. Provide for them, the rich according to his means, and the straitened according to his means, a fair provision. (This is) a bounden duty for those who do good. |
| 002:236 Rashad | : |
You commit no error by divorcing the women before touching them, or before setting the dowry for them. In this case, you shall compensate them - the rich as he can afford and the poor as he can afford - an equitable compensation. This is a duty upon the righteous. |
| 002:236 Sarwar | : |
Also, it is not a sin if you divorce your wives before the consummation of the marriage or the fixing of the dowry. But the dowry will be due from a husband whether he is rich or poor. It is payable in a reasonable amount according to the husband's financial ability. This is an obligation for the righteous ones. |
| 002:236 Shakir | : |
There is no blame on you if you divorce women when you have not touched them or appointed for them a portion, and make provision for them, the wealthy according to his means and the straitened in circumstances according to his means, a provision according to usage; (this is) a duty on the doers of good (to others). |
| 002:236 Sherali | : |
It shall be no sin for you if you divorce women while you have not touched them, nor settle for them a dowry. But provide for them - the rich man according to his means and the poor man according to his need - a provision in a becoming manner. This is an obligation upon the virtuous. |
| 002:236 Yusufali | : |
There is no blame on you if ye divorce women before consummation or the fixation of their dower; but bestow on them (A suitable gift), the wealthy according to his means, and the poor according to his means;- A gift of a reasonable amount is due from those who wish to do the right thing. |
Concepts/Themes Covered: الإنسان والعلاقات الاجتماعية > الأسرة > الطلاق > الاحكام التى تترتب على الطلاق Man and The Social Relations>The Family>Divorce> Its Rules
This tool uses eight English parallel translations for the Holy Quran imported from Mr. Clay Smith. You can also visit Qurany Concepts for browsing the Quran themes or topics. If you want to search the Holy Quran for keywords, please visit Qurany Keywords.


Marshall's Portfolio
About Me
School
Projects
Work
Twitter
GitHub
Schooling
Projects
Work History
Welcome to my portfolio!
Some of my intrests:
Coding
Video Games
Web Development
Managing Communities


Resea
A pure microkernel-based hackable operating system.
GitHub
- Source code, bug reports, feature requests, and pull requests.
Gitter
- Where you can ask any questions or help.
Documentation
- How to build, internal design, API docs, etc.


<lcTask>
The <lcTask> captures a work item to be performed, as part of the learning plan.
Category: Learning and training: common content elements


Making a new post will be publicly visible. Make link post to share a link, make a text post for discussion.