text:
1). To purchase individual tickets to one of the Captain's pre-planned cruises, click on the "Pre-Planned Cruises" page of this website and you will see the Captain's yearly Cruise Schedule with cruise details and pricing.
To book a private cruise look at the "Calendar page" of this website to determine if the date(s) you want are available. Please keep in mind that the Captain has other obligations besides chartering groups on Delta excursions, therefore, even if the date(s) you want is not booked on the calendar, it does not mean the Captain will be available on the date(s) you want. You will need to call and check on availability for your specific date(s). The calendar is merely to show dates that are already booked for the specific date(s) and time you need and therefore, unavailable for sure.
2). Call the Captain and let him know what type of adventure you are looking for (hourly or overnight) and the number of guests that will be joining you (35 guests maximum for hourly and overnight cruises). He can let you know then if your date(s) is doable. The Captain can book more than one cruise on any given date as long as their is about 1 hour in-between cruises, so if the calendar shows something booked on the date you want, make sure you click on that reservation so a text box will pop up and you can see the scheduled time for the preexisting cruise. If the time you desire allows the Captain at least 1 hour between cruises, then the Captain may be able to accommodate you even though their is a preexisting cruise scheduled for the same date you are interested in. Please call the Captain to see if your date and time is workable 925.383.5346
3). If your date(s) and time is available, request a Charter Agreement from Captain Morgan via e-mail using the Contact Us page of this website. 0nce you have received your Charter Agreement via-email from the Captain, fill it out completely, sign and date the bottom then return it via e-mail to the Captain or simply mail it to 1700 Riverlake Road, Discovery Bay, CA 94505. When the Captain sends you your Charter Agreement, he will also include instructions in the e-mail so that you can pay your 50% deposit online with a credit or debit card if you choose to pay it electronically, otherwise you can mail a check made out to Captain Morgan to 1700 Riverlake Road, Discovery Bay, CA 94505. Please make sure you read our "Refund Policy" for all cruises. "Private Cruise Deposits" are not fully refundable unless the trip is canceled 30 days prior to the cruise date of your reservation. "Pre-planed cruise payments" are not refundable if the pre-planed cruise you booked is sold out or your cancelation is less than 14 days notice prior to your cruise sailing date. If the Captain cancels a private or pre-planed cruise for any reason, you will receive a full refund.
4). Once the Captain receives your deposit and signed Charter Agreement, he will post your cruise on the calendar page of this website. That confirms your cruise date(s). No reservation is confirmed until your deposit is received and the date(s) is posted on the calendar page of this website.
5). Go to the FAQ's page of this website and see the recommended items to bring. The Rosemarie is fully stocked with most everything you will need but their are some personal items you may want to bring. Also, you will see a list of items that are prohibited such as drugs, fire arms, knives, etc. If anyone in your group brings aboard a prohibited item, it will be grounds for the immediate termination of the cruise without any refund. Please make sure everyone in your group understands what is expected so we all can have an enjoyable time without issues.
6). We will be meeting at the Boardwalk Grill Restaurant which is at the Discovery Bay Marina (5879 Marina Road, Discovery Bay, CA 94514) to start on our voyage (unless other arrangements with the Captain have been made), please make sure everyone in your group arrives on time so we can start the mandatory orientation promptly at the agreed upon time. If we leave the dock late, it could affect our ability to have bridges opened in the event our destination requires them to be opened. Your guests that arrive early can enjoy a few drinks and/or something to eat while the rest of your party arrives. Make sure the restaurant staff know you are with Captain Morgan's Delta Adventures and they will seat you all in the same area for the brief safety orientation.
7). Depending on the departure time of your cruise, people may also be able to buy any last minute things they may have forgotten from the stores along the Boardwalk at the Discovery Bay Marina. However, if you follow the list of things to bring you should have everything you need (this is mainly for overnight adventures) We may also be making store runs periodically on overnight trips incase anyone realizes they forgot something.
8). If you have any questions, please feel free to call the Captain anytime at 925.383.5346. If your call goes into voice mail, please leave a message, and the Captain will return your call as soon as possible, thank you!


text:
My answer to that question is equivocal. If I wasn't doing the tasks I do, perhaps. If I didn't travel, maybe. But the phone has become a safety net of sorts for me. I want to have one available in case of emergencies. I'm not personally someone who wants to chat with people all day, especially about things that I tend to view as trivial (fashion, recipes, celebrities). But I do want to be able to call the fire department if the fire in the frying pan gets out of control when I burn dinner.
However, with the work I do, I am on the phone a lot – and most of it is not local. I am often talking to people on the Pine Ridge Reservation in South Dakota as well as sponsors in every state you can imagine. I even get to chat with co-workers in England and Norway! So the phone is important.
But, I asked myself today, is it more important than heat or food? You may think that an odd question, but I ran into an obstacle today that is directly related to the question.
I actually have been blessed to have several sponsors waiting to be matched at the same time. In order to do that, I speak to the sponsor, then call several families on the rez to see which one I think will be a better match for the sponsor. Today, I called several people to try to do just that. Every call was met with one of these responses:
"We're sorry but 605-555-5555 has been disconnected. Please check the number and try your call again."
"The number you have called is not a working number. Please check the number and try your call again."
"The (company name) customer is not available. Please try your call later."
I called the social service office in the area that I work in and left the names of people I need to reach. Someone will get back to me with the new numbers – soon I hope. I really need to get those sponsors connected. I thought the families I tried to call would be excellent matches. If I don't get updated phone numbers, I may have to go back to the drawing board.
So why suddenly am I having so much trouble reaching people on the reservation?
Actually, it isn't unusual to have phone numbers changed from time to time, when the bill can't be paid. But this was certainly a higher frequency than usual. Why was that?
The answer actually occurred to me when I was speaking with my contact at the office on the reservation. We were talking about the weather. She said it was starting to get really cold on the rez and they had just that week opened their fuel assistance program.
And it hit me!!
Cold weather = increased use of propane and/or electricity for heat = more money spent on fuel costs
80% unemployment + government assistance = very little money.
Very little money – grocery bills – money for heat/electricity – phone bill = a deficit budget.
Now the government can exist on a deficit budget because they can print money. (The drawbacks of that will be left for others to worry about.) If you and I try to print money, however, the government gets downright cranky about it! So, what are we to do?
We have to make decisions based on our priorities.
What is more important?
Food? We may get food stamps but they expect us to feed each person on about $1 per meal. Anyone with half a brain (government officials excluded) knows that's impossible. I might let myself go hungry (losing weight wouldn't be a bad idea) but I refuse to let my children to hungry. So I will spend what I need to for the food basics.
Electricity? We might be able to do that in the summertime but not in the winter. The bill gets too high, it's true. But what can be done about that? It gets dark about 4:25 PM now and in 4:42 PM in mid-January. How will the children do their homework in the dark? There isn't much for kids to do here in the winter. How will I entertain them on the weekend without the DVD player? How will I use the electric heaters we need to supplement the propane so we don't run out. If I don't have propane, we'll freeze.
Propane? We'd probably let the electric go first! Propane is heat. Propane is also for cooking meals. It's cold enough in here, even with the heat on. There's no insulation in the walls and there are a lot of drafts. No storm windows – unless you count the plastic over the window. The mattresses are on the floor and it gets really cold down there. We don't have enough blankets for the kids and I refuse to let them freeze.
Phone? It's good to be able to talk to friends and share troubles. But I guess I could live without that. I might need to call the fire department. Wait, why bother? The house will burn down by the time they get here anyway! Ambulance, maybe? I could have one of the kids run to a neighbor for that.
Well, I guess that answers my question, doesn't it?
If you live on Pine Ridge Reservation, the phone comes in at the bottom of the list.
So I guess while our kids all have their own cell phones and some folks have more than one, it is a country of inequality when it comes to phones. Some people in this country don't have phones because they think basic existence is more important than chatting about which celebrity is in rehab.

subset: commoncrawl


text:
Visit the Campus
The best way to learn more about the University of New Haven experience is by visiting campus. You'll meet professors, interact with current students, and learn why we believe success starts here.
As a University of New Haven student, you will achieve more than you ever thought possible. That is our promise.
From our robust core curriculum, to the most technologically advanced programs we offer, we believe that the best education is one driven by both passion and purpose. As a student here, you will seek real answers to tough questions, real solutions to difficult problems, and real insights to evolve important conversations. Each collaboration will bring you a step closer to turning what engages you most into a rewarding career – and, ultimately, a life that won't bore you. You will find that your fellow students and our committed faculty – a diverse community that comes to campus from down the block, across the country, and around the world – will challenge you to become your best self as you learn together. And the most amazing part? The process of discovery doesn't end when you graduate. Our alumni leave us as newly minted lifelong learners. And they go on to change the world.
Since 1920, the University of New Haven has been providing unique opportunities for our students. Today, we offer over 100 distinct bachelor's degree programs and concentrations to its 4,600 full-time undergraduate students.
This site is filled with information about our academic programs and campus life. You can also request more information, register for one of our numerous campus visit opportunities, take our virtual campus tour and even start your online application for admission.
Our admissions staff is committed to helping you find the programs and opportunities that are right for you and we are looking forward to helping you through the application process. We hope you will become a part of this truly exceptional institution!
Kevin J. Phillips
Senior Associate Vice President for Enrollment Management
The best way to learn more about the University of New Haven experience is by visiting campus. You'll meet professors, interact with current students, and learn why we believe success starts here.
You enjoyed what you saw and you are ready to apply to be part of Charger Nation. No matter what part of the application process you are in, we are here to help. Just ask!
Attending college is one of the biggest investments you and your family will make, and we understand that. We provide competitive financial aid packages and scholarships that reward you for your success so far and for the limitless potential you have to become a leader in your chosen field.


text: It's never fun to receive a phone call from a relative telling you that they have been imprisoned. Of course you want to help them, and the first step toward doing that is helping them get out of jail—and that means paying their bail. This isn't always as simple or [...] Bail Bond Tips: Get Your Relative Out of Jail in ...26 Apr, 2017 in 1-800-BAIL-ME-OUT / Bail Bonds / Riverside Bail Bonds tagged bail agent / bail bond question / bail bonds california / bailbonds by Remedy Bail Bonds


