I recently participated in a two-week photo tour in Tanzania. This is something I have wanted to do for several years, and I had no intention of allowing high-maintenance eye care to keep me from achieving that goal.
I have traveled overseas with scleral lenses successfully in the past, most recently on a hiking trip in England, but Africa is another matter. I asked M&M Photo Tours to find out about the availability of ClearCare in Tanzania, but as I suspected, it is not readily available. I also considered buying plain hydrogen peroxide, but a Google search turned up evidence that the purity in Tanzania is not to the same standard as in the US, so I quickly discarded that plan.
Next, I thought I would carry on a travel size bottle of UniquePH and a couple of ClearCare, and alternate between the two. However an e-mail exchange with Dr. G (the developer of LaserFit lenses) along with input from the My Big Fat Scleral Lens Facebook group caused me to rethink that approach in favor of packing additional ClearCare in a checked bag.
I always carry an emergency scleral kit that contains a small contact case, a mirror, a few 5ml Modudose vials, a Theratears liquid gel vial, a tube of Muro128, a DMV vented scleral cup and ultra remover, and some cotton swabs. This was also in my carry-on.
That's a lot of stuff, but as any photographer will tell you, it's all in the optics – and that includes eyesight, my friends, And thus, I overpacked.
I have flown several times, including overseas, with scleral lenses. I pack two quart bags, one with my regular fluids and one marked "Medical Fluids," and previously was never questioned. This time, a TSA agent at Kansas City International Airport stopped me to say that I was over my allocation. I explained that one of the bags was for medical purposes, but she remained steadfast. I then offered to show her a letter from my doctor, but before I was able to get it out, a supervisor came over and waved me through, explaining that the excess fluids were clearly medically necessary and all under 3.4 ounces. Disaster averted! In retrospect, I could probably have avoided the situation by putting each bag in a separate bin. It's always a good idea to have a letter from your doctor listing medications and the need for extra fluids.
Part of my preparation for the trip was to plan scleral wear time during travel. I made a matrix with columns for home time and time at each intermediate stop before Kilimanjaro. I knew that I had 3-4 hour layovers at Minneapolis-St. Paul and Amsterdam, that I would have two 8-hour flights, and would be arriving at Kilimanjaro at night. I prefer not to insert or remove my contacts during flight, and I hoped to get a head start on adjusting my sleep schedule to Africa time. I also don't want to go over 16 hours of wear time. Taking all of that into consideration, I determined that the best schedule on the way there was to wear them on the flight from Kansas City to Minneapolis, take them out just before boarding the flight to Amsterdam (and try to sleep on that flight), put them in upon arrival in Amsterdam, and remove them after arrival at the lodge in Tanzania.
Sound complicated? Welcome to the new normal for scleral lens patients.
The plan worked great, although the Amsterdam airport had some interesting sinks with footlong drains offering ample opportunity to lose a lens. I solved that problem by pulling out a small quick dry towel that I keep in my camera bag and using it to cover the drain while I inserted my lenses. I was a bit self-conscious about the amount of time and space I needed for all of my lens paraphernalia, but I did what I needed to do. During transit I disinfect with UniquePH rather than ClearCare so that spillage is not an issue.
Another small glitch came when I opened my suitcase at the first lodge and the first couple of layers of clothing in my checked bag were damp. The bottles of ClearCare and saline were intact, so some must have leached out. (I think it was likely the saline since none of the clothing showed signs of bleaching.) The clothing was all quick dry and all was fine by morning. However for the rest of the trip, I stowed all of my larger bottles of solution in a JetBag that I had brought with me. These bags are designed to absorb 750ml of liquid in case a bottle of wine breaks in a checked bag. I'm not sure why I didn't think of this to begin with, but it is my takeaway travel tip for this trip.
All of my compulsive planning and supply redundancy proved invaluable during the actual safari. Game drives are extremely dusty. The Ziena moisture chamber glasses, which I am wearing in the photo above, worked perfectly to keep as much dust as possible away from my scleral lenses. I had them fitted with progressive reading lenses (no distance correction) so that I could easily see the settings on my camera. At night I used Muro128 to lubricate my left eye, which does not blink fully or produce tears. I took along a Quartz silicon shield in case I should need it, but never wore it.
There were two days when I wore each of the three pairs of LaserFit lenses. I established a rule that I would never reinsert lenses until they had been disinfected. One particularly dusty morning, I changed lenses when we returned to camp at noon, and again when I took a shower before dinner. I make it a practice never to wear my lenses in the shower, and in Africa that is an even more important safety rule. So one evening when I forgot and took a shower with the second set in, I immediately removed them for disinfection. It would have been possible to travel with one or two sets of lenses, but I was glad to have taken three.
I ended up using one 12-oz and one 3-oz bottle of ClearCare solution, and the 12-oz bottle of saline (for rinsing) during the trip. Each day I rinsed my disinfected lenses in the neutralized ClearCare solution, then used one 15ml Modudose vial and one Theratears vial for insertion, plus a 5ml Modudose vial if I needed to squeegee my left lens. I immediately discarded any unused solution in the vials, and used a fresh quarter of a cleaning sponge every time I cleaned my lenses.
On the trip home, we left Kilimanjaro on a late evening flight, so I had already removed my lenses. I reinserted them in Amsterdam (again utilizing my quick dry towel to cover the massive drain), and removed them in Minneapolis before my final flight to Kansas City. I was fortunate enough to be a guest in a Delta lounge, so the bathroom situation was much better.
It takes a lot of foresight and planning to travel with scleral lenses, but they needn't keep us from pursuing our goals. I think the only thing I would have done differently – besides packing my checked fluids in a JetBag – is to forego the 12-oz bottle of saline and 15ml Modudose vials in favor of 5ml vials. They come in connected sets of four flat vials that are easy to pack, and I always ended up discarding extra fluid in the 15ml vials. I think a four-pack per day plus a few extra for insurance would have been sufficient.
So there you have it – sclerals on safari! Now to begin planning for my next big travel adventure.
Taken in by a family in Jeff City.
Because, for a boy, he's quite pretty.
Years ago, when one of my grade-school teachers asked, "If you were an animal, what would you be?" several members of my class piped up with "giraffe" before I had a chance to answer for myself. Even back in the day I was tall, quiet, and awkward. I was fine with the comparison; it certainly wasn't the meanest one they could have picked. Next trip to the school library, I checked out a book about giraffes and a lifelong interest was kindled.
I read once that this same question is popular during job interviews. I have never been asked, though, which I find unfortunate. Among the myriad of intelligent yet social dolphins, go-for-the-jugular jaguars, and sly foxes out there, a gentle giraffe would be a refreshing change of pace, and not merely because as an adult I am roughly the same size as a newborn giraffe.
These are praiseworthy characteristics in life as well as in the workforce. I also like that giraffes have huge hearts, and that while they may initially appear gangly, there is actually an ambling grace to their movements.
I keep a giraffe figurine on my desk for motivation. When six months seems interminably long, it helps to imagine for a moment I am already in Africa. When I worry about not having enough time to prepare, it helps to remember that as long as I keep reaching, seemingly insurmountable goals become achievable.
Not bad for an epileptic dog with a predisposition for pancreatitis.
Happy Birthday to the best dog ever!
Today marks ten years since I awoke from microvascular decompression surgery to left-side facial paresis. Well, paralysis at that time. Single-sided deafness as well. Fortunately over time I regained most of my balance and hearing and enough facial function that most people don't notice anything amiss. My blink and tear function have never returned, so I have spent a decade finding a remedy for painful dry eye. The solution that has worked best for me is the combination of an implanted eyelid weight and scleral contact lenses. These large-diameter specialty lenses are expensive and require quite a bit of maintenance, but in my opinion are worth every bit of cost and effort.
In past posts I outlined the care routine that works best for me. Since then I've discovered a couple more items that make it more manageable.
Several months ago I had to have my collarbone plated following an auto accident. Something went wrong with the nerve block and for a while my left arm did not function. My insertion technique requires both hands – one to hold the inserter and lens, the other to hold my eyelid wide open. For the first couple of weeks my husband helped with the eyelid part. We were both relieved when I regained the minimal movement and grip necessary to hold the inserter relatively steady. It was frustrating at first. My left hand did not have the strength to hold my eyelids, so I could only use it to hold the inserter and lens. Fine for my right side, but very awkward for the left. It wasn't what I was used to and I kept bumping into my nose moving my right hand across my face to open the left eyelids. The weakness in my left hand caused me to spill the solution quite often. I also had a hard time aligning the left lens in the mirror I used on the counter. I was back to needing ten to fifteen minutes or more just to insert my contacts.
I snapped it up with a 40% off coupon and it worked like a charm. All I needed to do was align the inserter so that I could see a little circle of light. This lasted for a few weeks before it died. I think that even though I blotted up excess saline right away, some made its way into the box and shorted its circuits. In retrospect, I should have put a square of glass or plastic over it to keep the liquid out.
I highly recommend this for people who have trouble inserting their lenses. I find that it helps immensely to align lenses properly, plus it's inexpensive and small enough for travel.
Make sure it's the extra-large 120-count jar. The 80-count is too short for the PROSE case, but might work with a ClearCare case. While a little solution may still seep into the jar, it won't leak out into luggage.
It amazes me to look back and see how far scleral lens technology and use has come in the past decade. I'm looking forward to seeing what the next ten years bring.
Having pulled the trigger on going on safari, I turned my attention to preparing for it. Whenever I plan to leave the country, I take out travel insurance, and this trip is no exception. I looked for a policy that would cover many contingencies of not being able to go, and maximizing lost luggage since I am taking expensive camera gear.
That done, I started googling safari gear. I had originally thought that I would be pretty well geared-up already, since Phil and I have been on many hiking excursions and I figured quick-dry gear is quick-dry gear, eh? However, the bold colors that make one easy to spot on a hiking trail also make one easy to spot by African wildlife, and not in a good way. Add in my post-accident weight loss, and suddenly I wasn't so well geared-up after all, except for hiking boots.
The best colors for safari are desert neutrals: brown, beige, khaki, tan, olive drab. Besides the aforementioned bright colors that alarm the animals, black and navy blue draw tsetse flies, and who wants that? So . . . off to amazon.com! Unfortunately I soon discovered that 6L hiking pants are nearly impossible to find and quick-dry shirts have become quite pricey. Time to expand my shopping horizon, and explore alternative payment sources.
Our amazon.com account is linked to our Discover rewards, which I used to purchase a number of items for the trip, mostly related to technology (laptop sleeve, port dust plugs, MacBook port adapter, keyboard cover and such). We also have a policy of directing "found money," such as product rebates and Ebates, into our travel fund.
We also have a Cabelas rewards charge card, which enabled me to order tan hiking socks, a khaki sun/rain hat, and a "Rite in the Rain" pen and pad – all with points.
I am still debating the merits of a travel vest and am watching prices.
I am going on safari in Tanzania next February, where I will see these majestic animals in their natural environment. I am so excited!
This trip has been a long-term dream that started when I began following the work of photographer Jeff Cable. Among his extensive portfolio, he does amazing work shooting Olympic sports, portraiture, and of course, travel photography. The first time I saw him post about his safari excursions was probably 2015 or 2016. I had recently started a new job and it was just not feasible to take extended leave.
Several things happened in 2017 that made me realize that while no timeframe is going to be perfect, now is the time to follow dreams. One was a car accident in which I suffered a broken collarbone, with a subsequent surgery that resulted in an unexpected nerve injury with extended recovery. I also lost three "mother figures" — Arleene, a dear friend and former colleague, Aunt Grace, my beloved godmother, and Ann, my former mother-in-law. I'm sure that each of them would be honored to be an impetus behind this decision.
There is a lot of preparation for a trip such as this, and I anticipate multiple posts related to that in the near future. But for now I will revel in the decision to do this, and the anticipation of seeing my spirit animal, the giraffe, in its native habitat.
It took some doing to get here, but today turned out to be a pretty special day.
October 22 – Little did I know, standing at the intersection of Academy Boulevard North and Jannie Drive in Colorado Springs as I gingerly explored the edges of a broken collarbone under my skin, what an ordeal recovery would become. The nice off-duty EMT who stopped at the accident site assured me that it was a common motor vehicle accident injury. As did the ER doc and the radiologist who made me raise my arm over my head for one of the views. (First major ouch.) I was released with an arm sling, a couple of prescriptions and a recommendation to see my own doctor for follow-up once I returned home.
October 24 – I see my regular physician. He says he thought the break would heal normally over the next six weeks, and prescribes a shoulder extender that he thought would be more comfortable. I visit two orthopedic shops and call several pharmacies only to find that it is a specialty item that will take several days to arrive. Frustrated, I text an orthopedic physician that attends my church, who makes room in his schedule the next day.
October 25 – I visit the orthopedic physician. X-rays show a 2cm displacement, on the cusp of needing surgical repair. He outfits me with a figure-8 brace (much better than the sling) and puts me on a two-week watch and wait with instructions to come back in if one of the bone ends starts protruding.
October 28 – I sneeze, violently. I feel it coming but am powerless to do anything other than throw my hand over my collarbone. I feel the ends of the bones rolling under the skin. (Third major ouch.) And just like that, one of the broken ends is much more prominent. Unfortunately it is Saturday morning, so nothing can be done but to get through the weekend.
October 31 – Another visit to the orthopedic physician. The followup X-rays show that the ends of the collarbone, previously overlapping, have moved apart and are no longer likely to heal properly on their own. He and his partner recommend that I see a trauma surgeon in Columbia.
November 2 – The first available consult with the trauma surgeon is November 28. Surgery will be scheduled shortly after. I am not at all happy about the delay. They later call back with a November 14 appointment. My orthopedic physician calls to see about a different surgeon, but they are both booked solid.
November 3 – A highly recommended local orthopedic surgeon is able to see me the following Thursday. The appointment is later moved up to Tuesday.
November 7 – The local surgeon tells me that he likes to do clavicle repairs within two weeks of the initial injury. I am just beyond that, so surgery is scheduled for the next day.
November 8 – The anesthesiologist recommends a brachial plexus nerve block for better pain control after the surgery. It is standard procedure, but one of the risks is a droopy face. This being my left side, I decline the block. The anesthesiologist, surgeon, and Phil all think I should reconsider, so I do. The surgeon tells us that he plated the broken ends, also having to screw together two additional bone fragments. I am sent home back in the sling. The nerve block should wear off over three days.
November 11 – My hand is still completely numb. Unfortunately it is once again a weekend.
November 13 – The orthopedic surgeon's nurse tells me that I must have gotten a really good nerve block. I insist that something is wrong and get an appointment for the next day.
November 14 – The surgeon is pleased with my incision healing. He removes 15 surgical staples, replacing them with steri-strips. He examines my arm and what movement has returned. He thinks that I will eventually regain use of my wrist and hand, but it may take a while. Meanwhile he puts me in a wrist brace so that my hand is not flopping around, gives me some stretching exercises for my fingers and prescribes neurontin for the pins and needles. Then he sends me upstairs for an EMG. After that most enjoyable series of shocks and pricks, that doc says I have every reason to hope for the best, but again, when is anyone's guess. He does say weeks rather than months. He does not think it was due to the block entering the nerve because there are so many non-responsive nerves, and instead calls it a "conduction event." I discuss with both doctors the side effect of my pudendal block years ago as well as my neurosurgeon's comments about my facial nerve during my microvascular decompression surgery. They both agree that I am not a good candidate for future nerve blocks.
November 16 – The orthopedic surgeon calls to discuss my nerve scan (EMG). The nerves are intact, but not conducting. Basically I wait and watch and stretch my fingers (which really hurts btw) and hopefully heal. On the plus side, I have some movement in my shoulder and elbow, and can curl my fingers slightly (although I can't straighten them). I feel pressure, temperature, itching, texture and TONS of pins and needles. Today I noticed that the bruises on my breastbone and shoulder are really tender. That has to be a good sign.
On the other hand, loss of the use of my hand is really hard. Obviously, typing takes a lot more effort, and my job requires a lot of computer work. But there are so many other things that I took for granted. Phil has to help me put my contacts in. I can't tie my shoes or floss my teeth. I am limited in my wardrobe choices. A colleague helped me put my earrings in; necklaces and bracelets are out of the question. So far I have not attempted to drive, though now that I am in the wrist brace I am thinking about trying to again. Everything is just harder and more tiring and takes longer and I am extremely frustrated and sad. Everyone has been incredibly kind and helpful, and while I appreciate it immensely, I still wish that I did not need the help. I am also angry with myself for not following my gut instinct to forego the nerve block.
I also nearly mistake a Smirnoff Ice for Gatorade. That could make things interesting.
November 17 – Gabapentin is an evil drug. I don't even want to talk about its nasty side effects. We are going to try Lyrica, but insurance doesn't cover much, so switching to Topamax. I seem to remember getting along all right with it back in my hemifacial spasm days.
November 20 – A friend who is a physical therapist gives me some exercises for my hand and says my scar looks good and I can peel off the steri-strips. I have a lot of brain fog and opening an envelope one-handed takes about 10 minutes. Frustrating.
November 21 – I am driving again. I hit the garage door with the breakaway mirror backing out, and it, well, breaks. I thought that wasn't supposed to happen.
December 3 – I can uncurl my hand, but just once per day. Phil is camping and I have to call my brother over to open a paint can so I can do some touchup painting in our family room. It's tricky but doable with one hand.
December 4 – I attempt some housework, but the feeling of wet laundry literally makes my nerves crawl. I spend fifteen minutes shuddering as the skin on my left fingertips executes a counterrevolt.
December 6 – My mother-in-law falls. At the emergency room I see a boy with a matching wrist brace and invite him to arm wrestle. He declines. I'm not sure why because he almost certainly would have beat me.
December 9 – My fingers have really opened up over the past week and the wrist drop has improved as well. I can pick things up and manage slightly heavier objects. Weakness is an issue though, for instance I can hold a toothpaste tube but can't squeeze it. I can touch my thumb and each fingertip together but am neither strong enough nor coordinated enough to type. One new accomplishment for the week was tying the drawstring in my sweatpants. The first time took nearly 10 minutes but just like folding socks I have improved upon my technique so it is faster and the outcome is better. Shoelaces are still too fine to manage, but soon. I see the surgeon for a follow up Thursday so I hope to find out about physical therapy.
December 14 – My collarbone is 85% healed. The surgeon orders 6 weeks of hand PT/OT, but there are no openings until after Christmas. Still, there is progress! The surgeon warned me that my collarbone would ache in the cold. He is right.
December 28 – At my PT/OT evaluation I measure fourteen pounds of grip in my left hand, around 70 with my right. Our plan is twice-weekly visits to work on strength and dexterity.
December 29 – I see my optometrist to utilize my vision insurance benefits before they run out. He is very impressed with my LaserFit scleral lenses and thinks it would be great to bring them to mid-Missouri. I offer to put him in touch with Dr. Gemoules. I remove the lenses to be measured for a pair of eyeglasses, and have a routine numbing drop put in my left eye. Everything goes according to schedule with my right eye, but when it's time to read the lines with my left, I can't see anything. Literally nothing, and I panic. The good optometrist remains calm, assuring me that it is a reaction to the numbing drop. This is hard for me to believe since we have been doing the same thing for five years, but I agree to rest in the waiting room for half an hour. I think I actually waited longer than that, but by the time I returned to the exam room the corneal swelling has abated and we proceed with the exam. The optometrist asks me if I have been experiencing double vision lately, which I have. I believe it is due to the Topamax, along with some "jumpiness" in my vision. The doctor would like to add a slight prism to my lenses, and I agree. An appointment that I thought would take an hour actually takes four.
January 13 – In two weeks I have increased grip strength to 21! My therapist thinks I will have 35 in two more weeks. BTW therapy hurts. A lot. But it's the good kind of pain, where you know it means you are getting better. We mainly work on strength, dexterity and desensitization in my fingers. My range of motion is really good now, and dexterity is way ahead of strength. The nerve sensitivity is now limited to my fingertips, with my thumb and forefinger ahead of the other three. I asked how long it typically takes to go away altogether. Of course, the answer is that it varies; could be a few more weeks, could be a few more months.
January 25 – My clavicle is completely healed! My surgeon is pleased with the progress of my hand and prescribed four additional weeks of PT/OT for my shoulder. As I've resumed typing, my left hand has started to exhibit symptoms of carpal tunnel syndrome, so we are addressing that in therapy as well. Saturday is my final day weaning off Topamax and while the weight loss side effect has been great, I won't miss the brain fog or jumpy vision. I am also very happy that the Tylenol-only OTC pain relief restriction is lifted – my right knee has missed its naproxen. It may be months yet before the ultra-sensitivity in my fingertips and the tenderness in my breastbone resolve completely, but there is light at the end of the tunnel.
Which brings us to today, March 1 – I have been released from occupational therapy! Grip strength and pinch are back to normal in my left hand, and have even increased in the right. I have less sensitivity in my fingertips so I can type with both hands. I have much less numbness in my left hand and have every reason to hope that it was due to residual nerve irritation rather than carpal tunnel. I only had to utilize 17 of 41 prescribed visits.
There was that instant on October 22 when we were in the wrong place at the wrong time and my collarbone was broken in an auto accident. There was a second instant November 9 when I wish I had followed my gut instinct to forego a nerve block, but caved to the recommendation of others. In both instances things could have turned out worse, and I feel blessed to be where I am now. Thanks to everyone who has offered prayers and good thoughts, kind deeds and support. It's meant the world to me.
Note: I have chosen not to identify health care practitioners publicly, other than Dr. Gemoules, whom I previously discussed in relation to my LaserFit lenses. Anyone desiring a recommendation is welcome to ask for a private recommendation.
It's true that life can change in an instant. Even when you're lucky.
Last October Laura and I traveled to Colorado Springs to see Kyle play soccer. We had also gone the year before, a quick, exhausting in-and-out trip to Denver that wore us both out and led to the decision that we should try a more extended, relaxing trip next time.
So we doubled our days from two to four. We arrived in time to tour Garden of the Gods.
We met up with Kyle, and later his family to see the first of two soccer matches.
We visited Pike's Peak with Kyle's family. Cold, crazy experience. I was so light-headed at the peak that I staggered into other sightseers. Not that they weren't staggering too! Brrr.
Sunday morning, October 22, we decided to visit the zoo before Kyle's matinee game. I was excited to see the giraffes. We checked out of the hotel on a lovely, clear morning. We left the hotel parking lot and headed toward the thoroughfare.
The next thing we knew, the car was no longer moving and full of airbags. I don't remember feeling or hearing the impact. I asked Laura if she was all right; she was asking me the same thing. She did not want to get out of the car because we couldn't see where we were and didn't know if it was safe, so we stayed inside the car.
Within a couple of minutes someone was banging on my car door asking if we were all right. I said that I thought so. A man opened the door and we both exited on the driver side. Immediately I asked if the occupants of the other car were all right. The man told me that he didn't know because the driver had taken off. I got a good look at the rental car, and it looked terrible.
The whole front end had been taken off and bits of Jetta were scattered everywhere. The windshield was broken on the passenger side and I began to worry that Laura had hit her head, but she assured me that she hadn't. About this time an off-duty EMT stopped by and asked to examine us. Starting with me because I was driving, she asked me a bunch of questions, including who was president of the United States and how many quarters were in $3.50. Fourteen, by the way. I was correct and she stopped worrying about concussion. She asked me about pain and I realized that my shoulder was tender. We both touched it and found a bump on the collarbone – likely fracture.
She then checked Laura over, who had spent the intervening time contacting Kyle, his mom and Phil.
The first responders arrived and ordered an ambulance. The firefighters were great. They found our eyeglasses in the wreckage and loaded all of our personal gear in the ambulance, even the wine and hard cider we had bought for Christmas gifts, which was somehow still intact after the collision. They did say that one second further into the intersection and I wouldn't have been walking away – they would have been extracting me with jaws of life.
The ambulance crew called to find out the least busy ER and we were off. Once there Laura and I were separated for our respective exams, which I found very stressful. I was taken to Xray, and was diagnosed with a fractured left clavicle. The Colorado Springs Police caught up with us at the hospital and interviewed us separately. The officer told me that they thought they knew who had hit us, that he had stolen his ex-girlfriend's car and had fled the scene. Our hit-and-run was just one of many charges pending against him.
After Laura was interviewed by the police and released by the hospital, she was able to rejoin me. I called Hertz to report the accident. They asked me to contact them once I knew where the car was towed, and also asked if we needed another rental, but we would have to come back to the Denver airport to get it. Since that was our final destination anyway and neither of us felt like driving, we declined and told them that we would find alternative transportation to the airport.
Although the hospital staff originally told us that their goal was to get us on our 8:00 p.m. flight home, we were released in time to try to make Kyle's afternoon soccer game. Laura called an Uber to take us there. October 22 turned out to be a big day: first broken bone, first ambulance ride, first Uber. We met up with Kyle's family at the soccer field, loaded our stuff in their van, and headed to the game, missing only about 10 minutes. By this time my hospital meds had kicked in big time and I don't remember much other than an egregious incident involving the other team pulling Kyle out of the box by his jersey with a resulting score that the officials let stand. Bummer!
After the game, Kyle headed back to South Dakota with his team and his family kindly drove us to the Denver airport. We left almost all of our luggage with them, and made it through security and to our gate with about 10 minutes to spare. Sadly, I had to give up my exit row seat with extra leg room because I was not physically able to open the exit hatch should it be necessary. But the gate attendance kindly sat me next to Laura, who took prodigious care of me during the flight. Just so you know, turbulence and broken collarbones do not make for a happy combination.
By about 11:00 p.m. we were home in Jefferson City, Laura ready to head back to Truman for the rest of her final semester, and me to deal with my fractured collarbone.


text:
L' est une université nationale japonaise, située à Otsu dans la préfecture de Shiga

Composantes
L'université est structurée en , qui ont la charge des étudiants de  universitaire, et en , qui a la charge des étudiants de  et  universitaire.

Facultés de
L'université compte 2 .
 Faculté de médecine
 Faculté de formation des infirmières

Facultés de cycles supérieur
L'université compte 1 .
 Faculté de médecine

Notes et références

Liens externes
 Site officiel

Université dans la préfecture de Shiga
Shiga

redpajama_set_name: RedPajamaWikipedia


Replace doorknobs and drawer knobs. These small modifications can perk up furniture that you have already got and are inexpensive than shopping for a brand new door or a new set of drawers. Doorknobs and drawer knobs might be bought in a wide range of types and colours, so it's easy so as to add a bit of pizazz with just a bit bit of cash. Add worth to your home by refinishing your wood flooring. Ground re-ending is a serious process however not terribly onerous. Your local house improvement center or hardware store can rent you the specialised equipment you want, and most of them additionally provide courses to teach you what to do. This improvement can save you a lot money since you're not buying a brand new ground.
Are you considering making some adjustments in your home? Remember that dwelling improvement is an especially broad and common topic, so you'll be able to always find some good info. Hundreds of thousands of people are looking to make dwelling enhancements, however a lot of them do not have the data. But after reading articles like what you have simply read above, those powerful projects instantly not seem so difficult. Ideally, you understand a lot more about home improvement now that you have learn this article. All that's left now could be for you to get began.
Sand wood objects earlier than staining to verify the wood is smooth. Follow up by wiping with a humid cloth. Using superb-grit sandpaper is the best way to smooth the surface. Wiping off the article afterwards will preserve it easy and get rid of dust. Serious drainage problems can surface throughout rainy intervals if gutters are clogged. A main reason for water leaking into the basement is clogged gutters that result in rainwater working down alongside the facet of your property. Clean your gutters to avoid the sort of matter.
In terms of dwelling enchancment, it is very important know which forms of improvements will add to the value of your property and which won't. This will likely be necessary when it does come time to promote your home. Such basic upkeep corresponding to sealing the driveway and replacing the roof won't add to the worth, nonetheless, an additional toilet or a patio may. When you're replacing your siding with veneer some optimistic issues to remember about that material are the useful benefits to different sidings. The veneers can protect your property quite properly from damages, they are very easy to install, and require little to nearly no upkeep which is very important.
Maybe the home or condo you're dwelling in is nice, however the view to the surface isn't. When you have any offending sights that you just want to conceal, consider putting some plants or flowers in your window sill or in a window box. If you want to take drastic measures in concealing your offending view, plant some shrubs or giant bushes in entrance of your window. This can guarantee that you have a nicer view.
Having a honey-do record could make it so that you are all the time waiting round for someone else to get something mounted round your house that you could possibly simply do your self. Listed below are some easy house improvement ideas that even a beginner would be able to complete. Take charge of your private home, and do what must be finished your self. Relatively than permitting a spare bedroom to sit empty and unused, why not turn it into your own personal library? Even in the event you don't feel that you sufficient books to warrant a library, you can too fill its cabinets with DVDs, CDs and your favorite magazines or paper. Add a plush rug and a excessive-backed chair for an additional touch of sophistication.
Prior to staining or painting any picket objects, always use sandpaper with a purpose to easy out the wooden's floor. Once you do this, wipe off the item with a moist rag.


text:
Israel Defence Minister Avigdor Lieberman resigns over Gaza ceasefire
Lieberman said the ceasefire is a "capitulation to terror"
Israeli Defence Minister Avigdor Lieberman announced his resignation on Wednesday in protest at a Gaza ceasefire that he called a "capitulation to terror", weakening Prime Minister Benjamin Netanyahu's conservative coalition government.
"Were I to stay in office, I would not be able to look southern residents in the eye," Lieberman said, referring to Israelis subjected to a surge in Palestinian rocket attacks before Tuesday's truce took hold.
Lieberman said his resignation, which will go into effect 48 hours after he submits a formal letter to Netanyahu, also withdraws his far-right Israel Beitenu party from the coalition.
That would leave Netanyahu with control of just 61 of the 120 seats in parliament a year before Israel's next election.
Israeli political commentators had speculated that Netanyahu, who despite his approval ratings has been dogged by multiple corruption investigations, might bring forward the ballot.
But a spokesman for his rightist Likud party played down that option, saying Netanyahu would assume the defense post.
"There is no need to go to an election during what is a sensitive period for national security. This government can see out its days," the spokesman, Jonatan Urich, said on Twitter.
Lieberman has spoken in favor of harsh Israeli military action against Gaza's dominant Hamas Islamists, even as the government authorized a Qatari cash infusion to the impoverished enclave last week and limited itself to air strikes rather than a wider campaigns during this week's fighting.
Born in the former Soviet Union, Lieberman's voter base is made up of fellow Russian-speaking immigrants, and rightists and secularists who share his hostility to Israel's Arab minority and the religious authority wielded by ultra-Orthodox Jewish parties.
The former foreign minister, received the defense portfolio in May 2016.
Army rifle gets stolen in Limassol
Fair skies with low chances of rain

redpajama_set_name: RedPajamaCommonCrawl


All stats provided by area coaches. To include your team�s stats, please e-mail them to pgardner@gastongazette.com or fax to 704-867-5751 by noon each Thursday.
Team abbreviations: Ash � Ashbrook; BC � Bessemer City; CC � Cramerton Christian; Ch � Cherryville; EG � East Gaston; EL � East Lincoln; For � Forestview; GC � Gaston Christian; GD � Gaston Day; HH � Hunter Huss; HT � Highland Tech; KM � Kings Mountain; LC � Lincoln Charter; Linc � Lincolnton; NG � North Gaston; NL � North Lincoln; PC � Piedmont Community Charter; SP � South Point; VC � Gastonia Victory Christian; WL � West Lincoln.


Why videophones can't transmit live combat coverage.
Why the combat coverage from Iraq isn't live.
Viewers of late '80s Saturday Night Live will recall Al Franken's scrappy telejournalist, touted as "The One-Man Mobile Uplink." Donning a helmet topped with a mammoth satellite dish, the character boasted that he was a reporter, cameraman, and engineer all rolled into one, the attainment of the media's Holy Grail of unfettered, real-time coverage. The joke was that Franken was too weighed down with equipment to actually report anything beyond the facts that he couldn't swivel his neck and that lightning was a constant threat.
Those skits now seem as quaint as SNL's jabs at Michael Dukakis. With the miniaturization of news-gathering tech, digital images are being streamed from Basra to Boise via "video suitcases" such as 7E Communications' Talking Head, an 11-pound unit just a smidgeon bigger than a laptop. Simply jack a 12-pound digital camera into the $10,000 box and real-time data is streamed skyward by two satellite phones. (The idea being that two phones are faster than one.) Networks are still wary of sending one-man gangs into combat, given the ostensible safety of the buddy system. But there's no longer any real technological barrier to deploying solo TV journalists, or "sojos" as CNN correspondent Kevin Sites likes to call them. CNN alone has eight trained sojos on staff, all ready to drag their Talking Heads into battle at a moment's notice.
Yet for all of its archaic technology, Franken's gag remains spot-on. What made the One-Man Mobile Uplink so hilarious was the character's utter uselessness. Despite his pricey toys, he couldn't move even 6 inches to either side, much less cover a campaign stop. So it goes in Iraq, too. The gee-whiz joy of seeing through a sojo's eyes wears off quickly, especially when all we're stuck with are overly pixelated shots of rocks and dust. If something in the background moves, or the camera slips in the slightest, there goes the feed. The videophone has yet to reinvent war coverage as a live, real-time pursuit—at least until the networks ante up for the next generation of gizmos.
The Talking Head is aptly named since about all it's really good for is streaming a sojo's motionless head and shoulders. The systems can't conjure up enough bandwidth for anything more complex. Transmissions over the setup average 128 kilobits per second (64 kbps per satellite phone), which makes for jittery streaming images that wink out whenever the camera shifts too much. That's no great bother if a reporter merely wants to get his or her visage beamed back, but it presents serious problems for journalists aiming to capture actual movement—pretty much an unavoidable staple of armed conflict. So, for live coverage, we're stuck with static images, such as a slow-moving tank as it rolls across the endless Iraqi desert.
The most memorable images of the war so far—a Javelin missile winging toward its target, relieved Iraqi conscripts waving soiled white flags, troops obliterating a giant painting of Saddam—weren't aired live in real time using a videophone, but rather recorded and transmitted after the fact. (Transmitting a minute's worth of the highest-quality recorded video over a Talking Head takes about an hour.) Think, for example, of the dramatic Royal Marines assault on a pocket of Iraqi irregulars holed up in an al-Faw government building. The haunting image is that of a British soldier ablaze, stumbling from the building's entrance as his mates desperately try to stamp out the fire. The video was recorded and then sent via satellite, just like in dozens of past conflicts. Streamed live at 128 kbps, it would have looked like little more than few smudges of ink careening about.
If the networks' ultimate goal is to pull off real-time combat coverage that's actually watchable, they need to invest in more sophisticated equipment. Sweden's Swe-Dish Satellite Systems has developed a 70-pound suitcase that can transmit real-time images at upwards of 2 megabits per second, about a quarter of the speed of that comically massive satellite dish that Al Franken toted on his head. TV bosses cite weight and cost as the limiting factors—not only would the sojos have to be on the muscular side, but the $80,000-$100,000 price tags are steep compared to a Talking Head. Still, a 2-megabit videophone would allow for the capture of decent-quality motion with few interruptions in the streaming. But until the networks are willing to fork over the dough, the budding sojos won't be much more mobile than Franken's 15-year-old parody.


text:
Name: George William Smith
Designation: Architect, Engineer
Died: 18 September 1931
Bio Notes: George William Smith was the eldest son of W Smith, a chemist in Glasgow. He was articled to William Robertson, civil and mining engineer, Glasgow, for five years from 1853. For the last three years of his articles he worked as an assistant engineer with the Caledonian Railway, Hamilton branch. Smith emigrated to South Africa in 1858 in order, according to his obituary in the 'Port Elizabeth Advertiser' (23 Sep 1931, quoted in 'Looking Back' (no. 16 (1) Mar 1976:7-8) 'to fill an appointment on the Cape Town - Wellington Railway, under T Merchant and latterly Marcus Smith, as assistant engineer'.
George William Smith had two sons, both of whom were architects. The elder, George Oswald Smith joined his father in partnership about 1900 and the name of the practice became Smith, Son & Dewar.
The younger son was Harold Bayldon Smith. Harold Bayldon Smith, trained with his father. The elder Smith must presumably have had some training in architecture as well as engineering as his son was articled to him. When Harold Bayldon Smith returned to South Africa after a spell in the UK he joined his father's practice. The name of the practice then became Smith Sons & Dewar.
The following individuals or organisations employed or trained this architect, engineer (click on an item to view details):
Smith & Dewar Partner
Smith, Son & Dewar c. 1900 Partner
Smith Sons & Dewar c. 1910 1930s Partner
The following individuals were employed or trained by this architect, engineer (click on an item to view details):
Harold Bayldon Smith July 1893 1894 Apprentice
Harold Bayldon Smith 1898 1899 Apprentice
Currently, there are no references for this architect, engineer. The information has been derived from: the British Architectural Library / RIBA Directory of British Architects 1834-1914; Post Office Directories; and/or any sources listed under this individual's works.


- Embedded analytics including business intelligence, text analytics, and predictive modeling, along with high-performance interfaces to popular analytics platforms such as Spark.
- High-performance processing of transactional and analytic workloads.
- Massive scalability for efficiently processing large workloads and data sets with less hardware resources.


Our institute aims at all round development of the child. It creates interest or passion skill, their taste and choice by arranging a wonderful funfair in the school premises. School enlightens the creative skills of every child by arranging puppet show. The teachers as well as parents enjoy the show. Our funfair will state in the evening.
We celebrate the republic day on 26th January every year.This day is a very special day for all the student, parents and sunrise the leaders of our nation and they will be perform dance and sing songs, performance will be done on patriotic songs and on all day function.


I don't know why but I ship these two.
Incredible dialogue here for the date. Very fun interaction that's making me like Franklin and this girl a lot. And it's also giving us important information simultaneously. Superb.


and in the box below the item overview, enter promotional or coupon code and click apply. Small Animal, bedding, Cleaning and Odor Control, Cages Accessories, Treats Chews, Hutches Coops, Food, Hay, Healthcare. According to Legitscript, m does not make it to their directory. Its hard to get ahead when youre always trying to catch up on your bills, but its not impossible. It missions to spoil your pet by making it easy for you to discover many new products at one place. The site is based in United States and claims to provide good facilities to both pets and their masters so that they enjoy quality time together. Pet360s home page regularly features specials and new products for customers.
Due to demon tweeks promo code federal policy, orders containing prescription medication or frozen or raw food cannot be returned or refunded. PET as there is something usually happening! Customers can sign up at the website to order online. Instead, use the best rated pharmacy: find OUT what pharmacy IS #1 m is an online representation of actual store situated at Dothan, AL, United States. More You might also like these great coupons Thanks for your feedback! Top Deals to Save Big 20 off your first order by signing up for email updates. CouponChloe is completely team of professional discount finders to help a large number of UK users cut costs when purchasing through their chosen web stores such as TrainPetDog.


In 2017, 1890 students participated in the EGU's OSPP contest, with about 1 in 33 (57 in total) presentations being awarded. The largest majority of eligible posters and PICOs (1754) were evaluated by 3 or more judges, while 99 presentations had 2 evaluations. The remaining presentations, 37, had fewer than 2 evaluations and were deemed not eligible. The EGU continues to strive for 100% eligibility, and would like to warmly thank all the judges and conveners who contribute to the success of the OSPP2017 awards programme.


At a recent grand wine tasting, in order to help guide a fellow attendee (who cannot be named) through the wide selection of wines, I asked where his preferences lied. He responded with your typical male answer: just red, bold wines, California Cabs and anything but Pinot noir. In fact his exact comment was "Pinot noir is for girls." Normally those would be fighting words but instead I took it as a challenge to expand his limited wine horizons.
Many wines get a bad reputation for many reasons. Sometimes it is over production or extensive marketing. Other times it is just a new trend or even Hollywood. For instance, the sales of Merlot took a huge dip following the release of the movie "Sideways." Over the years I've heard that Chardonnay is too "oaky", that California wines aren't worth drinking, that French wines taste like dirt and let's not mention Zinfandel.
Wines made from Pinot noir have a very distinct flavor profile. Especially in the United States, they tend to have a fruit forward taste and a perfumed aroma. Pinot noir wines from the Russian River Valley in California or Willamette Valley in Washington can be extraordinary. The wines of Burgundy, France are some of the best in the world achieving a wonderful balance of fruit, earthiness and finesse. The famed wines of Domaine de la Romanee-Conti from Cote de Nuits sell in the thousands of dollars per bottle. And what would Champagne be if it were not for the Pinot noir grape?
Admittedly, Pinot Noir is not one of my favorite grapes but it definitely has its place on the dinner table. It pairs well with bacon, corned beef, game birds, ham, lamb, mushrooms and pork. It is also the wine of choice at many Thanksgiving feasts since it goes very well with turkey. So, in conclusion, since I drink Pinot noir I must be a girl! Are there any other girls out there?
A personal thank you to he-who-cannot-be-named without whom this blog would not exist.


Chances are, if your vehicle needs something done, we can do it. We can perform almost any service or repair that your vehicle may needs.
Advanced diagnostics for drivability and/or Check Engine Lights, electrical diagnosis and coding/programming issues often reserved for the dealer.
Our capabilities are too extensive to possibly list them all on this website. So if there is anything you need done to your vehicle, we are likely to be of assistance and almost always considerably less than the dealer.


This logon does not access custom enterprise versions of eMoney.
For assistance, call Customer Support at 888-362-8482.
Providing tips, best practices, and resources necessary to grow your practice and provide your clients with the level of service they deserve — all tied back to the use of innovative technology.
Note: Sunset values have also been updated and will be applied when the Tax Assumption – Income Tax Sunset is set to Sunset Occurs for 2026.
* The 12% bracket value was changed just for this filing status in the 2018 TCJA.
In addition, the Capital Gains Tax Brackets, AMT Exemption, AMT Floor / Exemptions Phase Out, Qualified Business Income Specified Service Trade Phase Out, Estate Tax, Gifting, and Generation-Skipping Transfer Tax Values have all been updated where required.
Note: This is a fixed value. It is not indexed for inflation.
Finally, the Client Portal Workshop Factoids have been updated to latest data for 2018. For more information or if you have any questions about these annual updates, give us a call at 888-362-8482 or send us an email.
Amanda is a Bradley Cooper fan who does Client Communications, in that order.
The eMoney Advisor blog is your source for the latest news relevant to the Financial Advisor community. We cover financial trends, advances in technology, and the newest updates to the eMoney platform while providing best practices that will help you grow your business and better serve your clients.


text:
XM_PATH=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))