text:
[10] In spite of avoidance behavior, a traveler may still be bitten by an animal in the developing world where there is a reasonable risk of exposure to rabies infection. If the traveler has a contingency plan to deal with such a scenario, she/he will know to go to the nearest center of safe medical care within a
few days or as soon as possible for appropriate rabies PEP. Unfortunately, many cases of travel-related rabies infection were associated with the exposed person grossly underestimating the significance of the incident and not seeking medical care until the onset of rabies symptoms.[17-20] Prior to the onset of symptoms, some travelers also died of rabies as a result of seeking but not receiving timely rabies PEP even at sites of medical selleck excellence.[21-24] In addition, recent studies document inadequate NVP-BKM120 rabies PEP and animal bite aftercare provided to travelers following high-risk exposures in various developing countries.[25-27] Knowing
this, it may be more prudent in some high-risk travel environments (eg, India or Africa) to offer rabies PrEP to any concerned traveler.[10] Where cost is a barrier, the intradermal method of administration is a cost-effective alternative to intramuscular injections.[28] Unlike animal avoidance, rabies immunization is a passive act and does not require active participation of the traveler. In general, passive interventions tend to be more successful than active ones that require the client's adherence throughout the trip. If the properly primed traveler [eg, with post-series rabies virus neutralizing antibodies (RVNA) titer ≥0.5 IU/mL] is potentially exposed to rabies, then the management becomes an urgent and not an emergent matter.[14] Rabies PrEP may be seen as addressing a manageable risk, because it simplifies post-exposure aftercare. Rabies immune globulin (RIG) is not required for PEP in an adequately "PrEPed" traveler; and RIG is often unavailable in many developing countries.[10,
12-14, 25-27] However, rabies PrEP may also be seen as addressing rabies exposure as a preventable risk rather than simply a manageable one. Veterinarians and other animal handlers receive rabies PrEP for occupational reasons, because they may experience inapparent selleckchem rabies exposure during the course of their careers.[12, 14] As a precaution, these individuals are tested at regular intervals to assure having adequate RNVA (>0.5 IU/mL) as a surrogate for protection against rabies infection, because inapparent exposures would never result in post-exposure rabies vaccination. This has been an accepted occupational health practice for several decades.[13] To our knowledge, there have been no reported cases of rabies among animal handlers who have received a proper rabies PrEP series using a World Health Organization (WHO)-recommended vaccine of cell-culture origin.
Related posts:
- , 2009 and Miller et al , 2008) When
- In spite of intensive syphilis-targeted public health control ini
- Successful US avoidance reduces anxiety and thereby reinforces av
- Earnest learning on the one side, ethical behavior on the other s
- In spite of usually detectable laboratory abnormalities, clinically significant


text:
Directions to the applicant:
Click below to open a printable version of the New Member Registration Form:
New Member Application
Online Membership Purchase
Refund Policy:
CanASK has a no refund policy. Once the financial transaction is complete, there will be no reimbursement of fees.
Non-Sufficient Funds Policy:
A $50 processing fee will be assessed for NSF cheques. Payment must be made by money order, credit card, or certified cheque thereafter.


text:
Legal Moves
Taking your game global with David Lakritz of LAI Global Game ServicesFebruary 15, 2017 Zachary Strebeck
In this episode, I chat with David Lakritz, President of LAI Global Game Services. We discuss global game releases for indie developers, including localization, global regulations, and the best countries to release your game in. Apologies for my terrible audio quality. It'll be worked out in (hopefully) the next episode!


text:
Robert Dalmasso
In this article we establish three stability results for some inverse problems. More precisely we consider the following boundary value problem: in , on , where and are real constants and is a smooth bounded simply-connected open set. The inverse problem consists in the identification of and from knowledge of the normal flux on corresponding to some nontrivial solution.
Submitted September 10, 2012. Published November 8, 2012.
Math Subject Classifications: 35J05, 35R30.
Key Words: Inverse problem; stability
Show me the PDF file (215 KB), TEX file, and other files for this article.
| Robert Dalmasso
L'Eden,17 Boulevard Maurice Maeterlinck
06300 Nice, France
email: email@example.com
Return to the EJDE web page


text:
A return to colonial grandeur
A bagpiper at sunset, croquet on the lawn and the Duke of Edinburgh's first motor may not be what you expect to find in Sri Lanka. But you find them all at The Galle Face Hotel in Colombo. It has been called the 'oldest hotel east of Suez' and indeed this is one of the region's most impressive and historic properties. Originally a Dutch villa it was acquired by three British businessmen and opened as a hotel in 1864, catering for the elite of the colonial era who were starting to travel to what was then Ceylon. In 1869 the Suez Canal had just opened and journey time from Europe to Asia was reduced from four months to one. Travellers came by rickshaw to experience Ceylonese hospitality, warm weather and a taste of the tropics. Since then monarchs and celebrities from all over the world have passed through the doors, and if the walls could speak they would have some amazing stories to tell. In its heyday the Grand Ballroom, the hotel's original ballroom, was the city's most happening party spot. Many revellers missed their ships due to the over-the-top events there.
After a 30-month restoration, the North Wing of the hotel has been refurbished to recreate its original style and architectural features. Rooms and suites, bars, lobby and ballrooms now boast the grandeur that lured famous faces including Vivien Leigh and Cary Grant, literary figures such as DH Lawrence, Sir Arthur Conan Doyle and Sir Arthur Clarke who wrote the final chapters of 3001: The Final Odyssey here. Harrison Ford was a guest as were Yuri Gagarin, the first man in space, and even Mark Twain.
Encapsulating its long history is the hotel's museum in the South Wing.
Here, among crockery and autographs and portraits of famous guests is Prince Philip's first personal car, a 1935 model Standard Nine that he bought for £12 when he was stationed in Ceylon.
Here you can also read about the world's longest serving doorman, Kottarapattu Chattu Kuttan, who served at the hotel from 1942 until 2014. He was succeeded by Mr. Banda who has been working at the hotel for 50 years and now at 71 years old is still welcoming guests.
And every evening at sunset, a bagpiper in tartan kilt pipes as the national flag is ceremoniously lowered, one of many delightful touches that have endured here for centuries.
There are 72 sumptuous rooms at The Galle Face hotel, many with sea view. All have a colonial feel with wood finishes, TV, shower, safe, tea and coffee making facilities. Wi-Fi is free throughout. A croquet lawn and ocean view executive suite complete with butler have also been added to the hotel. An Occitane spa will open later this year near the lovely swimming pool close to the sea.
Superior rooms are about £137 per night for two


text:
Hot or Not? Get a Grip Wine Glass Holders
We met a few of the good folks from FRED at the Housewares Show, and we thoroughly enjoyed their high spirits and witty sense of humor. This sense of humor infuses all their products, most of which still manage to be rather practical as well.
Now there's these wine grips, modeled perhaps on bicycle handles? We're looking forward to plenty of picnics and backyard fêtes in the warm weather, and these handles give you a firmer grip on your glass as you balance it with a plate in the other hand. They also helpfully color-code glasses – much nicer than those twee charms, in our humble opinion. But these may be still not quite right. We put it to you…
We've mentioned FRED's Equal Measure Cup and Banana Handle in the past as well.
Here's some purchase info for these little handles:
• Get A Grip! Wine Handles, $9.99 at Perpetual Kid