# XiVO paths
ASTERISK_PATH=$(XIVO_PATH)/asterisk11
AGENT_PATH=$(XIVO_PATH)/xivo-agentd
AGI_PATH=$(XIVO_PATH)/xivo-agid
BACKUP_PATH=$(XIVO_PATH)/xivo-backup
BUS_PATH=$(XIVO_PATH)/xivo-bus
CALL_LOGS_PATH=$(XIVO_PATH)/xivo-call-logs
CONFGEN_PATH=$(XIVO_PATH)/xivo-confgend
CONFD_CLIENT_PATH=$(XIVO_PATH)/xivo-confd-client
CONFIG_PATH=$(XIVO_PATH)/xivo-config
CONSUL_PATH=$(XIVO_PATH)/xivo-consul-packaging
CTI_PATH=$(XIVO_PATH)/xivo-ctid
CTID_NG_CLIENT_PATH=$(XIVO_PATH)/xivo-ctid-ng-client
CTIDNG_PATH=$(XIVO_PATH)/xivo-ctid-ng
DAO_PATH=$(XIVO_PATH)/xivo-dao
DIRD_PATH=$(XIVO_PATH)/xivo-dird
DIRD_CLIENT_PATH=$(XIVO_PATH)/xivo-dird-client
DOC_PATH=$(XIVO_PATH)/xivo-doc
FETCHFW_PATH=$(XIVO_PATH)/xivo-fetchfw
LIB_PYTHON_PATH=$(XIVO_PATH)/xivo-lib-python
CONFD_PATH=$(XIVO_PATH)/xivo-confd
SCCP_PATH=$(XIVO_PATH)/xivo-libsccp
SYSCONF_PATH=$(XIVO_PATH)/xivo-sysconfd
WEBI_PATH=$(XIVO_PATH)/xivo-web-interface
LIB_REST_CLIENT_PATH=$(XIVO_PATH)/xivo-lib-rest-client

# PYTHONPATHS
LIB_PYTHON_PP=$(LIB_PYTHON_PATH)
BUS_PP=$(BUS_PATH)
XIVO_DAO_PYTHONPATH=$(XIVO_PATH)/xivo-dao
XIVO_DIRD_PYTHONPATH=$(XIVO_PATH)/xivo-dird
XIVO_AGENT_PYTHONPATH=$(XIVO_PATH)/xivo-agent
XIVO_PROVD_PYTHONPATH=$(XIVO_PATH)/xivo-provisioning
CTI_PP=$(CTI_PATH)

XIVO_PYTHONPATH=$(LIB_PYTHON_PP):$(XIVO_DAO_PYTHONPATH):$(XIVO_DIRD_PYTHONPATH):$(XIVO_AGENT_PYTHONPATH):$(XIVO_PROVD_PYTHONPATH):$(CTI_PP):$(BUS_PP)
TMP_PYTHONPATH=/root/build/lib/python2.7/site-packages
REMOTE_PYTHONPATH=/usr/lib/python2.7/dist-packages
REMOTE_PYTHON3PATH=/usr/lib/python3/dist-packages

# Local paths
AGENT_LOCAL_PATH=$(AGENT_PATH)/xivo_agent
AGI_LOCAL_PATH=$(AGI_PATH)/xivo_agid
ALEMBIC_LOCAL_PATH=$(XIVO_PATH)/xivo-manage-db/alembic/versions
AMID_LOCAL_PATH=$(XIVO_PATH)/xivo-amid/xivo_ami
ASTERISK_LOCAL_PATH=$(shell /usr/bin/dirname $(shell /usr/bin/find $(ASTERISK_PATH) -name 'BUGS'))
BUS_LOCAL_PATH=$(BUS_PATH)/xivo_bus
CALL_LOGS_LOCAL_PATH=$(CALL_LOGS_PATH)/xivo_call_logs
CONFGEN_LOCAL_PATH=$(CONFGEN_PATH)/xivo_confgen
CTI_LOCAL_PATH=$(CTI_PATH)/xivo_cti
CONFD_CLIENT_LOCAL_PATH=$(CONFD_CLIENT_PATH)/xivo_confd_client
DAO_LOCAL_PATH=$(DAO_PATH)/xivo_dao
DIALPLAN_LOCAL_PATH=$(CONFIG_PATH)/dialplan/asterisk
DIRD_LOCAL_PATH=$(DIRD_PATH)/xivo_dird
DIRD_CLIENT_LOCAL_PATH=$(DIRD_CLIENT_PATH)/xivo_dird_client
FETCHFW_LOCAL_PATH=$(FETCHFW_PATH)/xivo_fetchfw
LIB_PYTHON_LOCAL_PATH=$(LIB_PYTHON_PATH)/xivo
XIVO_DAO_LOCAL_PATH=$(XIVO_DAO_PYTHONPATH)/xivo_dao
SCCP_LOCAL_PATH=$(XIVO_PATH)/xivo-libsccp
STAT_LOCAL_PATH=$(XIVO_PATH)/xivo-stat
SYSCONF_LOCAL_PATH=$(SYSCONF_PATH)/xivo_sysconf
UPGRADE_LOCAL_PATH=$(XIVO_PATH)/xivo-upgrade
CONFD_LOCAL_PATH=$(CONFD_PATH)/xivo_confd
FETCHFW_DATA_LOCAL=$(FETCHFW_PATH)/xivo-fetchfw/resources/data/
WEBI_LOCAL_PATH=$(WEBI_PATH)/src
LIB_REST_CLIENT_LOCAL_PATH=$(LIB_REST_CLIENT_PATH)/xivo_lib_rest_client