text:
It's The Start of Summer! Now Stay (Sun) Safe With These Tips
by Lizzy Smith for Divorced Moms
May 28, 2016
I recently came across a shocking study from the Journal of the American Academy of Dermatology's: most Americans do not know how to properly apply sunscreen. You can read it here. Even those with a history of skin cancer are not as savvy as one might think.
Ok, I guess I am a bit guilty of this, too. While I'm really committed to putting sunscreen on often, I sometimes forget about my children. When we were in Costa Rica and Nicaragua several weeks ago, my 16-year old wanted to get a good tan. I argued with her incessantly about putting on enough sunscreen. She did, but after awhile, I gave up and let her be responsible. She came home looking like a leper. She was peeling on her face and she looked frightening. She was self-conscious about it, too. Thank goodness we had three days before she had to return to school and the worst of it was over. Still, we both learned a lesson-- applying sunscreen properly and often was not debatable.
However you look at it, getting a sunburn is bad. It's bad for the skin, good for skin cancer, and it hurts. Avoid this at all cost.
A few summers ago, I went on vacation to Washington, DC and it was literally 105 degrees, sunny and humid. I never left my hotel room without a hat on my head and an umbrella. I also reapplied sunscreen multiple times throughout the day. I remember one afternoon standing an hour outside on a hot sidewalk under the blazing sun waiting to get into the National Archives. I purchased that small umbrella from a street vendor and it was a lifesaver! I carried it with me during the rest of the trip and, these days, if I know I'm going to be walking in the sun, an umbrella is in my backpack ready to be used at a moment's notice.
In summary, make sure you get outdoors and enjoy the weather (this is good for you!) but stay in the shade and perhaps do your outdoor activities in the mornings or evenings when the sun is at its weakest. Also, consider wearing protective clothing, like swimsuits with rash-guards, hats, sunglasses and tops with sleeves. And never leave the house or hotel room without properly sunscreening.
Benefits of sun exposure
There are numerous benefits to some sun exposure. First, we get fresh "real" vitamin D. The warmth and light of the sun is also a natural mood booster. (Got depression? Get outdoors, get some natural sunlight, and see if you don't feel a bit better "that fast.") Personally, I am a big fan of summer for these reasons. I love going for walks and hikes, hanging out poolside or at the beach with my kids, and reading a good book on my deck. But… I also use precautions. Gone are the days that I visit tanning salons (I cannot believe I used to do this regularly), use baby oil as a sun enhancer, and spend hours laying out during maximum sun intensity (typically between 11A-2P). I used to go on beach-type vacations and pretty much ruin them because my number one priority was making sure I went home with a Big Huge Impressive Tan instead of doing fun stuff. Dear Lord, how dumb. These days, I nearly always wear a hat, sit under an umbrella or in the shade, don sunglasses that block out UVA and UVB rays, and apply sunscreen liberally. I still manage to get tan but I can't tell you the last time I burned (or even got pink). Hooray!
Keep reading...


text:
It's challenge time at Clear it out and we are cleaning out our glitter stash.
I was recently at a friends house and she had 2 containers full of glitter. Unopened. She had so much, she didn't know what to do with it all. It just accumulated over time. My first thought-make some Christmas cards!
I love sparkle in all my cards, I could own shares in Stickles-lol.
Here is the card I made using an image from the Stitchy Bear Outlet Store, (our sponsor) it's called Elf Secrets from Stitchy Stamps
The DP is old, old Stampin' up paper, as is the scalloped border. The snowflakes were punched out and a pearl added. The red glittered ribbon is self adhesive and I added more glitter to the elf's hat. She was coloured in Copics. The sentiment is a stamp also from SU (Stampin' Up)
The challenge runs for one week, thanks so much for stopping by.


text: Ten years ago there were hardly any buildings around this little harbour. Today it is one of Gothenburg's most expensive and popular neighbourhoods. The little harbour called Sannegårdshamnen was built in 1908 and was primary used for management of carbon and cokes. Nowadays it is decorated with fancy sailing boats and up-market yachts.


text:
Contract drivers in the UK are complaining they are being abused in order to get packages to customers quickly. Some say they don't even have time to stop for potty breaks.
We also do some great Zen Headlines
Jackie Chan wins an honorary Oscar! He dedicates the award to his stunt team and all the action stars out there.
Alaska Airlines make first commercial flight using "forest residual" jet fuel. It sounds bad but it's environmentally okay.
Ashley Graham inspires new Barbie doll. One of her requests: The doll's thighs have to touch. They really do.


text: So, I think Smart Actions is a really great idea, just executed poorly. I was wondering if anyone knew of an app that was the same concept, just executed better. I just want to start out by saying the the RAZR is my first real smart phone, so I am a little new to this whole app scene and of course this forum. If I am posting this in the wrong place, I apologize. Additionally, if the Smart Actions is capable of anything Anyway, when I thought of Smart Actions, I was hoping it would be a little deeper that what it actually is. Here is what I was looking for... Application Specific Triggers - When I open the photo gallery or watch youtube I want the screen brightness to go up. When I play games I want WiFi, GPS, Bluetooth to turn off. Depending on the game, I might want to brighten/dim the display, etc, etc, etc. Basic logic - They already have AND in a sense and within a single Trigger you have OR logic, but you could consolidate a lot more with deeper OR logic, and you could create better rules with NOT logic. Prioritization - If my battery is under 20%, I want those rules to be prioritized above the rest. If I am playing a game, I want that rule to be prioritized above everything except for low battery life. That is all I can think of for now. Does anyone know of an app that already does these things? Does anyone else feel the same way about this?


text:
morpholio TracePro
Morpholio TracePro
Awarded as "Best App," Trace is the designers' and architects' dream software. Called "Digital Magic" by WIRED, "First-Ever" by COOL HUNTING and "Perfect" by ARCHITECT, Trace combines the beauty and speed of sketching with the intelligence and precision of CAD. Welcome to the future of design.
Trace Videos
Things You Can Do
Trace Stories
Want Trace for Business?
Yes...work better, save money & manage use. TracePro is now available for business purchasing with Apple's NEW Volume Purchase Program.
Get Trace for your office and sign up here.
See how Trace app and Apple Pencil help designers visualize their ideas in Apple's iOS Quick Tips podcast
Create Layered Drawings with Apple Pencil and the Morpholio Trace app
Imagine if you had access to all of your favorite drawing tools anywhere. With iPad Pro and Apple Pencil, it's easy for architects and creatives to sketch and share their ideas with the Morpholio Trace app from the app store. Launch podcast.
About iOS Quick Tips
Learn how to get the most from your iPhone and iPad at work with this collection of tips for business, featuring iOS shortcuts, and demonstrations of business friendly iPad and iPhone apps available in the App Store.
Trace Technologies
Drag'n'Fly allows users to literally put a live 3D model into their Trace sketches, create infinite views and then, automatically generate the perspective grids to draw over.
AR Perspective Finder
This new drawing tool lets users uncover virtual perspective grids, to scale, anywhere — making complex sketching easy and accessible. The scaling of the projected grids is revolutionary, and is only made possible by the power of iPad and ARKit to read and interpret the environment for you.
The ScalePen, a patent-pending technology that checks the drawing scale and zoom level continuously to automatically assign a calibrated set of technical pens. The result is simple but powerful - an array of perfect pen sizes that dynamically responds as you move around, through and into the drawing. It yields an enormous reduction in time for the designer, brings precision and clarity to line weight, and gives architects the ability to make beautiful sketches at multiple scales, within a single drawing, set of layers or layouts.
Stencil, Morpholio's new patent pending technology automatically turns any image you can find, make or take into a custom template in seconds. Simply find or capture a photo, set the contrast or invert, and transform it into a stencil that is forever at your disposal. Use any brush or color or combination of either to sketch over the stencil on top of any photo image or drawing. Lastly, you can add your own custom stencils to the array of premade figures, furniture, fixtures, entourage, landscape and graphic symbols that bring any sketch, floor plan, section drawing, or background image to life.


text:
This lesson introduces the TOSSIM simulator. You will become familiar with how to compile TOSSIM and use some of its functionality. You will learn how to:
- Compile TOSSIM.
- Configure a simulation in Python and C++.
- Inspect variables.
- Inject packets.
Note: This tutorial is for TOSSIM in TinyOS 2.0.1. If you are using TinyOS 2.0.0, it has a slightly different tutorial. The principal difference between the two is how you specify noise in RF simulation.
TOSSIM simulates entire TinyOS applications. It works by replacing components with simulation implementations. The level at which components are replaced is very flexible: for example, there is a simulation implementation of millisecond timers that replaces
HilTimerMilliC, while there is also an implementation for atmega128 platforms that replaces the HPL components of the hardware clocks. The former is general and can be used for any platform, but lacks the fidelity of capturing an actual chip's behavior, as the latter does. Similarly, TOSSIM can replace a packet-level communication component for packet-level simulation, or replace a low-level radio chip component for a more precise simulation of the code execution. TOSSIM is a discrete event simulator. When it runs, it pulls events of the event queue (sorted by time) and executes them. Depending on the level of simulation, simulation events can represent hardware interrupts or high-level system events (such as packet reception). Additionally, tasks are simulation events, so that posting a task causes it to run a short time (e.g., a few microseconds) in the future.
TOSSIM is a library: you must write a program that configures a simulation and runs it. TOSSIM supports two programming interfaces: Python and C++. Python allows you to interact with a running simulation dynamically, like a powerful debugger. However, since the interpretator can be a performance bottleneck when obtaining results, TOSSIM also has a C++ interface. Usually, transforming code from one to the other is very simple.
TOSSIM currently does not support gathering power measurements.
Compiling TOSSIM
TOSSIM is a TinyOS library. Its core code lives in
tos/lib/tossim. Every TinyOS source directory has an optional
sim subdirectory, which may contain simulation implementations of that package. For example,
tos/chips/atm128/timer/sim contains TOSSIM implementations of some of the Atmega128 timer abstractions.
To compile TOSSIM, you pass the
sim option to make:
$ cd apps/Blink $ make micaz sim
Currently, micaz is the only platform supported by TOSSIM. You should see output similar to this:
mkdir -p build/micaz placing object files in build/micaz writing XML schema to app.xml compiling BlinkAppC to object file sim.o ncc -c -fPIC -o build/micaz/sim.o -g -O0 -tossim -fnesc-nido-tosnodes=1000 -fnesc-simulate -fnesc-nido-motenumber=sim_node\(\) -finline-limit=100000 -Wall -Wshadow -DDEF_TOS_AM_GROUP=0x7d -Wnesc-all -target=micaz -fnesc-cfile=build/micaz/app.c -board=micasb -Wno-nesc-data-race BlinkAppC.nc -fnesc-dump=components -fnesc-dump=variables -fnesc-dump=constants -fnesc-dump=typedefs -fnesc-dump=interfacedefs -fnesc-dump=tags -fnesc-dumpfile=app.xml compiling Python support into pytossim.o and tossim.o g++ -c -shared -fPIC -o build/micaz/pytossim.o -g -O0 /home/pal/src/tinyos-2.x/tos/lib/tossim/tossim_wrap.cxx -I/usr/include/python2.3 -I/home/pal/src/tinyos-2.x/tos/lib/tossim -DHAVE_CONFIG_H g++ -c -shared -fPIC -o build/micaz/tossim.o -g -O0 /home/pal/src/tinyos-2.x/tos/lib/tossim/tossim.c -I/usr/include/python2.3 -I/home/pal/src/tinyos-2.x/tos/lib/tossim linking into shared object ./_TOSSIMmodule.so g++ -shared build/micaz/pytossim.o build/micaz/sim.o build/micaz/tossim.o -lstdc++ -o _TOSSIMmodule.so copying Python script interface TOSSIM.py from lib/tossim to local directory
Depending on what OS you are using and what packages are installed, TOSSIM may not properly compile on the first try. Appendix A addresses some of the common causes and gives possible solutions.
Several different tasks are perfomed by the
make micaz sim command. For details see Appendix B.
Running TOSSIM with Python
Go into the
RadioCountToLeds application and build TOSSIM:
$ cd tinyos-2.x/apps/RadioCountToLeds $ make micaz sim
We'll start with Python in interactive mode. To start the Python interpreter, type:
$ python
You should see a prompt like this:
Python 2.3.4 (#1, Nov 4 2004, 14:13:38) [GCC 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>
The version may be different, depending on your installation.
The first thing we need to do is import TOSSIM and create a TOSSIM object. Type:
>>> from TOSSIM import * >>> t = Tossim([])
The square brackets are an optional argument that lets you access variables in the simulation. We'll use those later. In this case, we're telling TOSSIM that we don't want to look at any variables. The way you run a TOSSIM simulation is with the
runNextEvent function. For example:
>>> t.runNextEvent() 0
When you tell TOSSIM to run the next event, it returns 0. This means that there was no next event to run. In our case, there's no next event because we haven't told any nodes to boot. This snippet of code will tell mote 32 to boot at time 45654 (in simulation ticks) and run its first event (booting):
>>> m = t.getNode(32) >>> m.bootAtTime(45654) >>> t.runNextEvent() 1
Segmentation faults: If trying to do this causes TOSSIM to throw a segmentation violation (segfault), then chances are you are using a version of gcc that does not work well with the dynamic linking that TOSSIM is doing. In particular, it has been verified to work properly with 4.0.2 and 3.6, but some people have encountered problems with gcc 4.1.1.
Instead of using raw simulation ticks, you can also use the call
ticksPerSecond(). However, you want to be careful to add some random bits into this number: having every node perfectly synchronized and only different in phase in terms of seconds can lead to strange results.
>>> m = t.getNode(32) >>> m.bootAtTime(4 * t.ticksPerSecond() + 242119) >>> t.runNextEvent() 1
runNextEvent returns 1, because there was an event to run. But we have no way of knowing whether the node has booted or not. We can find this out in one of two ways. The first is that we can just ask it:
>>> m.isOn() 1 >>> m.turnOff() >>> m.isOn() 0 >>> m.bootAtTime(560000) >>> t.runNextEvent() 0 >>> t.runNextEvent() 1
Note that the first
runNextEvent returned 0. This is because when we turned the mote off, there was still an event in the queue, for its next timer tick. However, since the mote was off when the event was handled in that call,
runNextEvent returned 0. The second call to
runNextEvent returned 1 for the second boot event, at time 560000.
If it still shows the mote is not on, some simple code will run events until it boots:
>>> while not m.isOn(): >>> t.runNextEvent()
A Tossim object has several useful functions. In Python, you can generally see the signature of an object with the
dir function. For example:
>>> t = Tossim([]) >>> dir(t) ['__class__', '__del__', '__delattr__', '__dict__', '__doc__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__swig_getmethods__', '__swig_setmethods__', '__weakref__', 'addChannel', 'currentNode', 'getNode', 'init', 'mac', 'newPacket', 'radio', 'removeChannel', 'runNextEvent', 'setCurrentNode', 'setTime', 'this', 'thisown', 'ticksPerSecond', 'time', 'timeStr']
Methods with double-underline, "_ _", in front and back, are, generally, internal functions that you probably will not use. For instance, __init__ is called internally during the creation of an object.
The most common utility functions are:
currentNode(): returns the ID of the current node.
getNode(id): returns an object representing a specific mote
runNextEvent(): run a simulation event
time(): return the current time in simulation ticks as a large integer
timeStr(): return a string representation of the current time
init(): initialize TOSSIM
mac(): return the object representing the media access layer
radio(): return the object representing the radio model
addChannel(ch, output): add output as an output to channel ch
removeChannel(ch, output): remove output as an output to channel ch
ticksPerSecond(): return how many simulation ticks there are in a simulated second
You've already used
ticksPerSecond() above. The next section discusses the previous two.
Debugging Statements
The second approach to know whether a node is on is to tell it to print something out when it boots. TOSSIM has a debugging output system, called
dbg. There are four
dbg calls:
dbg: print a debugging statement preceded by the node ID.
dbg_clear: print a debugging statement which is not preceded by the node ID. This allows you to easily print out complex data types, such as packets, without interspersing node IDs through the output.
dbgerror: print an error statement preceded by the node ID
dbgerror_clear: print an error statement which is not preceded by the node ID
Modify the
Boot.booted event in
RadioCountToLedsC to print out a debug message when it boots, such as this:
event void Boot.booted() { call Leds.led0On(); dbg("Boot", "Application booted.\n"); call AMControl.start(); }
dbg() takes two or more parameters. The first parameter ("Boot" in the above example) defines the output channel. An output channel is a string. The second and subsequent parameters are the message to output and variable formatting.
dbg() is identical to a sprintf statement in C++. For example,
RadioCountToLedsC has this call:
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) { dbg("RadioCountToLedsC", "Received packet of length %hhu.\n", len); ... }
which prints out the length of received packet as an 8-bit unsigned value (%hhu).
In order to print out the simulation time, you can use:
dbg("RadioCountToLedsC", "Time: %s\n", sim_time_string());
Once you have added the debugging statement to the event, recompile the application with
make micaz sim and start up your Python interpreter. Load the TOSSIM module and schedule a mote to boot as before:
>>> from TOSSIM import * >>> t = Tossim([]) >>> m = t.getNode(32) >>> m.bootAtTime(45654)
TOSSIM's debugging output can be configured on a per-channel basis. So, for example, you can tell TOSSIM to send the "Boot" channel to standard output, but another channel, "RadioCountToLedsC", to a file. By default, a channel has no destination and messages to it are discarded.
In this case, we want to send the Boot channel to standard output. To do this, we need to import the
sys Python package, which lets us refer to standard out. We can then tell TOSSIM to send Boot messages to this destination:
>>> import sys >>> t.addChannel("Boot", sys.stdout); 1
The return value shows that the channel was added successfully -- although no return value seems to also indicate the channel was successfully added. Run the first simulation event, and the mote boots:
>>> t.runNextEvent() DEBUG (32): Application booted. 1
If no message is shown, you may have to run events until that occurs:
>>> while not m.isOn(): >>> t.runNextEvent()
The only difference between debug and error functions is the string output at the beginning of a message. Debug statements print
DEBUG (n), while error statements print
ERROR (n).
A debugging statement can have multiple output channels. Each channel name is delimited by commas:
event void Boot.booted() { call Leds.led0On(); dbg("Boot,RadioCountToLedsC", "Application booted.\n"); call AMControl.start(); }
If a statement has multiple channels and those channels share outputs, then TOSSIM only prints the message once. For example, if both the Boot channel and RadioCountToLedsC channel were connected to standard out, TOSSIM will only print one message. For example, this series of debug statements
event void Boot.booted() { call Leds.led0On(); dbg("Boot,RadioCountToLedsC", "Application booted.\n"); dbg("RadioCountToLedsC", "Application booted again.\n"); dbg("Boot", "Application booted a third time.\n"); call AMControl.start(); }
when configured like this:
>>> import sys >>> t.addChannel("Boot", sys.stdout) >>> t.addChannel("RadioCountToLedsC", sys.stdout)
will print this, after the appropriate number of runNextEvent()'s:
DEBUG (32): Application booted. DEBUG (32): Application booted again. DEBUG (32): Application booted a third time.
A channel can have multiple outputs. For example, this script will tell TOSSIM to write
RadioCountToLedsC messages to standard output, but to write
Boot messages to both standard output and a file named
>>> import sys >>> f = open("log.txt", "w") >>> t.addChannel("Boot", f) >>> t.addChannel("Boot", sys.stdout) >>> t.addChannel("RadioCountToLedsC", sys.stdout)
There is no central list of all the debug channels used by code in TinyOS distribution. To debug an existing module or a block of code, first read the relevant code and look for
dbg() statements to find out all the debug channels that are used. Then use the method described in this section to look at the ouput of those debug statements.
Configuring a Network
When you start TOSSIM, no node can communicate with any other. In order to be able to simulate network behavior, you have to specify a network topology. Internally, TOSSIM is structured so that you can easily change the underlying radio simulation, but that's beyond the scope of this tutorial. The default TOSSIM radio model is signal-strength based. You provide a set of data to the simulator that describes the propagation strengths. You also specify noise floor, and receiver sensitivity. There are some very early results that describe current sensor platforms (e.g., the mica2) in these terms. Because all of this is through a scripting interface, rather than provide a specific radio model, TOSSIM tries to provide a few low-level primitives that can express a wide range of radios and behavior.
You control the radio simulation through a Python radio object:
>>> from TOSSIM import * >>> t = Tossim([]) >>> r = t.radio() >>> dir(r) ['__class__', '__del__', '__delattr__', '__dict__', '__doc__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__swig_getmethods__', '__swig_setmethods__', '__weakref__', 'add', 'connected', 'gain', 'remove', 'setNoise', 'this', 'thisown', ]
The important ones are at the end. They are:
add(src, dest, gain): Add a link from src to dest with gain. When src transmits, dest will receive a packet attenuated by the gain value.
connected(src, dest): Return whether there is a link from src to dest.
gain(src, dest): Return the gain value of the link from src to dest.
threshold(): Return the CCA threshold.
setThreshold(val): Set the CCA threshold value in dBm. The default is -72dBm.
The default values for TOSSIM's radio model are based on the CC2420 radio, used in the micaZ, telos family, and imote2. It uses an SNR curve derived from experimental data collected using two micaZ nodes, RF shielding, and a variable attenuator.
In addition to the radio propagation model above, TOSSIM also simulates the RF noise and interference a node hears, both from other nodes as well as outside sources. It uses the Closest Pattern Matching (CPM) algorithm. CPM takes a noise trace as input and generates a statistical model from it. This model can capture bursts of interference and other correlated phenomena, such that it greatly improves the quality of the RF simulation. It is not perfect (there are several things it does not handle, such as correlated interference at nodes that are close to one another), but it is much better than traditional, independent packet loss models. For more details, please refer to the paper "Improving Wireless Simulation through Noise Modeling," by Lee et al.
To configure CPM, you need to feed it a noise trace. You accomplish this by calling addNoiseTraceReading on a Mote object. Once you have fed the entire noise trace, you must call createNoiseModel on the node. The directory tos/lib/tossim/noise contains sample noise traces, which are a series of noise readings, one per line. For example, these are the first 10 lines of meyer-heavy.txt, which is a noise trace taken from Meyer Library at Stanford University:
-39 -98 -98 -98 -99 -98 -94 -98 -98 -98
If you look at the file, you can see the hardware noise floor is around -98 dBm, but there are spikes of interference around -86dBm and -87dBm.
This piece of code will give a node a noise model from a noise trace file. It works for nodes 0-6: you can change the range appropriately:
noise = open("meyer-heavy.txt", "r") lines = noise.readlines() for line in lines: str1 = line.strip() if str1: val = int(str1) for i in range(7): t.getNode(i).addNoiseTraceReading(val) for i in range(7): t.getNode(i).createNoiseModel()
CPM can use a good deal of RAM: using the entire Meyer-heavy trace as input has a cost of approximately 10MB per node. You can reduce this overhead by using a shorter trace; this will of course reduce simulation fidelity. The trace must be at least 100 entries long, or CPM will not work as it does not have enough data to generate a statistical model.
The Radio object only deals with physical-layer propagation. The MAC object deals with the data link layer, packet lengths, and radio bandwidth. The default TOSSIM MAC object is for a CSMA protocol. You get a reference to the MAC object by calling
mac() on a Tossim object:
>>> mac = t.mac()
The default MAC object has a large number of functions, for controlling backoff behavior, packet preamble length, radio bandwidth, etc. All time values are specified in terms of radio symbols, and you can configure the number of symbols per second and bits per symbol. By default, the MAC object is configured to act like the standard TinyOS 2.0 CC2420 stack: it has 4 bits per symbol and 64k symbols per second, for 256kbps. This is a subset of the MAC functions that could be useful for changing backoff behavior. Every accessor function has a corresponding set function that takes an integer as a parameter. E.g., there's
int initHigh() and
void setInitHigh(int val). The default value for each parameter is shown italicized in parentheses.
- initHigh: The upper bound of the initial backoff range. (400)
- initLow: The lower bound of the initial backoff range. (20)
- high: The upper bound of the backoff range. This is multiplied by the exponent base to the nth power, where n is the number of previous backoffs. So if the node had its initial backoff, then the upper bound is high * base, while if it is after the second backoff then the upper bound is high * base * base. (160)
- low: The lower bound of the backoff range. This is multiplied by the exponent base to the nth power, where n is the number of previous backoffs. So if the node had its initial backoff, then the upper bound is low * base, while if it is after the second backoff then the upper bound is low * base * base. (20)
- symbolsPerSec: The number of symbols per second that the radio can transmit. (65536)
- bitsPerSymbol: The number of bits per radio symbol. Multiplying this by the symbols per second gives the radio bandwidth. (4)
- preambleLength: How long a packet preamble is. This is added to the duration of transmission for every packet. (12)
- exponentBase: The base of the exponent used to calculate backoff. Setting it to 2 provides binary exponential backoff. (0).
- maxIterations: The maximum number of times the radio will back off before signaling failure, zero signifies forever. (0).
- minFreeSamples: The number of times the radio must detect a clear channel before it will transmit. This is important for protocols like 802.15.4, whose synchonrous acknowledgments requires that this be greater than 1 (you could have sampled in the dead time when the radios are changing between RX and TX mode). (2)
- rxtxDelay: The time it takes to change the radio from RX to TX mode (or vice versa).(32)
- ackTime: The time it takes to transmit a synchonrous acknowledgment, not including the requisite RX/TX transition.(34)
Any and all of these configuration constants can be changed at compile time with #define directives. Look at
Because the radio connectivity data can be stored in a flat file, you can easily create topologies in files and then load the file using a Python script and store them into the radio object. For example, this script will load a file which specifies each link in the graph as a line with three values, the source, the destination, and the gain, for example:
1 2 -54.0
means that when 1 transmits, 2 hears it at -54 dBm. Create a file
topo.txt that looks like this:
1 2 -54.0 2 1 -55.0 1 3 -60.0 3 1 -60.0 2 3 -64.0 3 2 -64.0
This script will read the file and store the data in the radio object:
>>> f = open("topo.txt", "r") >>> for line in f: ... s = line.split() ... if s: ... print " ", s[0], " ", s[1], " ", s[2]; ... r.add(int(s[0]), int(s[1]), float(s[2]))
Now, when a node transmits a packet, other nodes will hear it. This is a complete script for simulating packet transmission with RadioCountToLedsC. Save it as a file
#! /usr/bin/python from TOSSIM import * import sys t = Tossim([]) r = t.radio() f = open("topo.txt", "r") for line in f: s = line.split() if s: print " ", s[0], " ", s[1], " ", s[2]; r.add(int(s[0]), int(s[1]), float(s[2])) t.addChannel("RadioCountToLedsC", sys.stdout) t.addChannel("Boot", sys.stdout) noise = open("meyer-heavy.txt", "r") for line in noise: str1 = line.strip() if str1: val = int(str1) for i in range(1, 4): t.getNode(i).addNoiseTraceReading(val) for i in range(1, 4): print "Creating noise model for ",i; t.getNode(i).createNoiseModel() t.getNode(1).bootAtTime(100001); t.getNode(2).bootAtTime(800008); t.getNode(3).bootAtTime(1800009); for i in range(100): t.runNextEvent()
Run it by typing
python test.py. You should see output that looks like this:
1 2 -54.0 2 1 -55.0 1 3 -60.0 3 1 -60.0 2 3 -64.0 3 2 -64.0 DEBUG (1): Application booted. DEBUG (1): Application booted again. DEBUG (1): Application booted a third time. DEBUG (2): Application booted. DEBUG (2): Application booted again. DEBUG (2): Application booted a third time. DEBUG (3): Application booted. DEBUG (3): Application booted again. DEBUG (3): Application booted a third time. DEBUG (1): RadioCountToLedsC: timer fired, counter is 1. DEBUG (1): RadioCountToLedsC: packet sent. DEBUG (2): RadioCountToLedsC: timer fired, counter is 1. DEBUG (2): RadioCountToLedsC: packet sent. DEBUG (3): RadioCountToLedsC: timer fired, counter is 1. DEBUG (3): RadioCountToLedsC: packet sent. DEBUG (1): Received packet of length 2. DEBUG (3): Received packet of length 2. DEBUG (2): Received packet of length 2. DEBUG (1): RadioCountToLedsC: timer fired, counter is 2. DEBUG (1): RadioCountToLedsC: packet sent. DEBUG (2): RadioCountToLedsC: timer fired, counter is 2. DEBUG (2): RadioCountToLedsC: packet sent. DEBUG (3): RadioCountToLedsC: timer fired, counter is 2. DEBUG (3): RadioCountToLedsC: packet sent. DEBUG (1): Received packet of length 2.
If you set node's clear channel assessment to be at -110dBm, then nodes will never transmit, as noise and interference never drop this low. You'll see something like this:
1 2 -54.0 2 1 -55.0 1 3 -60.0 3 1 -60.0 2 3 -64.0 3 2 -64.0 DEBUG (1): Application booted. DEBUG (1): Application booted again. DEBUG (1): Application booted a third time. DEBUG (2): Application booted. DEBUG (2): Application booted again. DEBUG (2): Application booted a third time. DEBUG (3): Application booted. DEBUG (3): Application booted again. DEBUG (3): Application booted a third time. DEBUG (1): RadioCountToLedsC: timer fired, counter is 1. DEBUG (1): RadioCountToLedsC: packet sent. DEBUG (2): RadioCountToLedsC: timer fired, counter is 1. DEBUG (2): RadioCountToLedsC: packet sent. DEBUG (3): RadioCountToLedsC: timer fired, counter is 1. DEBUG (3): RadioCountToLedsC: packet sent. DEBUG (1): RadioCountToLedsC: timer fired, counter is 2. DEBUG (2): RadioCountToLedsC: timer fired, counter is 2. DEBUG (3): RadioCountToLedsC: timer fired, counter is 2.
Because the nodes backoff perpetually, they never transmit the packet, and so subsequent attempts to send fail. Although it only takes a few simulation events to reach the first timer firings, it takes many simulation events (approximately 4000) to reach the second timer firings. This is because the nodes have MAC backoff events. If you want to simulate in terms of time, rather than events, you can always do something like this, which simulates 5 seconds from the first node boot:
t.runNextEvent(); time = t.time() while time + 50000000000 > t.time(): t.runNextEvent()
TOSSIM allows you to specify a network topology in terms of gain. However, this raises the problem of coming up with a topology. There are two approaches you can take. The first is to take data from a real world network and input this into TOSSIM. The second is to generate it from applying a theoretical propagation model to a physical layout. The standard file format is:
gain src dest g
where each statement is on a separate line. The gain statement defines a propagation gain g when src transmits to dest. This is a snippet of Python code that will parse this file format:
f = open("15-15-tight-mica2-grid.txt", "r") for line in f: s = line.split() if (len(s) > 0): if (s[0] == "gain"): r.add(int(s[1]), int(s[2]), float(s[3]))
TOSSIM has a tool for the second option of generating a network topology using a theoretical propagation model. The tool is written in Java and is
net.tinyos.sim.LinkLayerModel. The tool takes a single command line parameter, the name of a configuration file, e.g.:
java net.tinyos.sim.LinkLayerModel config.txt
The format of a configuration file is beyond the scope of this document: the tool has its own documentation. TOSSIM has a few sample configuration files generated from the tool in
tos/lib/tossim/topologies. Note that the tool uses random numbers, these configuration files can generate multiple different network topologies. Network topology files generated from the tool follow the same format as
15-15-tight-mica2-grid.txt. If you have topologies measured from real networks, we would love to include them in the TOSSIM distribution.
TOSSIM allows you to inspect variables in a running TinyOS program. Currently, you can only inspect basic types. For example, you can't look at fields of structs, but you can look at state variables.
When you compile TOSSIM, the make system generates a large XML file that contains a lot of information about the TinyOS program, including every component variable and its type. If you want to examine the state of your program, then you need to give TOSSIM this information so it can parse all of the variables properly. You do this by instantiating a Python object that parses the XML file to extract all of the relevant information. You have to import the Python support package for TOSSIM to do this. First, set your PYTHONPATH environment variable to point to tinyos-2.x/support/sdk/python. This tells Python where to find the TOSSIM packages. Then, in an interpreter type this:
from tinyos.tossim.TossimApp import * n = NescApp()
Instantiating a
NescApp can take quite a while: Python has to parse through megabytes of XML. So be patient (you only have to do it once). NescApp has two optional arguments. The first is the name of the application being loaded. The second is the XML file to load. The default for the latter is
app.xml, which is the name of the file that the make system generates. The default for the former is "Unknown App." So this code behaves identically to that above:
from tinyos.tossim.TossimApp import * n = NescApp("Unknown App", "app.xml")
You fetch a list of variables from a NescApp object by calling the function
variables on the field
vars = n.variables.variables()
To enable variable inspection, you pass this list to a Tossim object when you instantiate it:
t = Tossim(vars)
The TOSSIM object now knows the names, sizes, and types of all of the variables in the TinyOS application. This information allows the TOSSIM support code to take C variables and properly tranform them into Python variables. This currently only works for simple types: if a component declares a structure, you can't access its fields. But let's say we want to read the counter in
RadioCountToLedsC. Since each mote in the network has its own instance of the variable, we need to fetch it from a specific mote:
m = t.getNode(0) v = m.getVariable("RadioCountToLedsC.counter")
The name of a variable is usually C.V, where C is the component name and V is the variable. In the case of generic components, the name is C.N.V, where N is an integer that describes which instance. Unfortunately, there is currently no easy way to know what N is from nesC source, so you have to root through
app.c in order to know.
Once you have a variable object (
v in the above code), you can fetch its value with the
getData() function:
counter = v.getData()
getData() transforms the underlying C type into a Python type, you can then use its return value in Python expressions. For example, this script will start a simulation of five nodes (actually four nodes since range(0,4) yields values 0 through 3) and run it until node 0's counter reaches 10:
from sys import * from random import * from TOSSIM import * from tinyos.tossim.TossimApp import * n = NescApp() t = Tossim(n.variables.variables()) r = t.radio() f = open("topo.txt", "r") for line in f: s = line.split() if (len(s) > 0): if (s[0] == "gain"): r.add(int(s[1]), int(s[2]), float(s[3])) noise = open("meyer-heavy.txt", "r") for line in noise: s = line.strip() if s: val = int(s) for i in range(4): t.getNode(i).addNoiseTraceReading(val) for i in range (4): t.getNode(i).createNoiseModel() t.getNode(i).bootAtTime(i * 2351217 + 23542399) m = t.getNode(0) v = m.getVariable("RadioCountToLedsC.counter") while v.getData() < 10: t.runNextEvent() print "Counter variable at node 0 reached 10."
Remember to change
topo.txt in a suitable manner: since we are now considering nodes from 0 to 4, we have to specify a proper topology for the network, such as:
0 2 -66.0 2 0 -67.0 1 2 -54.0 2 1 -55.0 1 3 -60.0 3 1 -60.0 2 3 -64.0 3 2 -64.0
The TOSSIM examples subdirectory also has an example script, named
Injecting Packets
TOSSIM allows you to dynamically inject packets into a network (if serial packets are intended, refer to TOSSIM Live). Packets can be scheduled to arrive at any time. If a packet is scheduled to arrive in the past, then it arrives immediately. Injected packets circumvent the radio stack: it is possible for a node to receive an injected packet while it is in the midst of receiving a packet from another node over its radio.
TinyOS 2.0 has support for building Python packet objects. Just like the standard Java toolchain, you can build a packet class based on a C structure. The packet class gives you a full set of packet field mutators and accessors. If an application has a packet format, you can generate a packet class for it, instantiate packet objects, set their fields, and have nodes receive them.
RadioCountToLeds application Makefile has an example of how to do this. First, it adds the Python class as a dependency for building the application. Whenever you compile the app, if the Python class doesn't exist, make will build it for you:
BUILD_EXTRA_DEPS = RadioCountMsg.py RadioCountMsg.class
The Makefile also tells make how to generate RadioCountMsg.py:
RadioCountMsg.py: RadioCountToLeds.h mig python -target=$(PLATFORM) $(CFLAGS) -python-classname=RadioCountMsg RadioCountToLeds.h RadioCountMsg -o $@
The rule says to generate RadioCountMsg.py by calling mig with the python parameter. The Makefile also has rules on how to build Java class, but that's not important for TOSSIM. Since we've been using RadioCountToLeds so far, the Python class should be there already.
RadioCountMsg.py defines a packet format, but this packet is contained in the data payload of another format. If a node is sending a
RadioCountMsg over AM, then the
RadioCountMsg structure is put into the AM payload, and might look something like this:
|AM Header
|AM Footer
If it is sending it over a routing protocol. the packet is put in the routing payload, and might look something like this:
|AM Header
|Routing Header
|AM Footer
If you want to send a
RadioCountMsg to a node, then you need to decide how to deliver it. In the simple AM case, you place the
RadioCountMsg structure in a basic AM packet. In the routing case, you put it in a routing packet, which you then put inside an AM packet. We'll only deal with the simple AM case here.
To get an AM packet which you can inject into TOSSIM, you call the
newPacket function on a Tossim object. The returned object has the standard expected AM fields: destination, length, type, and data, as well as strength.
To include support for a packet format, you must import it. For example, to include
RadioCountMsg, you have to import it:
from RadioCountMsg import *
This snippet of code, for example, creates a
RadioCountMsg, sets its counter to 7, creates an AM packet, stores the
RadioCountMsg in the AM packet, and configures the AM packet so it will be received properly (destination and type):
from RadioCountMsg import * msg = RadioCountMsg() msg.set_counter(7) pkt = t.newPacket() pkt.setData(msg.data) pkt.setType(msg.get_amType()) pkt.setDestination(0)
The variable
pkt is now an Active Message of the AM type of
RadioCountMsg with a destination of 0 that contains a
RadioCountMsg with a counter of 7. You can deliver this packet to a node with the
deliver function. The
deliver function takes two parameters, the destination node and the time to deliver:
pkt.deliver(0, t.time() + 3)
This call delivers pkt to node 0 at the current simulation time plus 3 ticks (e.g., 3ns). There is also a
deliverNow, which has no time parameter. Note that if the destination of
pkt had been set to 1, then the TinyOS application would not receive the packet, as it was delivered to node 0.
Taken all together, the following script starts a simulation, configures the topology based on topo.txt, and delivers a packet to node 0. It can also be found as
packets.py in the TOSSIM examples subdirectory.
#! /usr/bin/python import sys from TOSSIM import * from RadioCountMsg import * t = Tossim([]) m = t.mac() r = t.radio() t.addChannel("RadioCountToLedsC", sys.stdout) t.addChannel("LedsC", sys.stdout) for i in range(0, 2): m = t.getNode(i) m.bootAtTime((31 + t.ticksPerSecond() / 10) * i + 1) f = open("topo.txt", "r") for line in f: s = line.split() if s: if s[0] == "gain": r.add(int(s[1]), int(s[2]), float(s[3])) noise = open("meyer-heavy.txt", "r") for line in noise: s = line.strip() if s: val = int(s) for i in range(4): t.getNode(i).addNoiseTraceReading(val) for i in range(4): t.getNode(i).createNoiseModel() for i in range(60): t.runNextEvent() msg = RadioCountMsg() msg.set_counter(7) pkt = t.newPacket() pkt.setData(msg.data) pkt.setType(msg.get_amType()) pkt.setDestination(0) print "Delivering " + str(msg) + " to 0 at " + str(t.time() + 3); pkt.deliver(0, t.time() + 3) for i in range(20): t.runNextEvent()
Python is very useful because it is succinct, easy to write, and can be used interactively. Interpretation, however, has a significant cost: a Python/C transition on every event is a significant cost (around 100%, so it runs at half the speed). Additionally, it's often useful to step through code with a standard debugger. TOSSIM also has support for C++, so that it can be useful in these circumstances. Because many of the Python interfaces are merely wrappers around C++ objects, much of the scripting stays the same. The two major exceptions are inspecting variables and injecting packets.
In a C++ TOSSIM, there is no variable inspection. While it is possible to request memory regions and cast them to the expected structures, currently there is no good and simple way to do so. The Python support goes through several steps in order to convert variables into Python types, and this gets in the way of C++. However, as the purpose of C++ is usually to run high performance simulations (in which inspecting variables is a big cost) or debugging (when you have a debugger), this generally isn't a big problem.
There is a C++
Packet class, which the Python version is a simple wrapper around. In order to inject packets in C++, however, you must build C support for a packet type and manually build the packet. There currently is no support in mig with which to generate C/C++ packet structures, and since most packets are nx_struct types, they cannot be parsed by C/C++. Furthermore, as many of the fields are nx types, they are big endian, while x86 processors are little endian. Still, if you want to deliver a packet through C++, you can do so.
Usually, the C++ and Python versions of a program look pretty similar. For example (note that this program will use a lot of RAM and take a long time to start due to its noise models):
import TOSSIM import sys import random from RadioCountMsg import * t = TOSSIM.Tossim([]) r = t.radio() for i in range(999): m = t.getNode(i) m.bootAtTime(5000003 * i + 1) for j in range(2): if j != i: r.add(i, j, -50.0) # Create random noise stream for j in range (500): m.addNoiseTraceReading(int(random.random() * 20) - 70) m.createNoiseModel() for i in xrange(1000000): t.runNextEvent()
#include <tossim.h> #include <stdlib.h> int main() { Tossim* t = new Tossim(NULL); Radio* r = t->radio(); for (int i = 0; i < 999; i++) { Mote* m = t->getNode(i); m->bootAtTime(5000003 * i + 1); for (int j = 0; j < 2; j++) { if (i != j) { r->add(i, j, -50.0); } } for (int j = 0; j < 500; j++) { m->addNoiseTraceReading((char)(drand48() * 20) - 70); } m->createNoiseModel(); } for (int i = 0; i < 1000000; i++) { t->runNextEvent(); } }
To compile a C++ TOSSIM, you have to compile the top-level driver program (e.g, the one shown above) and link it against TOSSIM. Usually the easiest way to do this is to link it against the TOSSIM objects rather than the shared library. Often, it's useful to have a separate Makefile to do this with. E.g.,
all: make micaz sim g++ -g -c -o Driver.o Driver.c -I../../tos/lib/tossim/ g++ -o Driver Driver.o simbuild/micaz/tossim.o simbuild/micaz/sim.o simbuild/micaz/c-support.o
Using gdb
Since Driver is a C++ program, you can use gdb on it to step through your TinyOS code, inspect variables, set breakpoints, and do everything else you can normally do. Unfortunately, as gdb is designed for C and not nesC, the component model of nesC means that a single command can have multiple providers; referring to a specific command requires specifying the component, interface, and command. For example, to break on entry to the redOff command of the Leds interface of LedsC, one must type:
$ gdb Driver GNU gdb Red Hat Linux (6.0post-0.20040223.19rh) Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1". (gdb) break *LedsP$Leds$led0Toggle Breakpoint 1 at 0x804f184: file LedsP.nc, line 73.
nesC translates component names to C names using $. $ is a legal but almost-never-used character in some versions of C, so nesC prohibits it and uses it internally. The leading * is necessary so dbg can parse the $s. With the above breakpoint set, gdb will break whenever a mote toggles led0.
Variables have similar names. For example, to inspect the packet of RadioCountToLedsC in the RadioCountToLeds application,
(gdb) print RadioCountToLedsC$packet $1 = {{header = {{data = ""}, {data = ""}, {data = ""}, {data = ""}, { data = ""}}, data = {{data = ""} }, footer = {{ data = ""}, {data = ""}}, metadata = {{data = ""}, {data = ""}, { data = ""}, {data = ""}, {data = ""}}} }
For those who know gdb very well, you'll recognize this as a print of an array, rather than a single variable: there are more than 1000 instances of the message_t struct. This is because TOSSIM simulates many motes; rather than there being a single RadioCountToLedsC$packet, there is one for every node. To print the packet of a specific node, you have to index into the array. This, for example, will print the variable for node 6:
(gdb) print RadioCountToLedsC$packet[6] $2 = {header = {{data = ""}, {data = ""}, {data = ""}, {data = ""}, { data = ""}}, data = {{data = ""} }, footer = {{ data = ""}, {data = ""}}, metadata = {{data = ""}, {data = ""}, { data = ""}, {data = ""}, {data = ""}}}
If you want to print out the variable for the node TOSSIM is currently simulating, you can do this:
(gdb) print RadioCountToLedsC$counter[sim_node()] $4 = 0
You can also set watchpoints (although, as to be expected, they are slow:
(gdb) watch CpmModelC$receiving[23] Hardware watchpoint 2: CpmModelC$receiving[23]
This variable happens to be an internal variable in the packet-level network simulation, which keeps track of whether the radio thinks it is receiving a packet. So setting the above watchpoint will cause gdb to break whenever node 23 starts receiving a packet or returns to searching for packet preambles.
Generic components add another wrinkle. Since they use a code-copying approach, each instance of a generic has its own separate functions and variables (this is mostly due to the fact that you can pass types to them). Take, for example,
AMQueueImplP, which is used in both the radio AM stack and the serial AM stack. If you use gdb on an application that uses both serial and radio communication and try to break on its Send.send, you'll see an error:
(gdb) break *AMQueueImplP$Send$send No symbol "AMQueueImplP$Send$send" in current context.
nesC gives each generic a unique number. So if you have an application in which there is a single copy of AMQueueImplP, its name will actually be AMQueueImplP$0. For example, in RadioCountToLeds, this will work:
(gdb) break *AMQueueImplP$0$Send$send Breakpoint 5 at 0x8051b29: file AMQueueImplP.nc, line 79.
If you have multiple instances of a generic in a program, there is unfortunately no easy way to figure out each one's name besides looking at the source code or stepping into them. E.g., if you application uses serial and radio communication, knowing which stack has AMQueueImpl$0 and which has AMQueueImplP$1 requires either stepping through their send operation or looking at their
app.c files.
This lesson introduced the basics of the TOSSIM simulator. It showed you how to configure a network, how to run a simulation, how to inspect variables, how to inject packets, and how to compile with C++.
< Previous Lesson | Top | Next Lesson >
Appendix A: Troubleshooting TOSSIM compilation
TOSSIM is a C/C++ shared library with an optional Python translation layer. Almost all of the problems encountered in compiling TOSSIM are due to C linking issues. If you don't know what a linker is (or have never linked a C program), then chances are the rest of this appendix is going to be cryptic and incomprehensible. You're best off starting with learning about linkers, why they are needed, and how you use the gcc/g++ compilers to link code.
Generally, when compiling TOSSIM using make micaz sim, one of four things can go wrong:
- You are using Cygwin but the sim compilation option can't figure this out.
- You do not have the needed Python support installed.
- You have Python support installed, but the make system can't find it.
- You have Python support installed, but it turns out to be incompatible with TOSSIM.
- You have a variant of gcc/g++ installed that expects slightly different compilation options than the normal installation.
We'll visit each in turn.
You are using Cygwin but the sim compilation option can't figure this out
It turns out that the Cygwin and Linux versions of gcc/g++ have different command-line flags and require different options to compile TOSSIM properly. For example, telling the Linux compiler to build a library requires -fPIC while the Cygwin is -fpic. If you're using Cygwin and you see the output look like this:
ncc -c -shared -fPIC -o build/micaz/sim.o ...
rather than
ncc -c -DUSE_DL_IMPORT -fpic -o build/micaz/sim.o ...
then you have encountered this problem. The problem occurs because Cygwin installations do not have a consistent naming scheme, and so it's difficult for the compilation toolchain to always figure out whether it's under Linux or Cygwin.
Symptom: You're running cygwin but you see the -fPIC rather than -fpic option being passed to the compiler.
Solution: Explicitly set the OSTYPE environment variable to be cygwin either in your .bashrc or when you compile. For example, in bash:
$ OSTYPE=cygwin make micaz sim
or in tcsh
$ setenv OSTYPE cygwin $ make micaz sim
Note that often this problem occurs in addition to other ones, due to using a nonstandard Cygwin installation. So you might have more problems to track down.
You do not have the needed Python support installed
If when you compile you see lots of errors such as "undefined reference to" or "Python.h: No such file or directory" then this might be your problem. It is a subcase of the more general problem of TOSSIM not being able to find needed libraries and files.
Compiling Python scripting support requires that you have certain Python development libraries installed. First, check that you have Python installed:
$ python -V Python 2.4.2
In the above example, the system has Python 2.4.2. If you see "command not found" then you do not have Python installed. You'll need to track down an RPM and install it. TOSSIM has been tested with Python versions 2.3 and 2.4. You can install other versions, but there's no assurance things will work.
In addition to the Python interpreter itself, you need the libraries and files for Python development. This is essentially a set of header files and shared libraries. If you have the locate command, you can type locate libpython, or if you don't, you can look in /lib, /usr/lib and /usr/local/lib. You're looking for a file with a name such as libpython2.4.so and a file named Python.h. If you can't find these files, then you need to install a python-devel package.
Symptom: Compilation can't find critical files such as the Python interpreter, Python.h or a Python shared library, and searching your filesystem shows that you don't have them.
Solution: Installed the needed files from Python and/or Python development RPMS.
If you have all of the needed files, but are still getting errors such as "undefined reference" or "Python.h: No such file or directory", then you have the next problem: they're on your filesystem, but TOSSIM can't find them.
You have Python support installed, but the make system can't find it
You've found libpython and Python.h, but when TOSSIM compiles it says that it can't find one or both of them. If it can't find Python.h then compilation will fail pretty early, as g++ won't be able to compile the Python glue code. If it can't find the python library, then compilation will fail at linking, and you'll see errors along the lines of "undefined reference to __Py...". You need to point the make system at the right place.
Open up support/make/sim.extra. If the make system can't find Python.h, then chances are it isn't in one of the standard places (e.g., /usr/include). You need to tell the make system to look in the directory where Python.h is with a -I option. At the top of sim.extra, under the PFLAGS entry, add
CFLAGS += -I/path
where /path is the path of the directory where Python.h lives. For example, if it is in /opt/python/include, then add CFLAGS += -I/opt/python/include.
If the make system can't find the python library for linking (causing "undefined reference") error messages, then you need to make sure the make system can find it. The sim.extra file uses two variables to find the library: PYDIR and PYTHON_VERSION. It looks for a file named libpython$(PYTHON_VERSION).so. So if you have Python 2.4 installed, make sure that PYTHON_VERSION is 2.4 (be sure to use no spaces!) and if 2.3, make sure it is 2.3.
Usually the Python library is found in /usr/lib. If it isn't there, then you will need to modify the PLATFORM_LIB_FLAGS variable. The -L flag tells gcc in what directories to look for libraries. So if libpython2.4.so is in /opt/python/lib, then add -L/opt/python/lib to the PLATFORM_LIB_FLAGS. Note that there are three different versions of this variable, depending on what OS you're using. Be sure to modify the correct one (or be paranoid and modify all three).
Symptom: You've verified that you have the needed Python files and libraries, but compilation is still saying that it can't link to them ("undefined reference") or can't find them ("cannot find -lpython2.4").
Solution: Change the sim.extra file to point to the correct directories using -L and -I flags.
You have Python support installed, but it turns out to be incompatible with TOSSIM.
Symptom: You see a "This python version requires to use swig with the -classic option" error message.
Symptom: You see a long string of compilation errors relating to SWIG and Python, e.g.:
/opt/tinyos-2.1.1/tos/lib/tossim/tossim_wrap.cxx: In function 'void SWIG_Python_AddErrorMsg(const char*)': /opt/tinyos-2.1.1/tos/lib/tossim/tossim_wrap.cxx:880: warning: format not a string literal and no format arguments
Solution: Install SWIG and regenerate Python support with the sing-generate script in tos/lib/tossim, or install a different version of Python.
You have a variant of gcc/g++ installed that expects slightly different compilation options than the normal installation.
Symptom: g++ complains that it cannot find main() when you are compiling the shared library ("undefined reference to `_WinMain@16'").
Solution: There are two possible solutions. The first is to include a dummy main(), as described in this tinyos-help posting. The second is to add the -shared option, as described in this web page.
Hopefully, these solutions worked and you can get back to compiling, If not, then you should email tinyos-help.
You have an Import error when you use TossimApp.
Symptom: when you used the package tinyos.tossim.TossimApp in your simulation you have the error:
ImportError: No module named tinyos.tossim.TossimApp
Solution: type the command:
export PYTHONPATH=$PYTHONPATH:$TOSROOT/support/sdk/python
Appendix B: TOSSIM Compilation Steps
The make system for TOSSIM performs five basic steps:
- Writing an XML Schema,
- Compiling the TinyOS Application,
- Compiling the Programming Interface,
- Building the Shared Object, and
- Copying Python Support.
Let's go through them one by one.
Writing an XML Schema
writing XML schema to app.xml
The first thing the TOSSIM build process does is use nesc-dump to produce an XML document that describes the application. Among other things, this document descibes the name and type of every variable.
Compiling the TinyOS Application
Besides introducing all of these new compilation steps, the
sim option changes the include paths of the application. If the application has a series of includes:
-Ia -Ib -Ic
Then the sim option transforms the list to:
-Ia/sim -Ib/sim -Ic/sim -I%T/lib/tossim -Ia -Ib -Ic
This means that any system-specific simulation implementations will be used first, followed by generic TOSSIM implementations, followed by standard implementations. The
sim option also passes a bunch of arguments to the compiler, so it knows to compile for simulation.
The product of this step is an object file,
sim.o, which lives in the platform's build directory. This object file has a set of C functions which configure the simulation and control execution.
Compiling the Programming Interface
compiling Python support into pytossim.o and tossim.o g++ -c -shared -fPIC -o build/micaz/pytossim.o -g -O0 \ /home/pal/src/tinyos-2.x/tos/lib/tossim/tossim_wrap.cxx \ -I/usr/include/python2.3 -I/home/pal/src/tinyos-2.x/tos/lib/tossim \ -DHAVE_CONFIG_H g++ -c -shared -fPIC -o build/micaz/tossim.o -g -O0 \ /home/pal/src/tinyos-2.x/tos/lib/tossim/tossim.c \ -I/usr/include/python2.3 -I/home/pal/src/tinyos-2.x/tos/lib/tossim
The next step compiles support for the C++ and Python programming interfaces. The Python interface is actually built on top of the C++ interface. Calling a Python object calls a C++ object, which then calls TOSSIM through the C interface.
tossim.o contains the C++ code, while
pytossim.o contains the Python support. These files have to be compiled separately because C++ doesn't understand nesC, and nesC doesn't understand C++.
linking into shared object ./_TOSSIMmodule.so g++ -shared build/micaz/pytossim.o build/micaz/sim.o build/micaz/tossim.o -lstdc++ -o _TOSSIMmodule.so
The next to last step is to build a shared library that contains the TOSSIM code, the C++ support, and the Python support. If you are using tinyos-2.1.0 in Ubuntu, install python2.5-dev to avoid error while linking into shared object
Copying Python Support
copying Python script interface TOSSIM.py from lib/tossim to local directory
Finally, there is the Python code that calls into the shared object. This code exists in
lib/tossim, and the make process copies it into the local directory.
< Previous Lesson | Top | Next Lesson >


text:
Sunday, June 5, 2011
We have BROOD! All four colonies get two thumbs up!
Since it had been a few weeks since I hived my swarm colony, I figured it was a great time to do a first inspection and check all the hives for brood production while I was at it.
First up, in the blue hive, the Danville swarm. This is one gentle hive of bees which I believe are Italian. In eighteen days, the bees had already drawn several frames (with a sprinkling of some bur comb too). As you can see, on this frame, they mixed new capped brood in with honey at the top. On the other side it was mostly brood. This has been one busy colony in the time they've been here, and I think I should be able to add a second deep box and frames pretty soon.
Next up, the colony from Dadant inhabits the yellow hive. I did add a second deep to this since they had drawn around seven frames of comb. As you can see, these caps are a little older and the hive is full of it, plus they're storing honey at the top of some of them. The queen in this colony is really good, Italian stock, and she went to work as soon as she was released and had a place to lay. This colony is increasing in numbers thanks to her majesty's hard work. They're a very gentle colony too.
Here is the green hive, one of the existing Carniolan colonies which was a split from last year. A couple of inspections back, in April, this hive was full of swarm cells and no eggs - which can indicate the preparations for swarming. Then a few weeks ago during a brief inspection, there were no eggs in either deep, but the swarm cells were disappearing and I could not find the marked queen. I also noticed it seemed the population was less than before, so that led me to believe this hive had already swarmed. But here's what I found on Friday. This hive is full of eggs, larvae and capped brood, so now I believe that a new queen is ruling this colony. This colony hardly required smoking so they're very gentle. I can't wait to see what these bees look like once they start hatching.
Last but not least, here is the orange hive which is another of Carniolan stock. As you can see, here is another fine example of a lot of brood. Back in April when I did a deep inspection of this hive, I could not find the marked queen, and that was after three intense inspections of all twenty frames. This colony had swarm and supersedure cells all over, a few of them opened at the bottoms, and I found a couple of new queens walking the frames. After giving it a couple of weeks, I opened this hive and found new eggs everywhere, so I knew one of the new queens had successfully returned from her mating flights. This Friday's inspection also indicated that most of the swarm cells had been torn down from the sides. I'm led to believe that this colony superseded the queen since the population doesn't seem to be much different than it was when the marked queen was here. I'm also interested to see what these bees will look like. And this colony was a gentle as lambs too.
After inspecting everything, I added a hive-top feeder to the blue hive, a second deep chamber and syrup for the yellow hive, then closed it all up. The orange hive will have a super of honey ready soon, and that may be all I get this year. While I haven't gotten a lot of honey from my bees, the peace I get from working with them is my satisfaction. Plus hearing the remarks from my neighbors that their gardens are doing the best ever since I brought bees here (and them giving me some of their surplus too) is a big payoff. In their own way, the bees are helping the neighbors and me too. I'm happy with that!
Until next time, fellow beekeepers!
6 comments:
Glad you are happy with your bees and your garden - it's the simple things... I put this blog on my facebook page. sharing also makes me happyReplyDelete
It's been a good year beewise indeed. Your apiary looks great. June is a big swarm month. Are you ready to add more captured colonies to the yard?ReplyDelete
congrats on the booming start to your bee season! love seeing the photos of the comb.ReplyDelete
Are you feeding all your bees? I fed my nucs until they'd finished the two brood chambers, but stopped feeding a couple of weeks ago. Should I still be feeding them?ReplyDelete
Great job bees! You must be treating those ladies well.ReplyDelete
- AnonymousJune 10, 2011 at 10:29 PM
To Georgie, The Luddite, and to Jess at The Beneficial Bee: Thanks ladies! I love seeing great frames of brood, and it look like the ladies are doing rather well!ReplyDelete
Hemlock: Thanks buddy! I do have one deep hive chamber, some bottom boards, and lots of frames. The good thing is, I can make a short trip to Dadant to get more stuff. Matter of fact, I think I need to make a trip this coming week.
Sweetie Queen Elbi: I am only feeding the two new colonies to help them make comb, that's all. The other two colonies are doing well finding nectar and pollen on their own. If your bees have drawn comb and they have enough food sources in nature, I think it would be fine to stop feeding them. Good luck!
Thanks for visiting Mark's Bees. Feel free to leave your thoughts and ideas on my posts. I'm always open for ideas from other beekeepers.
All comments are moderated to eliminate spam so that's why they may not appear instantly.
Thanks again and please visit often!


text:
Revised: 07-10-2013
Limited authorization (LA) dental hygienists must be employed or retained by one of the following MHCP-enrolled groups:
Individual LA dental hygienists are not eligible for direct MHCP reimbursement.
Individual LA dental hygienists must enroll with a group affiliation to receive reimbursement at the group level for all dental hygiene services rendered to MHCP enrollees. As part of this process, MHCP requires individual NPIs and affiliation with one or more of these enrolled group providers.
For LA dental hygienists providing services to enrollees in a managed care organization (MCO), contact the MCO for enrollment requirements and coverage.
LA dental hygienists must be licensed by the Minnesota Board of Dentistry and have a collaborative agreement registered with the Board of Dentistry.
LA dental hygienists must complete, sign and fax the following forms to MHCP Provider Enrollment at (651) 431-7462:
MHCP will notify applicants of the enrollment status within 30 days of receiving the completed and signed documents.
MHCP reimburses for covered dental services within the scope of practice of the LA hygienist as identified in Minnesota Statute 150A.10 Subd. 1a.
Bill all services completed in a limited authorization capacity using the following:
Minnesota Statutes 150A.10 subd. 1a Limited authorization for dental hygienists


text:
Ben is admin of CMF Ads and a very nice person. Some members of CMF Ads use Injader. Check out the forums if you are interested, or visit the Injader site.
Tell him CyberCelt sent you!
Internet advertising, blog marketing, writing for success, online promotion, graphic design and comic relief.
Thank you for the link! :)
that's very nice
Thanks for the information. These ads are nice and affordable.Let me try this and will suggest my blogger friends to try this.
Good ads here! The effectiveness of the ad has been left unchained and that puts the ad to 'speak' for itself !
Thanks for the link, I'll definately check it out.
Thanks for the link, i will definitely check
thank you so much for the link..it's an useful one ;)


text:
Marcus Wainwright and David Neville founded rag & bone with the aim to 'create beautifully constructed clothes' of the highest quality. Originally a menswear line, the label has won awards and A-list fans for their slouchy knits, cool shoes and understated blouses.
Ankle boots
Solid color
Round toe
Block heel
Zip fastening along back
Leather lining
Leather sole


text:
Probability density function
The probability density function of a continuous random variable is the function that provides the likelihood that the variable will have a value in a given interval when the function is integrated over that same interval. Stated another way, a probability density function f is a non-negative valued real function whose value is the probability density of the variable that it is a function of. Since it is a density, the actual probability P that the variable will be in the interval [a,b] is
This density function is intended to express mathematically the total apportionment of the values of the variable it represents over the variables entire domain. This "apportionment" can signify different things in various contexts, such as relative proportion of observations, or information regarding the residual uncertainty of its true value.
It is necessary to express probability as a density function for a variable or parameter which may take on a continuum of values so that the total probability covering the entire domain of support may converge to a finite value. The counterpart for a discretely distributed variable is the probability mass function.
In order to qualify as a probability density function, such a function must satisfy the following two criteria:
(1) inside the domain of support.
(2) i.e., finitely convergent (to unity by convention).
From the first condition above, it necessarily follows that:
for a<b, i.e., is non-decreasing
Such a function leads to the definition of an associated cumulative distribution function.
If the domain of the variable is finite, then the infinite limits on the above integrals would be replaced by those bounds, and a fourth requirement would be:
(4) outside the finite domain of support.


text:
Top press photos on display in Athy
The AIB Photojournalism Exhibition will be on display at AIB in Athy for until this Friday, August 16.
The collection of award-winning images are from the annual Press Photographer of Ireland awards, and are on a nationwide tour.
Kildare is well represented in this year's competition, with award-winning and highly commended images from award winner Adrian Melia, well-known for his sports photography for the Leinster Leader, with his "Lift Off" in the Nature and Environment category.
The Irish Independent photographer Tony Gavin is represented in the categories Portrait and News, and Irish Times photographer Brenda Fitzsimons presented her reportage 'Libya Liberated' showing the life in Libya before their first democratic elections


text:
Varieties of Tone Frege, Dummett and the Shades of Meaning, by Kortum, Richard
Note: Supplemental materials are not guaranteed with Rental or Used book purchases.
- Cover: Hardcover
- Copyright: 11/15/2013
Today's leading theories of meaning, chiefly those of Michael Dummett and Donald Davidson, depend crucially upon Gottlob Frege's distinctions between sense and reference, sense and utterance-force, and sense and tone. But while the notions of reference, sense, and force have dominated the discussion, the subtle workings of tone have received scant attention. Long overdue, this is the first comprehensive study of tone. Careful analysis of the more than two dozen varieties identified by Frege and Dummett reveals serious weaknesses in their explanatory framework. The author sketches a broader conception in terms of speakers correctly making things out to be a certain way, a formulation that avoids the demonstrated shortcomings of Fregean truth-conditional accounts while capturing the representational character of meaning as this applies right across the language–not only to words and sentences, but to discreet linguistic components such as word-order, mood of the verb, and patterns of intonation and stress.


text: Have errands to run? Need to clean house, or simply want some time to yourself? Consider registering your child(ren) ages 6 wks-4 yrs in our MMO program. Payment is due on day of care, and registrations are on a first-come, first-served basis. Cost is $12/day, per child. Sibling discounts are available.


text:
Don't forget the animal lovers on your gift list. Made with ground meat and flavored with Parmesan, Kitty Crunchies will be a welcome treat for the felines in your life.
How to Make It
Preheat oven to 350ºF. Line 2 large baking sheets with parchment.
Combine flour and milk; mix well. Mix in meat, then both oils. Add water 2 Tbsp. at a time until dough is firm and smooth (up to 1/2 cup).
Divide into 2 portions. Use a spatula to spread each portion of dough on a cookie sheet to 1/4-inch thickness. Score dough with a knife into about 700 crunchies. Sprinkle cheese evenly over both pans.
Bake until crunchies are golden brown, 20 to 30 minutes, switching sheets from top to bottom and front to back and shaking both sheets halfway through. Turn off oven and, leaving the door closed, allow crunchies to dry for up to 6 hours. Remove from oven and let cool completely before packaging. Store in an airtight container at room temperature for up to 3 weeks (6 weeks if refrigerated).
Allowance per day: 5 to 10 crunchies
Dinner PAWsible


text:
Timberhaven's Design Center
By TimberHaven Log Homes LLC | Mar 09, 2018
Timberhaven's Log Home Design Center is where you'll find the floor plan you have been looking for. Whether you're looking for a cozy cabin or an awe-inspiring grand log or timber home, Timberhaven's NEW log home design center provides the tools you need to get started with your plan. Finding the perfect floor plan is the first of seven steps in successfully planning your dream log home, log cabin or timber frame home – it's one that is most exciting too. The NEW Log Home Design Center provides over 300 log home, log cabin and timber frame home design considerations plus an additional 20 interactive floor plans.
Contact us at; 207.548.0388 or firstname.lastname@example.com