# Remote paths
ALEMBIC_REMOTE_PATH=/usr/share/xivo-manage-db/alembic/versions
PYTHON_PACKAGES=/usr/lib/python2.7/dist-packages/
WEBI_REMOTE_PATH=/usr/share/xivo-web-interface
FETCHFW_DATA_PATH=/var/lib/xivo-fetchfw/installable
DIALPLAN_REMOTE_PATH=/usr/share/xivo-config/dialplan/asterisk

# Tags
AGI_TAGS=$(AGI_PATH)/TAGS
ASTERISK_TAGS=$(ASTERISK_PATH)/TAGS
BUS_TAGS=$(BUS_PATH)/TAGS
CONFD_TAGS=$(CONFD_PATH)/TAGS
CTI_TAGS=$(CTI_PATH)/TAGS
DAO_TAGS=$(DAO_PATH)/TAGS
DIRD_TAGS=$(DIRD_PATH)/TAGS
SCCP_TAGS=$(SCCP_PATH)/TAGS
WEBI_TAGS=$(WEBI_PATH)/TAGS

ASTERISK_CSCOPE_FILES=$(ASTERISK_PATH)/cscope.files
SCCP_CSCOPE_FILES=$(SCCP_PATH)/cscope.files

# Commands
SYNC=rsync -vrtlp --filter '- *.pyc' --filter '- *.git' --filter '- *~'
XIVO_LIBSCCP_BUILDH=./buildh
XIVO_LIBSCCP_DEP_COMMAND='apt-get update && apt-get install build-essential autoconf automake libtool asterisk-dev'

# shared targets
.PHONY : sync.bootstrap xivo.umount xivo.mount
sync.bootstrap:
	ssh -q $(XIVO_HOSTNAME) "mkdir -p ~/dev ${TMP_PYTHONPATH}"
	$(SYNC) $(XM_PATH)/bin/00-pre-upgrade.sh $(XIVO_HOSTNAME):"/usr/share/xivo-upgrade/post-stop.d/"

xivo.umount: auth.umount dao.umound dird.umount confgen.umount cti.umount dialplan.umount ctid-ng.umount confd.umount plugind.umount bus.umount plugind-cli.umount webhookd.umount admin-ui-market.umount wazo-auth-cli.umount xivo-websocketd.umount db.umount sysconfd.umount
	ssh -q $(XIVO_HOSTNAME) "mount | grep -q \"on /var/dev/xivo type\" && umount /var/dev/xivo"

xivo.mount:
	ssh -q $(XIVO_HOSTNAME) "mount | grep -q \"on /var/dev/xivo type\" || mount 10.37.0.1:${XIVO_PATH} /var/dev/xivo"

################################################################################
# wazo-auth
################################################################################
.PHONY : auth.sync auth.mount auth.orig auth.restart auth.umount auth.db-upgrade auth.db_downgrade
auth.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/wazo_auth type\" || mount --bind /var/dev/xivo/wazo-auth/wazo_auth ${REMOTE_PYTHONPATH}/wazo_auth"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on /usr/share/wazo-auth/alembic type\" || mount --bind /var/dev/xivo/wazo-auth/alembic /usr/share/wazo-auth/alembic"

auth.sync: auth.mount
	ssh $(XIVO_HOSTNAME) 'cd /var/dev/xivo/wazo-auth && python setup.py develop'

auth.umount:
	ssh $(XIVO_HOSTNAME) "umount ${REMOTE_PYTHONPATH}/wazo_auth || true"
	ssh $(XIVO_HOSTNAME) "umount /usr/share/wazo-auth/alembic || true"

auth.orig:
	ssh $(XIVO_HOSTNAME) "cd /var/dev/xivo/wazo-auth && python setup.py develop --uninstall"
	ssh $(XIVO_HOSTNAME) "rm -f /usr/local/bin/wazo-auth"

auth.restart:
	ssh $(XIVO_HOSTNAME) 'systemctl restart wazo-auth'

auth.db-upgrade:
	ssh -q $(XIVO_HOSTNAME) 'cd /usr/share/wazo-auth && alembic -c alembic.ini upgrade head'

auth.db-downgrade:
	ssh -q $(XIVO_HOSTNAME) 'cd /usr/share/wazo-auth && alembic -c alembic.ini downgrade -1'

################################################################################
# wazo-auth-cli
################################################################################
.PHONY : auth-cli.mount auth-cli.umount
auth-cli.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on /etc/wazo-auth-cli/config.yml type\" || mount --bind /var/dev/xivo/wazo-auth-cli/etc/wazo-auth-cli/config.yml /etc/wazo-auth-cli/config.yml"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/wazo_auth_cli type\" || mount --bind /var/dev/xivo/wazo-auth-cli/wazo_auth_cli ${REMOTE_PYTHON3PATH}/wazo_auth_cli"

auth-cli.umount:
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on /etc/wazo-auth-cli/config.yml type\" && umount /etc/wazo-auth-cli/config.yml"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/wazo_auth_cli type\" && mount --bind /var/dev/xivo/wazo-auth-cli/wazo_auth_cli ${REMOTE_PYTHON3PATH}/wazo_auth_cli || true"

################################################################################
# xivo-web-interface
################################################################################
.PHONY : webi.mount webi.ctags
webi.ctags:
	rm -f $(WEBI_TAGS)
	ctags -o $(WEBI_TAGS) -R -e --langmap=php:.php.inc $(WEBI_LOCAL_PATH)

webi.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q "${WEBI_REMOTE_PATH}" || mount --bind /var/dev/xivo/xivo-web-interface/src ${WEBI_REMOTE_PATH}"

# xivo-fetchfw
.PHONY : fetchfw.sync
fetchfw.sync:
	$(SYNC) $(FETCHFW_LOCAL_PATH) $(XIVO_HOSTNAME):$(PYTHON_PACKAGES)
	$(SYNC) $(FETCHFW_DATA_LOCAL) $(XIVO_HOSTNAME):$(FETCHFW_DATA_PATH)

################################################################################
# xivo-agentd
################################################################################
.PHONY : agentd.mount agentd-restart agentd.umuont
agentd.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/xivo_agent type\" || mount --bind /var/dev/xivo/xivo-agentd/xivo_agent ${REMOTE_PYTHONPATH}/xivo_agent"

agentd.umount:
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/xivo_agent type\" && umount ${REMOTE_PYTHONPATH}/xivo_agent || true"

agentd.restart:
	ssh $(XIVO_HOSTNAME) 'systemctl restart xivo-agentd'

################################################################################
# xivo-agentd-client
################################################################################
.PHONY : agentd-client.sync
agentd-client.sync:
	$(SYNC) --delete $(XIVO_PATH)/xivo-agentd-client $(XIVO_HOSTNAME):/tmp
	ssh $(XIVO_HOSTNAME) 'cd /tmp/xivo-agentd-client && python setup.py develop'

################################################################################
# xivo-agentd-cli
################################################################################
.PHONY : agentd-cli.sync
agentd-cli.sync:
	$(SYNC) $(XIVO_PATH)/xivo-agentd-cli/xivo_agentd_cli $(XIVO_HOSTNAME):$(PYTHON_PACKAGES)

# xivo-agid
.PHONY : agi.sync agi.ctags
agi.sync:
	$(SYNC) $(AGI_LOCAL_PATH) $(XIVO_HOSTNAME):$(PYTHON_PACKAGES)
	ssh $(XIVO_HOSTNAME) '/etc/init.d/xivo-agid restart'

agi.ctags:
	rm -f $(AGI_TAGS)
	ctags -o $(AGI_TAGS) -R -e $(AGI_LOCAL_PATH)

# xivo-amid
.PHONY : amid.sync
amid.sync:
	$(SYNC) $(AMID_LOCAL_PATH) $(XIVO_HOSTNAME):$(PYTHON_PACKAGES)

# xivo-backup
.PHONE : backup.sync
backup.sync:
	$(SYNC) $(BACKUP_PATH)/bin/ $(XIVO_HOSTNAME):/usr/sbin

################################################################################
# xivo-bus
################################################################################

.PHONY : bus.mount bus.umount bus.clean bus.tags
bus.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/xivo_bus type\" || mount --bind /var/dev/xivo/xivo-bus/xivo_bus ${REMOTE_PYTHONPATH}/xivo_bus"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/xivo_bus type\" || mount --bind /var/dev/xivo/xivo-bus/xivo_bus ${REMOTE_PYTHON3PATH}/xivo_bus"

bus.umount:
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/xivo_bus type\" && umount ${REMOTE_PYTHONPATH}/xivo_bus || true"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/xivo_bus type\" && umount ${REMOTE_PYTHON3PATH}/xivo_bus || true"

bus.tags: bus.clean
	ctags -o $(BUS_TAGS) -R -e $(BUS_LOCAL_PATH)

bus.clean:
	rm -rf $(BUS_PATH)/.tox
	find $(BUS_PATH) -name '*.pyc' -delete
	rm -f $(BUS_TAGS)

################################################################################
# wazo-call-logd
################################################################################

.PHONY : call-logs.mount call-logs.umount
call-logs.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/wazo_call_logd type\" || mount --bind /var/dev/xivo/wazo-call-logd/wazo_call_logd ${REMOTE_PYTHON3PATH}/wazo_call_logd"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on /etc/wazo-call-logd/config.yml type\" || mount --bind /var/dev/xivo/wazo-call-logs/etc/wazo-call-logd/config.yml /etc/wazo-call-logd/config.yml"

call-logs.umount:
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/wazo_call_logd type\" && umount ${REMOTE_PYTHON3PATH}/wazo_call_logd || true"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on /etc/wazo-call-logd/config.yml type\" && umount /etc/wazo-call-logd/config.yml || true"

################################################################################
# xivo-confgen
################################################################################
.PHONY : confgen.sync confgen.umount
confgend.sync: sync.bootstrap confgend.umount
	rsync -av --delete --exclude "*.git" --exclude "*.tox" $(CONFGEN_PATH)/ $(XIVO_HOSTNAME):~/dev/xivo-confgend
	ssh -q $(XIVO_HOSTNAME) "cd ~/dev/xivo-confgend && PYTHONPATH=${TMP_PYTHONPATH} python setup.py install --prefix=~/build"
	ssh -q $(XIVO_HOSTNAME) "mount --bind ~/dev/xivo-confgend/build/lib.linux-*-2.7/xivo_confgen ${REMOTE_PYTHONPATH}/xivo_confgen"

confgend.umount:
	ssh -q $(XIVO_HOSTNAME) 'umount ${REMOTE_PYTHONPATH}/xivo_confgen || true'
	ssh -q $(XIVO_HOSTNAME) 'umount ${REMOTE_PYTHONPATH}/xivo_confgen-*.egg-info || true'

################################################################################
# xivo-ctid
################################################################################

.PHONY : cti.mount cti.ctags cti.clean cti.umount cti.restart
cti.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/xivo_cti type\" || mount --bind /var/dev/xivo/xivo-ctid/xivo_cti ${REMOTE_PYTHONPATH}/xivo_cti"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on /etc/xivo-ctid/config.yml type\" || mount --bind /var/dev/xivo/xivo-ctid/etc/xivo-ctid/config.yml /etc/xivo-ctid/config.yml"

cti.umount:
	ssh -q $(XIVO_HOSTNAME) 'umount ${REMOTE_PYTHONPATH}/xivo_cti || true'
	ssh -q $(XIVO_HOSTNAME) 'umount /etc/xivo-ctid/config.yml || true'

cti.ctags: cti.clean
	ctags -o $(CTI_TAGS) -R -e $(CTI_LOCAL_PATH)
	ctags -o $(CTI_TAGS) -R -e -a $(XIVO_DAO_LOCAL_PATH)
	ctags -o $(CTI_TAGS) -R -e -a $(LIB_PYTHON_LOCAL_PATH)

cti.clean:
	rm -rf $(CTI_PATH)/.tox
	find $(CTI_PATH) -name '*.pyc' -delete
	rm -f $(CTI_TAGS)

cti.restart:
	ssh -q $(XIVO_HOSTNAME) 'systemctl restart xivo-ctid.service'

################################################################################
# xivo-ctid-ng
################################################################################

.PHONY: ctid-ng.mount ctid-ng.umount
ctid-ng.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/xivo_ctid_ng type\" || mount --bind /var/dev/xivo/xivo-ctid-ng/xivo_ctid_ng ${REMOTE_PYTHONPATH}/xivo_ctid_ng"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on /etc/xivo-ctid-ng/config.yml type\" || mount --bind /var/dev/xivo/xivo-ctid-ng/etc/xivo-ctid-ng/config.yml /etc/xivo-ctid-ng/config.yml"

ctid-ng.umount:
	ssh $(XIVO_HOSTNAME) 'umount /etc/xivo-ctid-ng/config.yml || true'
	ssh $(XIVO_HOSTNAME) "umount ${REMOTE_PYTHONPATH}/xivo_ctid_ng || true"

################################################################################
# xivo-dao
################################################################################
.PHONY : dao.mount dao.umount dao.sync dao.ctags
dao.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/xivo_dao type\" || mount --bind /var/dev/xivo/xivo-dao/xivo_dao ${REMOTE_PYTHONPATH}/xivo_dao"

dao.umount:
	ssh $(XIVO_HOSTNAME) "umount ${REMOTE_PYTHONPATH}/xivo_dao || true"

dao.sync:
	$(SYNC) $(DAO_LOCAL_PATH) $(XIVO_HOSTNAME):$(PYTHON_PACKAGES)

dao.ctags:
	rm -f $(DAO_TAGS)
	ctags -o $(DAO_TAGS) -R -e $(DAO_LOCAL_PATH)

################################################################################
# xivo-manage-db
################################################################################
.PHONY : db.mount db.umount db.upgrade db.downgrade
db.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on /usr/share/xivo-manage-db/alembic type\" || mount --bind /var/dev/xivo/xivo-manage-db/alembic /usr/share/xivo-manage-db/alembic"

db.umount:
	ssh $(XIVO_HOSTNAME) "umount /usr/share/xivo-manage-db/alembic || true"

db.upgrade:
	ssh -q $(XIVO_HOSTNAME) 'cd /usr/share/xivo-manage-db && alembic upgrade +1'

db.downgrade:
	ssh -q $(XIVO_HOSTNAME) 'cd /usr/share/xivo-manage-db && alembic downgrade -1'

################################################################################
# consul
################################################################################

.PHONY : consul.sync consul.restart
consul.sync:
	rsync -av $(CONSUL_PATH)/debian/init $(XIVO_HOSTNAME):/etc/init.d/consul
	ssh -q $(XIVO_HOSTNAME) 'chmod +x /etc/init.d/consul'

consul.restart:
	ssh -q $(XIVO_HOSTNAME) 'service consul restart'

# xivo-dird
.PHONY : dird.sync dird.umount dird.ctags dird.clean dird.restart dird.db-upgrade dird.db-downgrade
dird.sync: dird.umount sync.bootstrap
	rsync -av --delete --exclude "*.git" --exclude "*.tox" $(DIRD_PATH)/ $(XIVO_HOSTNAME):~/dev/xivo-dird
	ssh -q $(XIVO_HOSTNAME) "cd ~/dev/xivo-dird && PYTHONPATH=${TMP_PYTHONPATH} python setup.py install --prefix=~/build"
	ssh -q $(XIVO_HOSTNAME) "mount --bind ${TMP_PYTHONPATH}/xivo_dird-*-py2.7.egg/xivo_dird ${REMOTE_PYTHONPATH}/xivo_dird"
	ssh -q $(XIVO_HOSTNAME) "mount --bind ${TMP_PYTHONPATH}/xivo_dird-*-py2.7.egg/EGG-INFO ${REMOTE_PYTHONPATH}/xivo_dird-$(shell $(DIRD_PATH)/setup.py --version).egg-info"
	ssh -q $(XIVO_HOSTNAME) "mount --bind ~/dev/xivo-dird/alembic /usr/share/xivo-dird/alembic"

dird.umount:
	ssh -q $(XIVO_HOSTNAME) "umount ${REMOTE_PYTHONPATH}/xivo_dird || true"
	ssh -q $(XIVO_HOSTNAME) "umount ${REMOTE_PYTHONPATH}/xivo_dird-*.egg-info || true"
	ssh -q $(XIVO_HOSTNAME) "umount /usr/share/xivo-dird/alembic || true"

dird.ctags: dird.clean
	ctags -o $(DIRD_TAGS) -R -e $(DIRD_PATH)/xivo_dird
	ctags -o $(DIRD_TAGS) -R -e -a $(LIB_PYTHON_LOCAL_PATH)
	ctags -o $(DIRD_TAGS) -R -e -a $(XIVO_PATH)/xivo-auth-client/xivo_auth_client
	ctags -o $(DIRD_TAGS) -R -e -a $(XIVO_PATH)/xivo-lib-rest-client/xivo_lib_rest_client
	ctags -o $(DIRD_TAGS) -R -e -a $(XIVO_PATH)/xivo-confd-client/xivo_confd_client

dird.clean:
	rm -rf $(DIRD_PATH)/.tox
	find $(DIRD_PATH) -name '*.pyc' -delete
	rm -f $(DIRD_TAGS)

dird.restart:
	ssh -q $(XIVO_HOSTNAME) 'service xivo-dird restart'

dird.db-upgrade:
	ssh -q $(XIVO_HOSTNAME) 'cd /usr/share/xivo-dird && alembic -c alembic.ini upgrade head'

dird.db-downgrade:
	ssh -q $(XIVO_HOSTNAME) 'cd /usr/share/xivo-dird && alembic -c alembic.ini downgrade -1'

# xivo-doc
.PHONY : doc.build
doc.build:
	cd $(DOC_PATH) && make html

.PHONY : doc.clean
doc.clean:
	cd $(DOC_PATH) && make clean

.PHONY : doc.rebuild
doc.rebuild: doc.clean doc.build

################################################################################
# xivo-lib-python
################################################################################
.PHONY : lib-python.mount lib-python.umount
lib-python.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/xivo type\" || mount --bind /var/dev/xivo/xivo-lib-python/xivo ${REMOTE_PYTHONPATH}/xivo"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/xivo type\" || mount --bind /var/dev/xivo/xivo-lib-python/xivo ${REMOTE_PYTHON3PATH}/xivo"

lib-python.umount:
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/xivo type\" && umount ${REMOTE_PYTHONPATH}/xivo || true"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/xivo type\" && umount ${REMOTE_PYTHON3PATH}/xivo || true"

################################################################################
# xivo-libsccp
################################################################################
.PHONY : sccp.sync
sccp.sync:
	cd $(SCCP_LOCAL_PATH)/xivo-libsccp && $(XIVO_LIBSCCP_BUILDH) makei

.PHONY : sccp.dep
sccp.dep:
	ssh $(XIVO_HOSTNAME) $(XIVO_LIBSCCP_DEP_COMMAND)

.PHONY : sccp.setup
sccp.setup:
	cd $(SCCP_LOCAL_PATH)/xivo-libsccp && $(XIVO_LIBSCCP_BUILDH) init

.PHONY : sccp.ctags
sccp.ctags:
	rm -f $(SCCP_TAGS)
	ctags -o $(SCCP_TAGS) -R -e $(SCCP_LOCAL_PATH)
	ctags -o $(SCCP_TAGS) -R -e -a $(ASTERISK_LOCAL_PATH)

.PHONY : sccp.cscope
sccp.cscope:
	rm -f $(SCCP_CSCOPE_FILES)
	find $(SCCP_LOCAL_PATH) -name "*.c" -o -name "*.h" > $(SCCP_CSCOPE_FILES)
	find $(ASTERISK_LOCAL_PATH) -name "*.c" -o -name "*.h" >> $(SCCP_CSCOPE_FILES)

# xivo-provd
.PHONY : provd.sync
provd.sync:
	$(SYNC) $(XIVO_PROVD_PYTHONPATH)/provd $(XIVO_HOSTNAME):$(PYTHON_PACKAGES)
	$(SYNC) $(XIVO_PROVD_PYTHONPATH)/debian/xivo-provd.service $(XIVO_HOSTNAME):/lib/systemd/system/xivo-provd.service

################################################################################
# xivo-provd-cli
################################################################################

.PHONY : provd-cli.sync
provd-cli.sync:
	$(SYNC) $(XIVO_PATH)/xivo-provd-cli/xivo_provd_cli $(XIVO_HOSTNAME):$(PYTHON_PACKAGES)

################################################################################
# xivo-upgrade
################################################################################

.PHONY : upgrade.sync
upgrade.sync:
	$(SYNC) $(UPGRADE_LOCAL_PATH)/bin/ $(XIVO_HOSTNAME):/usr/bin/

################################################################################
# xivo-confd
################################################################################

.PHONY : confd.mount confd.umount confd.ctags confd.clean confd.restart

confd.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/xivo_confd type\" || mount --bind /var/dev/xivo/xivo-confd/xivo_confd ${REMOTE_PYTHONPATH}/xivo_confd"

confd.umount:
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/xivo_confd type\" && umount ${REMOTE_PYTHONPATH}/xivo_confd || true"

confd.clean:
	rm -rf $(CONFD_PATH)/.tox
	find $(CONFD_PATH) -name '*.pyc' -delete
	rm -f $(CONFD_TAGS)

confd.ctags: confd.clean
	ctags -o $(CONFD_TAGS) -R -e $(CONFD_PATH)/xivo_confd
	ctags -o $(CONFD_TAGS) -R -e -a $(LIB_PYTHON_LOCAL_PATH)
	ctags -o $(CONFD_TAGS) -R -e -a $(XIVO_PATH)/xivo-auth-client/xivo_auth_client
	ctags -o $(CONFD_TAGS) -R -e -a $(XIVO_PATH)/xivo-lib-rest-client/xivo_lib_rest_client
	ctags -o $(CONFD_TAGS) -R -e -a $(XIVO_PATH)/xivo-dao/xivo_dao

confd.restart:
	ssh -q $(XIVO_HOSTNAME) 'service xivo-confd restart'

################################################################################
# xivo-sysconf
################################################################################
.PHONY : sysconfd.mount sysconfd.umount
sysconfd.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/xivo_sysconf type\" || mount --bind /var/dev/xivo/xivo-sysconfd/xivo_sysconf ${REMOTE_PYTHONPATH}/xivo_sysconf"

sysconfd.umount:
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/xivo_sysconf type\" && umount ${REMOTE_PYTHONPATH}/xivo_sysconf || true"

# xivo-stat
.PHONY : stat.sync
stat.sync:
	$(SYNC) $(STAT_LOCAL_PATH) $(XIVO_HOSTNAME):$(PYTHON_PACKAGES)

# asterisk
.PHONY : asterisk.clean asterisk.generate asterisk.refresh asterisk.ctags asterisk.cscope
asterisk.clean:
	rm -fr $(ASTERISK_PATH)/asterisk/tmp/

asterisk.ctags:
	rm -f $(ASTERISK_TAGS)
	ctags -o $(ASTERISK_TAGS) -R -e -a $(ASTERISK_LOCAL_PATH)

asterisk.cscope:
	rm -f $(ASTERISK_CSCOPE_FILES)
	find $(ASTERISK_LOCAL_PATH) -name "*.c" -o -name "*.h" >> $(ASTERISK_CSCOPE_FILES)

asterisk.generate:
	$(ASTERISK_PATH)/asterisk/prepare_test_sources.sh

asterisk.refresh: asterisk.clean asterisk.generate sccp.ctags sccp.cscope

################################################################################
# dialplan
################################################################################

.PHONY : dialplan.sync dialplan.reload dialplan.reload dialplan.umount
dialplan.reload:
	ssh -q $(XIVO_HOSTNAME) 'asterisk -rx "dialplan reload"'

dialplan.sync: dialplan.umount sync.bootstrap
	rsync -av --delete --exclude "*.git" --exclude "*.tox" $(DIALPLAN_LOCAL_PATH)/ $(XIVO_HOSTNAME):~/dev/dialplan
	ssh -q $(XIVO_HOSTNAME) 'mount --bind ~/dev/dialplan/ $(DIALPLAN_REMOTE_PATH)'

dialplan.umount:
	ssh -q $(XIVO_HOSTNAME) 'umount $(DIALPLAN_REMOTE_PATH) || true'

################################################################################
# lib-rest-client
################################################################################

.PHONY : lib-rest-client.mount
lib-rest-client.mount:
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/xivo_lib_rest_client type\" || mount --bind /var/dev/xivo/xivo-lib-rest-client/xivo_lib_rest_client ${REMOTE_PYTHON3PATH}/xivo_lib_rest_client"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/xivo_lib_rest_client type\" || mount --bind /var/dev/xivo/xivo-lib-rest-client/xivo_lib_rest_client ${REMOTE_PYTHONPATH}/xivo_lib_rest_client"

lib-rest-client.umount:
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/xivo_lib_rest_client type\" && umount ${REMOTE_PYTHON3PATH}/xivo_lib_rest_client || true"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/xivo_lib_rest_client type\" && umount ${REMOTE_PYTHONPATH}/xivo_lib_rest_client || true"

.PHONY : dird-client.sync
dird-client.sync:
	$(SYNC) --delete $(XIVO_PATH)/xivo-dird-client $(XIVO_HOSTNAME):/tmp
	ssh $(XIVO_HOSTNAME) 'cd /tmp/xivo-dird-client && python setup.py develop'

################################################################################
# confd-client
################################################################################

.PHONY : confd-client.sync confd-client.umount confd-client.clean

confd-client.sync: confd-client.umount confd-client.clean sync.bootstrap
	rsync -av --delete --exclude "*.git" --exclude "*.tox" $(CONFD_CLIENT_PATH)/ $(XIVO_HOSTNAME):~/dev/xivo-confd-client
	ssh -q $(XIVO_HOSTNAME) "cd ~/dev/xivo-confd-client && PYTHONPATH=${TMP_PYTHONPATH} python setup.py install --prefix=~/build"
	ssh -q $(XIVO_HOSTNAME) 'mount --bind ~/dev/xivo-confd-client/xivo_confd_client ${REMOTE_PYTHONPATH}/xivo_confd_client'
	ssh -q $(XIVO_HOSTNAME) "mount --bind ~/dev/xivo-confd-client/xivo_confd_client.egg-info ${REMOTE_PYTHONPATH}/xivo_confd_client-1.1.2.egg-info"

confd-client.umount:
	ssh -q $(XIVO_HOSTNAME) 'umount ${REMOTE_PYTHONPATH}/xivo_confd_client || true'
	ssh -q $(XIVO_HOSTNAME) 'umount ${REMOTE_PYTHONPATH}/xivo_confd_client-*.egg-info || true'

confd-client.clean:
	rm -rf $(CONFD_CLIENT_PATH)/.tox
	find $(CONFD_CLIENT_PATH) -name '*.pyc' -delete

################################################################################
# auth-client
################################################################################

.PHONY : auth-client.sync
auth-client.sync:
	$(SYNC) --delete $(XIVO_PATH)/xivo-auth-client $(XIVO_HOSTNAME):/tmp
	ssh $(XIVO_HOSTNAME) 'cd /tmp/xivo-auth-client && python setup.py develop'

################################################################################
# monitoring
################################################################################

.PHONY : monitoring.mount monitoring.umount
monitoring.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "cat /proc/mounts | awk '{ print $2 }' | grep -q /usr/share/xivo-monitoring/checks || mount --bind /var/dev/xivo/xivo-monitoring/checks /usr/share/xivo-monitoring/checks"

monitoring.umount:
	ssh $(XIVO_HOSTNAME) "cat /proc/mounts | awk '{ print $2 }' | grep -q /usr/share/xivo-monitoring/checks && umount /usr/share/xivo-monitoring/checks || true"

################################################################################
# ctid-ng-client
################################################################################

.PHONY: ctid-ng-client.sync ctid-ng-client.umount ctid-ng-client.clean
ctid-ng-client.sync: ctid-ng-client.umount ctid-ng-client.clean sync.bootstrap
	rsync -av --delete --exclude "*.git" --exclude "*.tox" $(CTID_NG_CLIENT_PATH)/ $(XIVO_HOSTNAME):~/dev/xivo-ctid-ng-client
	ssh -q $(XIVO_HOSTNAME) "cd ~/dev/xivo-ctid-ng-client && PYTHONPATH=${TMP_PYTHONPATH} python setup.py install --prefix=~/build"
	ssh -q $(XIVO_HOSTNAME) 'mount --bind ~/dev/xivo-ctid-ng-client/xivo_ctid_ng_client ${REMOTE_PYTHONPATH}/xivo_ctid_ng_client'
	ssh -q $(XIVO_HOSTNAME) "mount --bind ~/dev/xivo-ctid-ng-client/xivo_ctid_ng_client.egg-info ${REMOTE_PYTHONPATH}/xivo_ctid_ng_client-0.1.egg-info"

ctid-ng-client.umount:
	ssh -q $(XIVO_HOSTNAME) 'umount ${REMOTE_PYTHONPATH}/xivo_ctid_ng_client || true'
	ssh -q $(XIVO_HOSTNAME) 'umount ${REMOTE_PYTHONPATH}/xivo_ctid_ng_client-*.egg-info || true'

ctid-ng-client.clean:
	rm -rf $(CTID_NG_CLIENT_PATH)/.tox
	find $(CTID_NG_CLIENT_PATH) -name '*.pyc' -delete

################################################################################
# wazo-plugind
################################################################################
.PHONY : plugind.mount plugind.umount
plugind.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/wazo_plugind type\" || mount --bind /var/dev/xivo/wazo-plugind/wazo_plugind ${REMOTE_PYTHON3PATH}/wazo_plugind"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on /usr/lib/wazo-plugind/templates type\" || mount --bind /var/dev/xivo/wazo-plugind/templates /usr/lib/wazo-plugind/templates"

plugind.umount:
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on /usr/lib/wazo-plugind/templates type\" && umount /usr/lib/wazo-plugind/templates || true"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/wazo_plugind type\" && umount ${REMOTE_PYTHON3PATH}/wazo_plugind || true"

################################################################################
# wazo-webhookd
################################################################################
.PHONY : webhookd.mount webhookd.umount webhookd.sync webhookd.db-upgrade webhookd.db-downgrade
webhookd.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/wazo_webhookd type\" || mount --bind /var/dev/xivo/wazo-webhookd/wazo_webhookd ${REMOTE_PYTHON3PATH}/wazo_webhookd"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on /usr/share/wazo-webhookd/alembic type\" || mount --bind /var/dev/xivo/wazo-webhookd/alembic /usr/share/wazo-webhookd/alembic"

webhookd.umount:
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/wazo_webhookd type\" && umount ${REMOTE_PYTHON3PATH}/wazo_webhookd || true"
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on /usr/share/wazo-webhookd/alembic type\" && umount /usr/share/wazo-webhookd/alembic || true"

webhookd.sync: webhookd.mount
	ssh $(XIVO_HOSTNAME) 'cd /var/dev/xivo/wazo-webhookd && python3 setup.py develop'

webhookd.db-upgrade:
	ssh -q $(XIVO_HOSTNAME) 'cd /usr/share/wazo-webhookd && alembic -c alembic.ini upgrade head'

webhookd.db-downgrade:
	ssh -q $(XIVO_HOSTNAME) 'cd /usr/share/wazo-webhookd && alembic -c alembic.ini downgrade -1'

################################################################################
# wazo-plugind-cli
################################################################################
.PHONY : plugind-cli.mount plugind-cli.umount
plugind-cli.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/wazo_plugind_cli type\" || mount --bind /var/dev/xivo/wazo-plugind-cli/wazo_plugind_cli ${REMOTE_PYTHON3PATH}/wazo_plugind_cli"

plugind-cli.umount:
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/wazo_plugind_cli type\" && umount ${REMOTE_PYTHON3PATH}/wazo_plugind_cli || true"

################################################################################
# xivo-websocketd
################################################################################
.PHONY: websocketd.mount websocketd.umount
websocketd.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/xivo_websocketd type\" || mount --bind /var/dev/xivo/xivo-websocketd/xivo_websocketd ${REMOTE_PYTHON3PATH}/xivo_websocketd"

websocketd.umount:
	ssh $(XIVO_HOSTNAME) "umount ${REMOTE_PYTHON3PATH}/xivo_websocketd || true"

.PHONY: token.admin token.user
token.admin:
	@read -p "Username: " username; \
	curl -ksX POST --header 'Content-Type: application/json' --header 'Accept: application/json' -u $$username  -d '{"backend": "xivo_service", "expiration": 36000}' "https://${XIVO_HOSTNAME}:9497/0.1/token" | jq -r '.[] | .token'

token.user:
	@read -p "Username: " username; \
	curl -ksX POST --header 'Content-Type: application/json' --header 'Accept: application/json' -u $$username  -d '{"backend": "xivo_user", "expiration": 36000}' "https://${XIVO_HOSTNAME}:9497/0.1/token" | jq -r '.[] | .token'

################################################################################
# admin-ui
################################################################################
.PHONY: admin-ui.mount admin-ui.umount
admin-ui.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHON3PATH}/wazo_admin_ui type\" || mount --bind /var/dev/xivo/wazo-admin-ui/wazo_admin_ui ${REMOTE_PYTHON3PATH}/wazo_admin_ui"

admin-ui.umount:
	ssh $(XIVO_HOSTNAME) "umount ${REMOTE_PYTHON3PATH}/wazo_admin_ui || true"

################################################################################
# admin-ui-plugins
################################################################################
.PHONY: admin-ui-market.mount admin-ui-market.umount
admin-ui-market.mount: xivo.mount
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/wazo_admin_ui_market type\" || mount --bind /var/dev/xivo/wazo-admin-ui-market/wazo_admin_ui_market ${REMOTE_PYTHONPATH}/wazo_admin_ui_market"

admin-ui-market.umount:
	ssh $(XIVO_HOSTNAME) "mount | grep -q \"on ${REMOTE_PYTHONPATH}/wazo_admin_ui_market type\" && umount ${REMOTE_PYTHONPATH}/wazo_admin_ui_market || true"

redpajama_set_name: RedPajamaGithub


text:
solutions@nitec.com My Nitec
Nitec
Services News Blog Partners About Contact
X = Solutions
Services News Blog Partners About Contact Sign up to our Newsletter
Managed Services Network Security Cloud Computing Software Development Hybrid Solutions Unified Communications
History X = Solutions Case Studies Careers Placement Opportunities Awards & Accreditations
Nitec Student Successes
Nitec is delighted to welcome several new faces that have joined us on a placement year as part of their university studies, as well as a couple of familiar faces who have returned after their recent graduations.
New Additions to the Teams
Callum Norris is spending his placement year working alongside the Consultancy team and has been studying his degree in Computer Science at Ulster University. Despite originally wanting to be a programmer, Callum's position in the Consultancy team has provided him with a breadth of knowledge spanning the whole of IT, which he feels has been both to his benefit and enjoyment.
"From my time at Nitec, I hope to gain knowledge and experience covering all areas of IT. Although I have only been here a few months, so far I've learned more than my previous 2 years at university because I'm receiving hands on training from an incredibly intelligent and friendly group of people."
Matthew Webster is working as part of the Service Desk team during his Computer Science placement year, also studying for his degree at Ulster University.
"I hope to gain a lot of experience and new skills at Nitec that I wouldn't be able to pick up from my degree alone, and I'm hoping this will allow me to eventually go into business within the IT/Software industry."
Matthew Simpson has joined the Software Development team for a year's placement, however he is already a familiar face in the Nitec office as he had previously completed a placement period at Nitec during his foundation degree before going on to study and complete with a Software Engineering degree from Ulster University. Having completed his studies, Matthew jumped at the opportunity to join the team again and gain more experience in the industry.
"During this placement, my main aim is to improve the quality of my software development. Having only having been here for 2 months, I can already see my level of understanding increase which has a direct impact on my level of development and this is all thanks to the software development team here at Nitec as they are able to guide me in the right direction whenever I experience a problem.
"Once my placement comes to an end, I would hope to find myself in a full–time development role, hopefully somewhere as half as supportive and understanding as Nitec have been! Though a holiday somewhere first is not out of the question…"
Bronagh McKay has joined the newly created Network Monitoring team for her placement year, as part of her degree in Computing and Information Technology at Queen's University Belfast.
"From my placement at Nitec I hope to gain hands on experience within the IT industry, and so far I have been learning more than I thought was possible. Everyone at Nitec has been extremely welcoming which has allowed me to settle in very fast. I can already tell that I will have expanded my skills and knowledge of IT by the end of my placement which will help me to progress with my degree and a successful career in IT."
Nitec has a history of providing students with invaluable placement opportunities, developing their skills and capabilities, and ensuring they are equipped with the knowledge they need for their chosen career path.
Andrew Mulholland from Queen's University Belfast and Eleanor Heath from Ulster University are amongst Nitec's previous students. Andrew recently graduated with a first–class honours in Computer Science and has commenced employment at Nitec as a Dev Ops Engineer. Eleanor also graduated with a first–class honours in Computing, along with a distinction in her Diploma in Professional Practice, based on her placement year at Nitec.
Speaking of her placement, Eleanor said, "The placement year Nitec offered me, and the experience I gained from this, really helped me. It was an excellent placement and prepared me well for my fourth and final year."
We'd love to hear from you, call us on
News History X = Solutions Case Studies Careers Placement Opportunities
Contact Partners Certification My Nitec Privacy & Cookies Complaints Procedure
Antrim Technology Park
Belfast Road
Antrim BT41 1QS
E solutions@nitec.com
© Nitec Solutions Ltd
Registered in Northern Ireland. Reg: NI33468
©2020 Nitec Solutions Ltd


text:
Shine a light: vertical farming in London and beyond
The potential of hydroponic farms for food production in the urban environment is huge, with restaurants throughout the capital using leaves grown minutes away
by Mike Gibson
Vertical farming at Crate to Plate
Published: Wednesday 14th September 2022
A good few years ago, heading underground at Clapham Common left me speechless.
Nope, not a particularly memorable jaunt up the Northern Line, but an urban farming project, Growing Underground , that had taken residence in Tube tunnels that had been unused since the war, and therefore provided the perfect environment for a forward-thinking new way of farming herbs and vegetables. In the years since then, hydroponic or 'vertical' farming has begun to knock on the door of the mainstream, as the conversation about how we continue to feed an urban populace largely separated from the land that produces its food has intensified.
And for good reason: the movement to bring the problems of biodiversity, widespread use of fossil-fuel-dependent fertilisers and continuing deterioration of soil health that blight the UK's farmland is a far bigger issue, but alleviating some pressure via tech-forward farming is nevertheless a great idea. The benefits are multi-layered, cutting out food miles, and in turn offering chefs a reliable supply chain for things like herbs, micro-vegetables, salad leaves and more. Growing Underground's effort continues at pace, and elsewhere the excellent Crate to Place, set up by Sebastien Sainsbury, grows produce under LED lights in a nutrient-rich water solution in storage containers in Kentish Town, Elephant & Castle and Canary Wharf. The brand works directly with restaurants like Chantelle Nicholson 's Apricity and Ollie Dabbous's Hide , and can claim a carbon footprint of pretty much zero, as well as ingredients grown with significantly less water usage than industrial farming, and with no pesticides or herbicides used.
Vertical farming at Growing Underground
Leaves under the lights at Crate to Plate
For a template of how far this could yet go in the UK, there's no better place than Italy's Agricola Moderna, one of the most ambitious hydroponic food farms in the world, set up in 2018 by co-founders Pierluigi Giuliani and Benjamin Franchetti, the latter of whom trained as a mechanical engineer and has a PhD and Masters from Imperial College in London. The two run the operation with an exacting, scientific approach, but are also learning as they go in what is a wild new frontier of food production. The team use highly specific data sets to continually improve the output of the operation, and are already looking for new headquarters after outgrowing their current site in Melzo, Lombardy.
It's important to reiterate that urban farms like Agricola Moderna, Crate to Plate and Growing Underground aren't necessarily the answer to all of our problems. At the moment, most focus on leafy vegetables and salad leaves, produce that doesn't form the majority of most people's diet. Moreover, a properly functioning agricultural system – one that includes plants and animals living together in harmonious, natural landscapes – is not only a net-zero operation, but removes more than it produces, owing to healthy soil's incredible ability to sequester carbon. The accepted science is that this requires natural biodiversity, acres of grasslands, crops grown in and around each other rather than monoculturally, and grazing ruminants to fertilise the soil – all things that hydroponic farms can't offer. But the route out of the industrial food system that's led to so many ecological problems won't be down to one solution alone, and as long as much of the country's population lives in cities, the reprieve offered by hydroponics can be a powerful ally.


text:
Trump Calls Hillary Clinton The Devil, Then Threatens To Throw Her In Jail If He's Elected
This is fascism.
By Karoli Kuns — October 9, 2016
During tonight's debate, Donald Trump made a really disturbing statement about what he would do if he ever got into the Oval Office.
Going off about the deleted personal emails, Trump growled, "If I win, I am going to instruct my Attorney General to get a special prosecutor to look into your situation, because there has never been so many lies, so much deception, there has never been anything like it, and we're going to have a special prosecutor."
That is a threat to use the power of the presidency to prosecute a political opponent. We do not do that in this country.
This came after Trump said he was surprised that "Bernie signed on with the devil." Is it any wonder that his supporters think she's Satan in a pantsuit?
When the time came for Clinton to respond, she expressed no surprise. "Everything he just said is absolutely false. But I'm not surprised."
Fact check: She's right. It's absolutely false.
She then used her response to remind the audience that "it's just awfully good that someone with the temperament of Donald Trump is not in charge of the law in our country."
Donald just couldn't resist the snappy comeback to that, confirming that yes, he is a fascist and would have no problem using executive power to persecute political enemies, when he said, "Because you'd be in jail."
During the entire debate, he was utterly creepy about how he used his stature and position on the stage to intimidate her, to no avail. But every woman watching that understood exactly what he was doing, causing many to share their own experiences on Twitter.
Note to my male friends who might not realize: Trump's standing behind her is a bullying tactic. Abusive men do this to us all the time.
— Melissa Ryan (@MelissaRyan) October 10, 2016
Hillary is right. This man is completely, totally and unequivocally unqualified to set one single foot in the Oval Office. He can never be allowed near the levers of power.
Debate, Donald Trump, Fascism, Hillary Clinton
Trump Calls Clinton The Devil, Then Threatens To Throw Her In Jail If He's Elected
Heather — Oct 9th, 2016
Hillary Clinton Threatens To Sue Fox News For Defamation
NewsHound Ellen — Feb 18th, 2022
Donald Trump Raises Possibility Of 'Second Amendment Remedies' If Clinton Elected
Karoli Kuns — Aug 9th, 2016
Haley: 'Never Sleep With The Devil Because Then The Devil Owns You'
David Edwards — Mar 6th, 2022
Clinton On Obama And SCOTUS: Together, We Have To Defend All Of Our Rights
Red Painter — Mar 15th, 2016
Trump Proposes Second Amendment Remedies If Hillary Gets Elected
Ed Scarce — Aug 9th, 2016


RollingParty.com facilitates impressive tailgate parties from coast to coast utilizing luxury executive motorcoaches/suites for events of all types across the country. You'll find these hospitality experts entertaining guests at major sporting events nationwide, such as Football Championships, World Series, NASCAR, Kentucky Derby, Golf & Tennis Tournaments, Concerts, Shows and so much more.
Their coaches are large, late model, luxury units with the most up to date equipment, amenities and systems worthy of the most discriminating guest. They provide everything your event requires from tents, fire pits, chaffing dishes, etc. to professional sound and video equipment, right down to tables, tents, chairs, cups and ice, or simply safe, comfortable and enjoyable transportation to conferences, outings, tours, and events.
RollingParty staff are highly trained, courteous and experienced. Their job is to ensure your event goes perfectly in every way including transporting guests safely, setting up, ensuring your mobile suite and all of its systems work smoothly throughout your event, and cleaning up afterwards. They have done hundreds of events just like yours and are able to foresee and avoid the pitfalls those less experienced may encounter that could ruin your experience.
Consider joining the long list of Organizations, Celebrities, and Athletes who have entrusted RollingParty.com with entertaining their guests.