text:
December 3, 2020 /4 Comments/in Book Recommendations, Books /by Dakota
Amid all the upheaval of 2020, at least I found time to read amazing books. Some were heavy, while others transported me to other worlds. (Like I did sitting in the van with the view above, immersed in the world of Dune.)
Turning off the news and disappearing into a book served as an important reset for me. I suppose it always does…
Before we get to the books, a request of all you erudite Traipsing readers: please send me your book recommendations! I'm constantly impressed by the quality ideas you send my way, so keep them coming.
Quick Note On My Reading Process
I borrow most books digitally from the library using the Libby app. I mostly read on a Kindle, which allows easy highlighting of favorite passages and is great for travel.
Then I export those highlights to Readwise so I can revisit them frequently. It's majorly upped my retention and I love it! (If you feel guilty for not buying the books, did you know libraries a) pay more for their copies and b) also buy new digital copies after ~30 rentals?)
Enough chit chat – let's do this. Here are my favorite books from 2020! (For those of you who prefer hard copy books, all links below point to Indiebound.com, which supports local bookstores.)
Everything She Touched by Marilyn Chase: A look into the world of Ruth Asawa, a Japanese-American woman pursuing art against so many odds. Rising above racism and internment during WWII, she created marvelous sculptures while raising six kids AND diving into civic engagement in San Francisco.
I Never Had It Made by Jackie Robinson: The autobiography of the famous Black baseball player, the first allowed to play in the major leagues. Like all my favorite biographies, this goes beyond what the person DID and looks deeper and wider. Performing at the level he did while under enormous pressure astonishes me.
Ansel Adams by Ansel Adams: Everyone knows his name and iconic Yosemite black and white photos, but did you know Ansel Adams was also a classically trained pianist? Or that photography wasn't even considered art when he started making photos of Yosemite in the 1920s!? A story of his life, but also a history of early 20th-century photography since he was so intertwined in it.
The World's Fastest Man by Michael Kranish: This biography opened the door to a world I'd never heard of: bike racing in the 1880s! It chronicles the life of Major Taylor, a Black racer who wowed crowds of thousands all over the world, all wrapped into the astonishing rise (and fall) of bicycles in the United States.
Today We Die a Little! by Richard Askwith: Emil Zatopek was a Czech runner probably most famous for winning gold medals in the 5k, 10k and marathon in the 1952 Olympics. (What?!) Beyond that is an unswervingly friendly man who bridged the East/West divide to race (and win) all over the world during the Cold War.
Broken Earth Trilogy by N.K. Jemisin: One of those series where life felt a bit empty after I finished it! Any fantasy reader will love this absorbing narrative wrapped around fabulous world-building. Each of the books won a Hugo for Best Novel (2016-2018), making N.K. Jemisin the first Black woman (or man, for that matter) to win the award.
Dune by Frank Herbert: The metric by which so much science fiction is measured, Lord of the Rings for scifi… so many accolades. Rereading this was an absolute pleasure and I'm excited to continue on in the series.
The Moon Is a Harsh Mistress by Robert A. Heinlein: More 1960s scifi! Revolution on the moon aided by an AI computer named Mike. I don't always enjoy older scifi, but this captivated me.
The Glass Hotel by Emily St. John Mandel: A glass hotel in the wilderness, a Wall Street investor with a secret, and a swirl of artists with intersecting lives. GO!
What Makes Sammy Run? by Budd Schulberg: Set in Hollywood, every sentence in this book feels handcrafted, fine-tuned, and/or witty. The theme of striving too hard and the costs of that intensity brought me back to my single-minded focus on money and business in my 20s. (Ack.)
The Overstory by Richard Powers: A Pulitzer winner as complicated and layered as the arching canopy of the trees the author venerates and celebrates. A call to action, a novel, and a love story about the forest wrapped into one book.
The Course of Love by Alain de Botton: An intriguing format for a "novel": a story of two people meeting and living out their lives…but with occasional insightful commentary from the philosopher author. SO good.
Less by Andrew Sean Greer: This Pulitzer winner made me laugh out loud while crying at the same time. Warning: it starts slowly (Chelsea and I abandoned the audiobook), but I'm glad I picked up the book again later. Witty, entertaining, touching, hilarious… Stick with it!
Where the Crawdads Sing by Delia Owens: The story of an abandoned girl growing up in the marshes of North Carolina.
The Hidden Life of Trees by Peter Wohlleben: I dove into the natural world this year via our garden project, but also via the Seek app (thanks Alastair) and books. The complexity and adaptability of trees opened my eyes and deepened my appreciation for them, whether I'm deep in a forest or sitting in my backyard. This book is fun and approachable, not some dry science tome.
Braiding Sweetgrass by Robin Wall Kimmerer: A lyrical, crafted gem of a book about the author's interactions with nature. From wandering the Oregon coast in a rainstorm to rescuing salamanders on New York highways at night to the ebb and flow of living on a farm, I loved all of it. And I say this as someone who does not read books like this very often!
The Woman's Hour by Elaine F. Weiss: The incredible story of the fight for women's suffrage in the U.S.. As other countries finally realized the error of their ways in the early 1800s, the battle raged on for 100 years (!) in the U.S. What astonished me was the staunch anti-vote stance of so many women who trotted out B.S. like "politics will overwhelm the fragile constitution of women" and "dissolution of the family will occur." (COUGH patriarchy much?)
The Warmth of Other Suns by Isabel Wilkerson: The story of the great migration of Black southerners to the north and west in the 1900s. For 50+ years, over 6 million people upended their lives in search of a better life and drastically changed the face of northern cities as well as the places they left behind. Written as a narrative of various people who undertook the journey, this book is brilliant.
Being Mortal by Atul Gawande: I read this prior to the pandemic, but it's even more compelling in the face of COVID-19. How do we thrive during the final years of our lives? A powerful takeaway for me was that the things we want for aging parents (safety and loss of autonomy) are often things we would never wish on ourselves.
How to Be an Antiracist by Ibram X. Kendi: This book upended so much of my progressive, back-patting misconceptions about what it means to be a true ally and anti-racist. Kendi does this in a vulnerable, non-judgmental way by sharing his path and personal racist beliefs as a Black man in America.
Empire of the Summer Moon by S.C. Gwynne: Holy crap the Comanches were badasses! An intense, fascinating book about the rulers of the plains who held off the encroaching settlers and U.S. soldiers into the 1870s.
Figuring by Maria Popova: Written by the brilliant author of BrainPickings.org, this book links together pioneering women (many of them queer) from the 1800s into the 1900s. From poets to astronomers to authors to sculptors, the depth of power and conviction of the women illuminated in this book blew me away.
Leadership: In Turbulent Times by Doris Kearns Goodwin: My biggest takeaway: they all surrounded themselves with people who questioned their viewpoints. More importantly, they listened to those people!"I do not like that man. I must get to know him better."
The Talent Code by Daniel Coyle: What do brilliant performers have in common? From tennis to chess to music, there's a common code in place. (Deliberate practice, a catalyst, and mentorship.) An engaging, useful book that helped me tailor how I practice piano and approach any learning project.
That's it for this round! Please send me your recommendations and why you dug them, I'm all ears.
Tags: book list, books, books to read, favorite books, library books
https://www.traipsingabout.com/wp-content/uploads/2020/12/Nice-view-for-reading-scaled.jpg 1920 2560 Dakota https://www.traipsingabout.com/wp-content/uploads/2018/03/Traipsing-About-logo-white-background-450x156.png Dakota2020-12-03 06:00:002020-12-02 21:19:17The Best Books I Read In 2020
Save Money, Travel Light: Borrow Ebooks from the Library
Recommended Reads, Summer 2015
Reading Recommendations, Spring 2016 (Plus Vader Arrives)
Cathy Porter says:
I liked Station Eleven by Emily St. John Mandel
Go Jules Go says:
Ooh thank you for this early Christmas gift! And a good prompt for me to consider getting back into fiction – with the exception of a sparkly vampire here and there, in adulthood it's been all self-help and memoirs for this gal! Although I have to admit it's "The Talent Code" that's calling to me first!
Go Jules Go recently posted…BEST T-SHIRT COLLECTION EVER?
ron hyman says:
The Labrynth of Solitude by Octavio Paz.This book is as relevant today as when it won the Nobel about 60 years ago. So very important to understand our loving neighbor to the south that sends us a steady stream of wonderful people.
Jono Sanders says:
I endorse Lonesome Dove! I read it for the third time this year and it paints a clear path of what a truly hard life it would be to drive cattle across the US. Ouch.
And such good writing! I guess that's why it won a Pulitzer Prize…
Posturing Ain't Pretty (and Other Desert Teachings)
Circling Back to the Oregon Coast and California Redwoods


우리는 중국에서 고속 포장 백 제조 업체 및 공급 업체 / 공장 전문화되어 있습니다. 고속 포장 백 중 하나 인 Dongguan Sunway Packaging Material Co., Ltd 중국 유명 브랜드 중 하나 인 저렴한 가격 / 저렴한 가격으로 고품질의 고속 포장 백 도매업.
Wholesale 고속 포장 백 from China, Need to find cheap 고속 포장 백 as low price but leading manufacturers. Just find high-quality brands on 고속 포장 백 produce factory, You can also feedback about what you want, start saving and explore our 고속 포장 백, We'll reply you in fastest.


Spam: Always Annoying, Often Offensive - InternetNews.
Many Internet users are doing without their indispensable e-mail as their inboxes become increasingly overrun with unwanted — and often offensive — messages. A comprehensive study by the Pew Internet & American Life Project found that a full 60 percent of survey respondents have reduced their e-mail usage because of spam, and 73 percent avoid giving out their e-mail addresses.
The June 2003 survey of nearly 1,400 Internet users reveals the growing frustration now associated with the communication app, particularly on personal e-mail accounts. The Pew report found that while e-mail users receive slightly more messages in their work accounts, the proportion of spam in personal accounts is higher and more time is spent dealing with the unwanted messages in personal accounts.
The payoff for spammers lies in the 1 percent of recipients who give money as a response to an unsolicited commercial e-mail (UCE), the 7 percent who order a product or service, and the 4 percent who provide the personal information that is requested in the UCE — data that has become valuable currency on the Internet.
Deborah Fallows, senior research fellow at the Pew Internet & American Life Project and author of the report, believes that legislation against spam is inevitable, but a mix of methods will be needed to completely kill UCE. "That [legislation] alone won't stop the spam; it will be a combination of legislation, technology and litigation against the spammers — tipping the balance where it's harder, riskier, more awkward for spammers to operate."
Women are more affected by spam than men, particularly when the content is offensive or obscene. "The general findings are striking, but inside the data are even more disturbing details about the reactions women and parents have with pornographic spam," said Fallows. "Pornographers deserve a special place in hell as far as they are concerned."
Younger Internet users are more tolerant of UCE, and veteran surfers are more sophisticated about spam, the Pew study also revealed. Nearly one-third of those aged 18-29 say spam is just part of life on the Internet and not a big deal, compared to 18 percent of those over age 30.
Fallows comments on the potential for users to become desensitized to UCE: "I think users' tolerance for spam does have a limit. I don't know where that limit is, but I don't think spam will get to the point of killing e-mail — where people will just give up. I think there will be enough pressure against spam to lower its buzz to a low enough level that people will tolerate it and calm down to where a degree of spam is just 'part of the deal.'"
On the state of tolerance, Fallows adds, "Right now, we're probably somewhere in between; it's gotten bad enough that forces (technology, legislation, litigation) are mustered to take action. But not so high that users are jumping ship. And it will likely be forced down to a lower level we can live with more easily."


Demand for pesticide adjuvants in the US is forecast to grow 3.8% yearly through 2021. Genetically modified seeds will continue to represent a growing share of crops planted, though seed varieties engineered with resistance to insect pests and diseases will limit demand for insecticides and fungicides and their corresponding adjuvants. Glyphosate will continue to represent the largest single end use for pesticide adjuvants.
This Freedonia industry study presents historical demand data plus forecasts for 2021 by product (surfactants & emulsifiers, drift control agents, oil concentrates, compatibility agents, water conditioners), pesticide (glyphosate, atrazine, 2,4-D, S-metolachlor, dicamba, other herbicides, insecticides, fungicides), and market (agriculture, commercial, consumer). The study also evaluates company market share and provides competitive analysis on industry participants including Agrium, Akzo Nobel, Clariant International, Crodo International, Dow Chemical, Evonik, Helena Chemical, Huntsman, Land O'Lakes, Lonza, and Solvay.


text:
Q: How to get method which returns the String version of the Fraction in the form of "numerator / denominator" of fraction /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package fractioncal;

import static java.lang.Integer.sum;
import java.util.Scanner;

/**
 *
 * @author abdallah
 */
public class FractionCal {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.println("Fraction Calculator");
        System.out.println("Enter first fraction");
        String firstfraction = s.nextLine();
        System.out.println("Enter second fraction");
        String secondfraction = s.nextLine();
        System.out.println("Processing "+firstfraction+","+secondfraction);

        String frac0 = firstfraction.substring(0,1);
        String frac1 = firstfraction.substring(2,3);

        int numerator1 = Integer.parseInt(frac0);
        int denominator1 = Integer.parseInt(frac1);

        String frac2 = secondfraction.substring(0,1);
        String frac3 = secondfraction.substring(2,3);
        int numerator2 = Integer.parseInt(frac2);
        int denominator2 = Integer.parseInt(frac3);
        int sum = getAdd(numerator1, numerator2,denominator1,denominator2,firstfraction);

        System.out.println("Sum ="+sum);

    }
    public static int getAdd(int numerator1, int numerator2,int denominator1, int denominator2,String firstfraction ){

        int numer = (numerator1 * denominator2) + (denominator1 * numerator2);
        int deno = (denominator1*denominator2);

        return sum(numer,deno);
    }
}

A: Your getAdd() method should be like this:
public static String getAdd(int numerator1, int numerator2, int denominator1, int denominator2) {

    int numer = (numerator1 * denominator2) + (denominator1 * numerator2);
    int deno = (denominator1 * denominator2);

    return numer + "/" + deno;
}

For input:
1/3 and 2/4

Output:
Sum =10/12

redpajama_set_name: RedPajamaStackExchange


We do not accept P. BOXES – PLEASE PROVIDE A PHYSICAL ADDRESS. We advise you to use a reputable carrier service when returning your goods. Please check the Voltage information and make sure it matches the one in your country. In case it's not stated in the description, do ask us. We guarantee that your issue will be solved quickly. We usually respond within 24 hours on weekdays. Air Hogs Thunder Trax is adventure on any terrain, in any season! Thick treads maintain control on grass, gravel, mud, water, and even snow! Seamlessly transition from land to water with the push of a button???????? Thunder Trax transforms on water from tank to boat to take you anywhere. Remote 2.4GHz communication puts you in control, and easy USB charging puts you back on the road faster. Go wild with Thunder Trax, the transforming all terrain vehicle from Air Hogs! – Tackle different terrains in any location during any season – including sand, snow, grass, gravel, mud, and water. 2.4GHz radio communications for precise, long-range control. Transforms from tank to boat with the push of a button. Thunder Trax is for ages 8+. Requires 3 AA batteries (not included). Air Hogs, Thunder Trax Rc Vehicle, 2.4 Ghz Kids Toy Console For Kids Boys Girls. The item "Air Hogs, Thunder Trax Rc Vehicle, 2.4 Ghz Kids Toy Console For Kids Boys Girls" is in sale since Wednesday, October 25, 2017. This item is in the category "Toys & Hobbies\Radio Control & Control Line\RC Model Vehicle Parts & Accs\Body Parts & Interior\Cars, Trucks & Motorcycles". The seller is "motti8554″ and is located in US. This item can be shipped to United States, Canada, Denmark, Romania, Slovakia, Bulgaria, Czech republic, Finland, Hungary, Latvia, Lithuania, Malta, Estonia, Australia, Greece, Portugal, Cyprus, Slovenia, Japan, Sweden, South Korea, Indonesia, Taiwan, South africa, Thailand, Belgium, France, Hong Kong, Ireland, Netherlands, Poland, Spain, Italy, Germany, Austria, Mexico, New Zealand, Philippines, Singapore, Switzerland, Norway, Ukraine, Croatia, Malaysia, Brazil, Chile, Colombia, Costa rica, Dominican republic, Panama, Trinidad and tobago, Guatemala, El salvador, Honduras, Jamaica, Antigua and barbuda, Aruba, Belize, Dominica, Grenada, Saint kitts and nevis, Saint lucia, Montserrat, Turks and caicos islands, Barbados, Bangladesh, Bermuda, Brunei darussalam, Bolivia, Ecuador, Egypt, French guiana, Guernsey, Gibraltar, Guadeloupe, Iceland, Jersey, Cambodia, Cayman islands, Liechtenstein, Sri lanka, Luxembourg, Monaco, Macao, Martinique, Maldives, Nicaragua, Peru, Pakistan, Paraguay, Reunion, United Kingdom.


"I'm getting a lot thrown at me here right off," he said, smiling.
Herron's postgame retirement after the Stallions' overtime loss to Daniel in the second round of the playoffs caught everyone off guard, Hare included.
Herron's departure closes the book on a wildly successful chapter in South Pointe's young football history. Herron won 102 games and led the Stallions to five state titles in seven seasons. The 2017 team went 15-0 and won the school's fourth straight state title, and Herron was named the 2018 U.S. Army National Coach of the Year. After his onfield retirement announcement several weeks ago, Herron pointed out that he was retiring from "public education" and that he wasn't done coaching, only that he'd lost his passion for teaching.
Hare taught physical education at Sullivan Middle School for the last 10 years, before replacing Lance Roberts, who retired over the summer, as South Pointe's AD. Conner is also in his first year at the helm of the school. Now the pair have to make one of the highest profile decisions a high school administrator can make in Rock Hill, S.C.
Not every Stallion "will become a Clowney or a Gilmore," and Hare and Conner want to make sure those South Pointe students -- a huge majority of the football program -- are developed as people. Herron indicated to Hare that was an area in which he thought South Pointe's football program had made great progress in recent years, notably the weekly life skills programs that the team held every Wednesday.
Hare is not sure if he will reach out to candidates, or just wait and see who applies. He and Conner have received emails from interested candidates already. It won't be easy for whoever gets the job.
Even undefeated, Chester is the underdog against Dillon. How do they feel about it?


SPOTIFY ONLINE music streaming service takes away the need to subscribe to its premium service by allowing you to enjoy music through its All-New Free on Spotify option.
The new, ad-supported All-New Free on Spotify, which was launched in April, is designed to allow users to have a fun music experience with the redesigned Android and iOS app.
The Free on Spotify has five must-use features that make your listening experience more tailored to what you like.
The first feature that you must use to enjoy other features afterwards is the Taste Onboarding.
After you have downloaded and signed into the free app for the first time, you will be prompted to select five or more artists you like.
Your selection will allow Spotify's server to analyse your favourite artists, songs and genres. From your choices, Spotify will create some welcome playlists for you and tailor your home screen for easier music discovery. Moreover, the app will gradually learn from your listening experience to better recommend and introduce artists you are likely to love.
Free on Spotify will then use the data from your Taste Onboarding to present you with 15 personalised and curated playlists that will be particular to you based on your music tastes and your streaming habits.
The On-Demand Playlists include Discover Weekly and up to six Daily Mixes. These lists will update frequently based on how you interact with them and with the rest of the music you listen to.
When you listen to other playlists in the free service, you must listen to the playlists in shuffle play mode and the number of tracks you can skip is limited.
That said, within the On-Demand Playlists, you can play songs in any order and skip as much as you like. The more you stream, the quicker the On-Demand Playlists will become available and you can find them on your home screen.
I found during the trial that Free on Spotify compiled an enjoyable "Your Welcome Mix" list for me after I selected my favourite artists. Most of the songs were rock numbers from the '70s, '80s and '90s, which are hard to find on radio now.
Selecting artists was intuitive. After I selected an artist, Spotify provided artists with similar genres and styles for me to choose.
I then found my On-Demand Playlists such as Daily Mix 1 and Discover Weekly that were in line with my personal tastes.
The third useful feature of the Free on Spotify is Assisted Playlisting. You just start with a title, and then choose a few tracks. In the meantime, Spotify starts recommending songs for you to add with the tap of a button. Spotify will show songs based on artists in the playlist, your taste profile, and even the title of your playlist – particularly songs with that theme or word in the lyrics.
For example, I created a "Rock ballads" playlist and I started with "Soldier of Fortune" by Deep Purple and "Before the Dawn" by Judas Priest. Spotify then recommended several more slow numbers for me to easily add to the list. The recommended songs included Deep Purple's "When a Blind Man Cries", Rainbow's "The Temple of The King" and Led Zeppelin's "Stairway to Heaven".
The fourth feature that free users will love is "Personalize by Liking and Hiding".
Free on Spotify will provide you with like and hide buttons that you can use to get recommendations tailored just for you. The like button is presented as the heart icon and the hiding as the ban icon (circle with a slash).
While you are listening to songs from a list, you can note songs you like by tapping the heart icon. You can also do this with artists, albums and playlists. This will teach the app to learn what you love and want to hear more of.
All your liked songs will appear in a new playlist called "Your Favourites" and new tracks from artists you have listened to will appear in your Release Radar.
On the contrary, when you tap the "hide" icon, the app will ensure that you don't have to hear that song or others similar to it.
While paid users can download songs to enjoy music offline to save data connection, Free on Spotify provides a Data Saver feature that allows free users to optimise the listening experience to use less mobile data. Data Saver streams at a lower bit rate so you can listen to more music with less guilt. Data Saver isn't a default setting, so make sure to switch it on in your settings tab.
Anyway, if you want you can subscribe for Spotify Premium for Bt129 a month to download songs and listen without being interrupted by ads. The Spotify Premium also allows you to play songs on your smartphone and to skip songs in any playlist without limit.
The premium service has improved sound quality and comes with Spotify Connect to stream music to Wi-Fi speakers that have built-in Chromecast.
These days, Spotify has more than 180 million users, including 83 million-plus Spotify Premium subscribers across 65 markets. Spotify says it has over 35 million tracks for streaming.
Spotify has just celebrated the first anniversary of its service in Thailand and marked the occasion by announcing that "Avorn" by Polycat topped the list of Top Hits Thailand and "Pen Rai Mai" by OG-ANIClazyloxy topped the list of Thai Pop Hits.


You can always update all of the metadata associated with a salon media element. These include, any metadata you can access through media manager such as "tags", "questions", "title/description", "active dates", 'individual/group modes" etc. You can access the media manager from salon repository or from salon-all media. You must be the owner of the media to update any media.
If you would like to change the content of the media, you will have to remove the media, and then upload new media.


We use the best practices to get your page to the top of the search engine rankings.
SEO stands for Search Engine Optimization and it is an umbrella for a host of things such as Link Building, Content Marketing, On-Page Optimization, Citation Building, and a host of other buzzwords that directly impact your rankings on search engines such as the almighty Google, Bing, and Yahoo.
SEO Encompasses Paid Search, Map Listings (Local Search), and the trusted Organic Search.
Fair enough but what is REAL SEO?
Well everyone else has a buzzword why can't we! SEO going back to 1998 didn't change that drastically for a decade, build your site, build some links to your site, and watch the traffic flood in. The algorithm got better so you needed not just a host of link but you needed those links from similar sources to your content. If you have a bike repair shop you now needed links from other bike related websites.
Even then it was still fairly simplistic, put the keywords you want to rank for on your site, get the links, and watch the traffic pour in.
Then Google evolved the algorithm again and now it mattered where on your site the keywords are and what the linking text (alt text) to your site was.
This goes on at infinitum it seems so let's just say SEO became very technical. By that I mean we started looking at class c IP addresses, alt text saturation, keyword effectiveness indexes, and a host of other factors. In the past year, Google has changed that. In the past year we've come a long way as to what SEO really is.
SEO used to be about fine tuning a website for search spiders (what I used to call spider food), today's SEO adds components such as social spread and earning links through great content. SEO used to be an isolated part of your marketing, you used to be able to do it once a year or one-time even. Now it's part of your ongoing strategy.
make sure they find you first.


You can improve your vision and regain clarity of the world again. Vision Improvement is possible. Your eyes want to see. Natural vision is as easy and effortless as smelling a rose or listening to your favorite song.
Vision improvement is a journey of remembering and relearning our ability to sense the world clearly and effortlessly. It is a process of allowing perfect vision to return to us once again.
We provide you with the needed resources to help you on your journey to better vision. Not only will you learn the essential techniques and routines for improving eyesight, you will also find the guidance and coaching that is going to propel your learning journey and help you reach your vision improvement goals.
On the road to perfect vision, you will learn, or re-learn, the visual skills that will allow you to see clearly.
Here you will find the opportunity to receive professional and compassionate guidance from a certified Natural Vision Improvement Teacher. I have seen with my own eyes that vision can improve. And sometimes it is helpful to have support from someone who has been there.
Yes, I have had profound success with vision improvement and the Bates Method. However, I also had years of frustrations as I did all the wrong things and not enough of the right things.
Ever since my first pair of glasses, when I was eleven years old, I desperately wished there was another way. I did not want to wear glasses for the rest of my life and I would have given anything to have someone teach me how to improve my eyesight naturally.
Then, in my early 20's, I finally found my way to vision improvement and the Bate's Method. I was ecstatic. It was a lifelong dream finally coming true. I was going to get out of my glasses. Boy was I wrong. I just didn't get it. I understood most of the concepts and even practiced the suggested activities. But...my approach was all wrong. I didn't understand the finer points that make or break you. I made all the mistakes that people make when they say, "Yeah, I tried the Bates Method. It didn't work for me."
I was discouraged and down on myself, but I didn't give up. After years of researching all the available material I could find on the Bates Method and vision improvement, I finally got it. Not just intellectually, but in my body. In my eyes and in my mind, I got it.
Vision improvement has deeply affected all aspects of my life for the better. It is too good not to share. I want to help others reclaim their natural vision. After years of desperate wishing, followed by years of failed attempts and extensive research, I know that I am in a position to be in service to others.
You don't have to make all the mistakes I made. With the proper guidance you can stay focused on your path to clarity!
How do you begin this journey of reconnecting to natural eyesight that beams with vital energy?
First, take a deep breath, relax, and thank your eyes for all of the hard work they have been doing for you.
Next, get oriented to the essential elements of this approach by reading the section on the Bates Method.
Also, make sure to absorb the advice in the Eye Exercises section. This will clue you in to some of the subtle points of the Bates Method that can often get overlooked. There is a certain quality, or way to behold, all of the exercises and activities that really can make all of the difference.
Furthermore, look into the coaching options that exist. When we have such engrained habits of strain it is all too easy to replace one effort for another. Coaching can help you relearn essential visual habits in an effective manner that allows vision to happen rather than trying to force your eyesight to improve.
Finally, our visual experience has a lot to do with our relationship to the world and ourselves. Since you are going to be cultivating healthy meaningful relationships, don't forget to eat well, get good sleep, and take good care of yourself. Surround yourself with supportive friends and family and live a healthy, happy life!


text:
import os
import sys
import re
import json
import random
import shutil
import time
import datetime
import logging
import logging.handlers

from Utils.WAAgentUtil import waagent
from ConfigOptions import ConfigOptions

mfile = os.path.join(os.getcwd(), 'HandlerManifest.json')
with open(mfile,'r') as f:
    manifest = json.loads(f.read())[0]
    Version = manifest['version']

StatusTest = {
    "Scheduled" : {
        "Idle" : None,
        "Healthy" : None
    },
    "Oneoff" : {
        "Idle" : None,
        "Healthy" : None
    }
}

try:
    from scheduled.idleTest import is_vm_idle
    StatusTest["Scheduled"]["Idle"] = is_vm_idle
except:
    pass

try:
    from oneoff.idleTest import is_vm_idle
    StatusTest["Oneoff"]["Idle"] = is_vm_idle
except:
    pass

try:
    from scheduled.healthyTest import is_vm_healthy
    StatusTest["Scheduled"]["Healthy"] = is_vm_healthy
except:
    pass

try:
    from oneoff.healthyTest import is_vm_healthy
    StatusTest["Oneoff"]["Healthy"] = is_vm_healthy
except:
    pass

class AbstractPatching(object):
    """
    AbstractPatching defines a skeleton neccesary for a concrete Patching class.
    """
    def __init__(self, hutil):
        self.hutil = hutil
        self.syslogger = None

        self.patched = []
        self.to_patch = []
        self.downloaded = []
        self.download_retry_queue = []

        # Patching Configuration
        self.disabled = None
        self.stop = None
        self.reboot_after_patch = None
        self.category = None
        self.install_duration = None
        self.oneoff = None
        self.interval_of_weeks = None
        self.day_of_week = None
        self.start_time = None
        self.download_time = None
        self.download_duration = 3600
        self.gap_between_stage = 60
        self.current_configs = dict()

        self.category_required = ConfigOptions.category["required"]
        self.category_all = ConfigOptions.category["all"]

        # Crontab Variables
        self.crontab = '/etc/crontab'
        self.cron_restart_cmd = 'service cron restart'
        self.cron_chkconfig_cmd = 'chkconfig cron on'

        # Path Variables
        self.cwd = os.getcwd()
        self.package_downloaded_path = os.path.join(self.cwd, 'package.downloaded')
        self.package_patched_path = os.path.join(self.cwd, 'package.patched')
        self.stop_flag_path = os.path.join(self.cwd, 'StopOSPatching')
        self.history_scheduled = os.path.join(self.cwd, 'scheduled/history')
        self.scheduled_configs_file = os.path.join(self.cwd, 'scheduled/configs')
        self.dist_upgrade_list = None
        self.dist_upgrade_list_key = 'distUpgradeList'
        self.dist_upgrade_all = False
        self.dist_upgrade_all_key = 'distUpgradeAll'

        # Reboot Requirements
        self.reboot_required = False
        self.open_deleted_files_before = list()
        self.open_deleted_files_after = list()
        self.needs_restart = list()

    def is_string_none_or_empty(self, str):
        if str is None or len(str) < 1:
            return True
        return False

    def parse_settings(self, settings):
        disabled = settings.get("disabled")
        if disabled is None or str(disabled).lower() not in ConfigOptions.disabled:
            msg = "The value of parameter \"disabled\" is empty or invalid. Set it False by default."
            self.log_and_syslog(logging.WARNING, msg)
            self.disabled = False
        else:
            if str(disabled).lower() == "true":
                self.disabled = True
            else:
                self.disabled = False
        self.current_configs["disabled"] = str(self.disabled)
        if self.disabled:
            msg = "The extension is disabled."
            self.log_and_syslog(logging.WARNING, msg)
            return

        stop = settings.get("stop")
        if stop is None or str(stop).lower() not in ConfigOptions.stop:
            msg = "The value of parameter \"stop\" is empty or invalid. Set it False by default."
            self.log_and_syslog(logging.WARNING, msg)
            self.stop = False
        else:
            if str(stop).lower() == 'true':
                self.stop = True
            else:
                self.stop = False
        self.current_configs["stop"] = str(self.stop)

        reboot_after_patch = settings.get("rebootAfterPatch")
        if reboot_after_patch is None or reboot_after_patch.lower() not in ConfigOptions.reboot_after_patch:
            msg = "The value of parameter \"rebootAfterPatch\" is empty or invalid. Set it \"rebootifneed\" by default."
            self.log_and_syslog(logging.WARNING, msg)
            self.reboot_after_patch = ConfigOptions.reboot_after_patch[0]
        else:
            self.reboot_after_patch = reboot_after_patch.lower()
        waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                  op=waagent.WALAEventOperation.Enable,
                                  isSuccess=True,
                                  version=Version,
                                  message="rebootAfterPatch="+self.reboot_after_patch)
        self.current_configs["rebootAfterPatch"] = self.reboot_after_patch

        category = settings.get('category')
        if category is None or category.lower() not in ConfigOptions.category.values():
            msg = "The value of parameter \"category\" is empty or invalid. Set it " + self.category_required + " by default."
            self.log_and_syslog(logging.WARNING, msg)
            self.category = self.category_required
        else:
            self.category = category.lower()
        waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                  op=waagent.WALAEventOperation.Enable,
                                  isSuccess=True,
                                  version=Version,
                                  message="category="+self.category)
        self.current_configs["category"] =  self.category

        self.dist_upgrade_list = settings.get(self.dist_upgrade_list_key)
        if not self.is_string_none_or_empty(self.dist_upgrade_list):
            self.current_configs[self.dist_upgrade_list_key] = self.dist_upgrade_list

        dist_upgrade_all = settings.get(self.dist_upgrade_all_key)
        if dist_upgrade_all is None:
            msg = "The value of parameter \"{0}\" is empty or invalid. Set it false by default.".format(self.dist_upgrade_all_key)
            self.log_and_syslog(logging.INFO, msg)
            self.dist_upgrade_all = False
        elif str(dist_upgrade_all).lower() == 'true':
            self.dist_upgrade_all = True
        else:
            self.dist_upgrade_all = False
        self.current_configs[self.dist_upgrade_all_key] = str(self.dist_upgrade_all)

        check_hrmin = re.compile(r'^[0-9]{1,2}:[0-9]{1,2}$')
        install_duration = settings.get('installDuration')
        if install_duration is None or not re.match(check_hrmin, install_duration):
            msg = "The value of parameter \"installDuration\" is empty or invalid. Set it 1 hour by default."
            self.log_and_syslog(logging.WARNING, msg)
            self.install_duration = 3600
            self.current_configs["installDuration"] = "01:00"
        else:
            hr_min = install_duration.split(':')
            self.install_duration = int(hr_min[0]) * 3600 + int(hr_min[1]) * 60
            self.current_configs["installDuration"] = install_duration
        if self.install_duration <= 300:
            msg = "The value of parameter \"installDuration\" is smaller than 5 minutes. The extension will not reserve 5 minutes for reboot. It is recommended to set \"installDuration\" more than 30 minutes."
            self.log_and_syslog(logging.WARNING, msg)
        else:
            msg = "The extension will reserve 5 minutes for reboot."
            # 5 min for reboot
            self.install_duration -= 300
            self.log_and_syslog(logging.INFO, msg)

        # The parameter "downloadDuration" is not exposed to users. So there's no log.
        download_duration = settings.get('downloadDuration')
        if download_duration is not None and re.match(check_hrmin, download_duration):
            hr_min = download_duration.split(':')
            self.download_duration = int(hr_min[0]) * 3600 + int(hr_min[1]) * 60

        oneoff = settings.get('oneoff')
        if oneoff is None or str(oneoff).lower() not in ConfigOptions.oneoff:
            msg = "The value of parameter \"oneoff\" is empty or invalid. Set it False by default."
            self.log_and_syslog(logging.WARNING, msg)
            self.oneoff = False
        else:
            if str(oneoff).lower() == "true":
                self.oneoff = True
                msg = "The extension will run in one-off mode."
            else:
                self.oneoff = False
                msg = "The extension will run in scheduled task mode."
            self.log_and_syslog(logging.INFO, msg)
        self.current_configs["oneoff"] = str(self.oneoff)

        if not self.oneoff:
            start_time = settings.get('startTime')
            if start_time is None or not re.match(check_hrmin, start_time):
                msg = "The parameter \"startTime\" is empty or invalid. It defaults to 03:00."
                self.log_and_syslog(logging.WARNING, msg)
                start_time = "03:00"
            self.start_time = datetime.datetime.strptime(start_time, '%H:%M')
            self.download_time = self.start_time - datetime.timedelta(seconds=self.download_duration)
            self.current_configs["startTime"] = start_time

            day_of_week = settings.get("dayOfWeek")
            if day_of_week is None or day_of_week == "":
                msg = "The parameter \"dayOfWeek\" is empty. dayOfWeek defaults to Everyday."
                self.log_and_syslog(logging.WARNING, msg)
                day_of_week = "everyday"
                self.day_of_week = ConfigOptions.day_of_week["everyday"]
            else:
                for day in day_of_week.split('|'):
                    day = day.strip().lower()
                    if day not in ConfigOptions.day_of_week:
                        msg = "The parameter \"dayOfWeek\" is invalid. dayOfWeek defaults to Everyday."
                        self.log_and_syslog(logging.WARNING, msg)
                        day_of_week = "everyday"
                        break
                if "everyday" in day_of_week:
                    self.day_of_week = ConfigOptions.day_of_week["everyday"]
                else:
                    self.day_of_week = [ConfigOptions.day_of_week[day.strip().lower()] for day in day_of_week.split('|')]
            waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                      op=waagent.WALAEventOperation.Enable,
                                      isSuccess=True,
                                      version=Version,
                                      message="dayOfWeek=" + day_of_week)
            self.current_configs["dayOfWeek"] = day_of_week

            interval_of_weeks = settings.get('intervalOfWeeks')
            if interval_of_weeks is None or interval_of_weeks not in ConfigOptions.interval_of_weeks:
                msg = "The parameter \"intervalOfWeeks\" is empty or invalid. intervalOfWeeks defaults to 1."
                self.log_and_syslog(logging.WARNING, msg)
                self.interval_of_weeks = '1'
            else:
                self.interval_of_weeks = interval_of_weeks
            waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                      op=waagent.WALAEventOperation.Enable,
                                      isSuccess=True,
                                      version=Version,
                                      message="intervalOfWeeks="+self.interval_of_weeks)
            self.current_configs["intervalOfWeeks"] = self.interval_of_weeks

            # Save the latest configuration for scheduled task to avoid one-off mode's affection
            waagent.SetFileContents(self.scheduled_configs_file, json.dumps(self.current_configs))

        msg = "Current Configuration: " + self.get_current_config()
        self.log_and_syslog(logging.INFO, msg)

    def install(self):
        pass

    def enable(self):
        if self.stop:
            self.stop_download()
            self.create_stop_flag()
            return
        self.delete_stop_flag()
        if not self.disabled and self.oneoff:
            script_file_path = os.path.realpath(sys.argv[0])
            os.system(' '.join(['python', script_file_path, '-oneoff', '>/dev/null 2>&1 &']))
        else:
            waagent.SetFileContents(self.history_scheduled, '')
            self.set_download_cron()
            self.set_patch_cron()
            self.restart_cron()

    def disable(self):
        self.disabled = True
        self.enable()

    def stop_download(self):
        '''
        kill the process of downloading and its subprocess.
        return code:
            100  - There are no downloading process to stop
            0    - The downloading process is stopped
        '''
        script_file_path = os.path.realpath(sys.argv[0])
        script_file = os.path.basename(script_file_path)
        retcode, output = waagent.RunGetOutput('ps -ef | grep "' + script_file + ' -download" | grep -v grep | grep -v sh | awk \'{print $2}\'')
        if retcode > 0:
            self.log_and_syslog(logging.ERROR, output)
        if output != '':
            retcode, output2 = waagent.RunGetOutput("ps -ef | awk '{if($3==" + output.strip() + ") {print $2}}'")
            if retcode > 0:
                self.log_and_syslog(logging.ERROR, output2)
            if output2 != '':
                waagent.Run('kill -9 ' + output2.strip())
            waagent.Run('kill -9 ' + output.strip())
            return 0
        return 100

    def set_download_cron(self):
        script_file_path = os.path.realpath(sys.argv[0])
        script_dir = os.path.dirname(script_file_path)
        script_file = os.path.basename(script_file_path)
        old_line_end = ' '.join([script_file, '-download'])
        if self.disabled:
            new_line = '\n'
        else:
            hr = str(self.download_time.hour)
            minute = str(self.download_time.minute)
            if self.download_time.day != self.start_time.day:
                dow = ','.join([str(day - 1) for day in self.day_of_week])
            else:
                dow = ','.join([str(day) for day in self.day_of_week])
            new_line = ' '.join(['\n' + minute, hr, '* *', dow, 'root cd', script_dir, '&& python check.py', self.interval_of_weeks, '&& python', script_file, '-download > /dev/null 2>&1\n'])
        waagent.ReplaceFileContentsAtomic(self.crontab, '\n'.join(filter(lambda a: a and (old_line_end not in a), waagent.GetFileContents(self.crontab).split('\n'))) + new_line)

    def set_patch_cron(self):
        script_file_path = os.path.realpath(sys.argv[0])
        script_dir = os.path.dirname(script_file_path)
        script_file = os.path.basename(script_file_path)
        old_line_end = ' '.join([script_file, '-patch'])
        if self.disabled:
            new_line = '\n'
        else:
            hr = str(self.start_time.hour)
            minute = str(self.start_time.minute)
            minute_cleanup = str(self.start_time.minute + 1)
            dow = ','.join([str(day) for day in self.day_of_week])
            new_line = ' '.join(['\n' + minute, hr, '* *', dow, 'root cd', script_dir, '&& python check.py', self.interval_of_weeks, '&& python', script_file, '-patch >/dev/null 2>&1\n'])
            new_line += ' '.join([minute_cleanup, hr, '* *', dow, 'root rm -f', self.stop_flag_path, '\n'])
        waagent.ReplaceFileContentsAtomic(self.crontab, "\n".join(filter(lambda a: a and (old_line_end not in a) and (self.stop_flag_path not in a), waagent.GetFileContents(self.crontab).split('\n'))) + new_line)

    def restart_cron(self):
        retcode,output = waagent.RunGetOutput(self.cron_restart_cmd)
        if retcode > 0:
            self.log_and_syslog(logging.ERROR, output)

    def download(self):
        # Read the latest configuration for scheduled task
        settings = json.loads(waagent.GetFileContents(self.scheduled_configs_file))
        self.parse_settings(settings)

        self.provide_vm_status_test(StatusTest["Scheduled"])
        if not self.check_vm_idle(StatusTest["Scheduled"]):
            return

        if self.exists_stop_flag():
            self.log_and_syslog(logging.INFO, "Downloading patches is stopped/canceled")
            return

        waagent.SetFileContents(self.package_downloaded_path, '')
        waagent.SetFileContents(self.package_patched_path, '')

        start_download_time = time.time()
        # Installing security patches is mandatory
        self._download(self.category_required)
        if self.category == self.category_all:
            self._download(self.category_all)
        self.retry_download()
        end_download_time = time.time()
        waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                  op=waagent.WALAEventOperation.Download,
                                  isSuccess=True,
                                  version=Version,
                                  message=" ".join(["Real downloading time is", str(round(end_download_time-start_download_time,3)), "s"]))

    def _download(self, category):
        self.log_and_syslog(logging.INFO, "Start to check&download patches (Category:" + category + ")")
        retcode, downloadlist = self.check(category)
        if retcode > 0:
            msg = "Failed to check valid upgrades"
            self.log_and_syslog(logging.ERROR, msg)
            self.hutil.do_exit(1, 'Enable', 'error', '0', msg)
        if 'walinuxagent' in downloadlist:
            downloadlist.remove('walinuxagent')
        if not downloadlist:
            self.log_and_syslog(logging.INFO, "No packages are available for update.")
            return
        self.log_and_syslog(logging.INFO, "There are " + str(len(downloadlist)) + " packages to upgrade.")
        self.log_and_syslog(logging.INFO, "Download list: " + ' '.join(downloadlist))
        for pkg_name in downloadlist:
            if pkg_name in self.downloaded:
                continue
            retcode = self.download_package(pkg_name)
            if retcode != 0:
                self.log_and_syslog(logging.ERROR, "Failed to download the package: " + pkg_name)
                self.log_and_syslog(logging.INFO, "Put {0} into a retry queue".format(pkg_name))
                self.download_retry_queue.append((pkg_name, category))
                continue
            self.downloaded.append(pkg_name)
            self.log_and_syslog(logging.INFO, "Package " + pkg_name + " is downloaded.")
            waagent.AppendFileContents(self.package_downloaded_path, pkg_name + ' ' + category + '\n')

    def retry_download(self):
        retry_count = 0
        max_retry_count = 12
        self.log_and_syslog(logging.INFO, "Retry queue: {0}".format(
            " ".join([pkg_name for pkg_name,category in self.download_retry_queue])))
        while self.download_retry_queue:
            pkg_name, category = self.download_retry_queue[0]
            self.download_retry_queue = self.download_retry_queue[1:]
            retcode = self.download_package(pkg_name)
            if retcode == 0:
                self.downloaded.append(pkg_name)
                self.log_and_syslog(logging.INFO, "Package " + pkg_name + " is downloaded.")
                waagent.AppendFileContents(self.package_downloaded_path, pkg_name + ' ' + category + '\n')
            else:
                self.log_and_syslog(logging.ERROR, "Failed to download the package: " + pkg_name)
                self.log_and_syslog(logging.INFO, "Put {0} back into a retry queue".format(pkg_name))
                self.download_retry_queue.append((pkg_name,category))
                retry_count = retry_count + 1
                if retry_count > max_retry_count:
                    err_msg = ("Failed to download after {0} retries, "
                        "retry queue: {1}").format(max_retry_count,
                        " ".join([pkg_name for pkg_name,category in self.download_retry_queue]))
                    self.log_and_syslog(logging.ERROR, err_msg)
                    waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                              op=waagent.WALAEventOperation.Download,
                                              isSuccess=False,
                                              version=Version,
                                              message=err_msg)
                    break
                k = retry_count if (retry_count < 10) else 10
                interval = int(random.uniform(0, 2 ** k))
                self.log_and_syslog(logging.INFO, ("Sleep {0}s before "
                    "the next retry, current retry_count = {1}").format(interval, retry_count))
                time.sleep(interval)

    def patch(self):
        # Read the latest configuration for scheduled task
        settings = json.loads(waagent.GetFileContents(self.scheduled_configs_file))
        self.parse_settings(settings)

        if not self.check_vm_idle(StatusTest["Scheduled"]):
            return

        if self.exists_stop_flag():
            self.log_and_syslog(logging.INFO, "Installing patches is stopped/canceled")
            self.delete_stop_flag()
            return

        # Record the scheduled time
        waagent.AppendFileContents(self.history_scheduled, time.strftime("%Y-%m-%d %a", time.localtime()) + '\n' )
        # Record the open deleted files before patching
        self.open_deleted_files_before = self.check_open_deleted_files()

        retcode = self.stop_download()
        if retcode == 0:
            self.log_and_syslog(logging.WARNING, "Download time exceeded. The pending package will be downloaded in the next cycle")
            waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                      op=waagent.WALAEventOperation.Download,
                                      isSuccess=False,
                                      version=Version,
                                      message="Downloading time out")

        global start_patch_time
        start_patch_time = time.time()

        pkg_failed = []
        is_time_out = [False, False]
        patchlist = self.get_pkg_to_patch(self.category_required)
        is_time_out[0],failed = self._patch(self.category_required, patchlist)
        pkg_failed.extend(failed)
        if not self.exists_stop_flag():
            if not is_time_out[0]:
                patchlist = self.get_pkg_to_patch(self.category_all)
                if len(patchlist) == 0:
                    self.log_and_syslog(logging.INFO, "No packages are available for update. (Category:" + self.category_all + ")")
                else:
                    self.log_and_syslog(logging.INFO, "Going to sleep for " + str(self.gap_between_stage) + "s")
                    time.sleep(self.gap_between_stage)
                    is_time_out[1],failed = self._patch(self.category_all, patchlist)
                    pkg_failed.extend(failed)
        else:
            msg = "Installing patches (Category:" + self.category_all + ") is stopped/canceled"
            self.log_and_syslog(logging.INFO, msg)
        if is_time_out[0] or is_time_out[1]:
            msg = "Patching time out"
            self.log_and_syslog(logging.WARNING, msg)
            waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                      op="Patch",
                                      isSuccess=False,
                                      version=Version,
                                      message=msg)

        self.open_deleted_files_after = self.check_open_deleted_files()
        self.delete_stop_flag()
        #self.report()
        if StatusTest["Scheduled"]["Healthy"]:
            is_healthy = StatusTest["Scheduled"]["Healthy"]()
            msg = "Checking the VM is healthy after patching: " + str(is_healthy)
            self.log_and_syslog(logging.INFO, msg)
            waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                      op="Check healthy",
                                      isSuccess=is_healthy,
                                      version=Version,
                                      message=msg)
        if self.patched is not None and len(self.patched) > 0:
            self.reboot_if_required()

    def _patch(self, category, patchlist):
        if self.exists_stop_flag():
            self.log_and_syslog(logging.INFO, "Installing patches (Category:" + category + ") is stopped/canceled")
            return False,list()
        if not patchlist:
            self.log_and_syslog(logging.INFO, "No packages are available for update.")
            return False,list()
        self.log_and_syslog(logging.INFO, "Start to install " + str(len(patchlist)) +" patches (Category:" + category + ")")
        self.log_and_syslog(logging.INFO, "Patch list: " + ' '.join(patchlist))
        pkg_failed = []
        for pkg_name in patchlist:
            if pkg_name == 'walinuxagent':
                continue
            current_patch_time = time.time()
            if current_patch_time - start_patch_time > self.install_duration:
                msg = "Patching time exceeded. The pending package will be patched in the next cycle"
                self.log_and_syslog(logging.WARNING, msg)
                return True,pkg_failed
            retcode = self.patch_package(pkg_name)
            if retcode != 0:
                self.log_and_syslog(logging.ERROR, "Failed to patch the package:" + pkg_name)
                pkg_failed.append(' '.join([pkg_name, category]))
                continue
            self.patched.append(pkg_name)
            self.log_and_syslog(logging.INFO, "Package " + pkg_name + " is patched.")
            waagent.AppendFileContents(self.package_patched_path, pkg_name + ' ' + category + '\n')
        return False,pkg_failed

    def patch_one_off(self):
        """
        Called when startTime is empty string, which means a on-demand patch.
        """
        self.provide_vm_status_test(StatusTest["Oneoff"])
        if not self.check_vm_idle(StatusTest["Oneoff"]):
            return

        global start_patch_time
        start_patch_time = time.time()

        self.log_and_syslog(logging.INFO, "Going to patch one-off")
        waagent.SetFileContents(self.package_downloaded_path, '')
        waagent.SetFileContents(self.package_patched_path, '')

        # Record the open deleted files before patching
        self.open_deleted_files_before = self.check_open_deleted_files()

        pkg_failed = []
        is_time_out = [False, False]
        retcode, patchlist_required = self.check(self.category_required)
        if retcode > 0:
            msg = "Failed to check valid upgrades"
            self.log_and_syslog(logging.ERROR, msg)
            self.hutil.do_exit(1, 'Enable', 'error', '0', msg)
        if not patchlist_required:
            self.log_and_syslog(logging.INFO, "No packages are available for update. (Category:" + self.category_required + ")")
        else:
            is_time_out[0],failed = self._patch(self.category_required, patchlist_required)
            pkg_failed.extend(failed)
        if self.category == self.category_all:
            if not self.exists_stop_flag():
                if not is_time_out[0]:
                    retcode, patchlist_other = self.check(self.category_all)
                    if retcode > 0:
                        msg = "Failed to check valid upgrades"
                        self.log_and_syslog(logging.ERROR, msg)
                        self.hutil.do_exit(1, 'Enable', 'error', '0', msg)
                    patchlist_other = [pkg for pkg in patchlist_other if pkg not in patchlist_required]
                    if len(patchlist_other) == 0:
                        self.log_and_syslog(logging.INFO, "No packages are available for update. (Category:" + self.category_all + ")")
                    else:
                        self.log_and_syslog(logging.INFO, "Going to sleep for " + str(self.gap_between_stage) + "s")
                        time.sleep(self.gap_between_stage)
                        self.log_and_syslog(logging.INFO, "Going to patch one-off (Category:" + self.category_all + ")")
                        is_time_out[1],failed = self._patch(self.category_all, patchlist_other)
                        pkg_failed.extend(failed)
            else:
                self.log_and_syslog(logging.INFO, "Installing patches (Category:" + self.category_all + ") is stopped/canceled")

        if is_time_out[0] or is_time_out[1]:
            waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                      op="Oneoff Patch",
                                      isSuccess=False,
                                      version=Version,
                                      message="Patching time out")

        shutil.copy2(self.package_patched_path, self.package_downloaded_path)
        for pkg in pkg_failed:
            waagent.AppendFileContents(self.package_downloaded_path, pkg + '\n')

        self.open_deleted_files_after = self.check_open_deleted_files()
        self.delete_stop_flag()
        #self.report()
        if StatusTest["Oneoff"]["Healthy"]:
            is_healthy = StatusTest["Oneoff"]["Healthy"]()
            msg = "Checking the VM is healthy after patching: " + str(is_healthy)
            self.log_and_syslog(logging.INFO, msg)
            waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                      op="Check healthy",
                                      isSuccess=is_healthy,
                                      version=Version,
                                      message=msg)
        if self.patched is not None and len(self.patched) > 0:
            self.reboot_if_required()

    def reboot_if_required(self):
        self.check_reboot()
        self.check_needs_restart()
        msg = ''
        if self.reboot_after_patch == 'notrequired' and self.reboot_required:
            msg += 'Pending Reboot'
            if self.needs_restart:
                msg += ': ' + ' '.join(self.needs_restart)
            waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                      op="Reboot",
                                      isSuccess=False,
                                      version=Version,
                                      message=" ".join([self.reboot_after_patch, msg,
                                                       str(len(self.needs_restart)),
                                                       "packages need to restart"]))
            self.hutil.do_exit(0, 'Enable', 'success', '0', msg)
        if self.reboot_after_patch == 'required':
            msg += "System going to reboot(Required)"
        elif self.reboot_after_patch == 'auto' and self.reboot_required:
            msg += "System going to reboot(Auto)"
        elif self.reboot_after_patch == 'rebootifneed':
            if (self.reboot_required or self.needs_restart):
                msg += "System going to reboot(RebootIfNeed)"
        if msg:
            if self.needs_restart:
                msg += ': ' + ' '.join(self.needs_restart)
            self.log_and_syslog(logging.INFO, msg)
            waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                      op="Reboot",
                                      isSuccess=True,
                                      version=Version,
                                      message="Reboot")
            retcode = waagent.Run('reboot')
            if retcode != 0:
                self.log_and_syslog(logging.ERROR, "Failed to reboot")
                waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                          op="Reboot",
                                          isSuccess=False,
                                          version=Version,
                                          message="Failed to reboot")
        else:
            waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                      op="Reboot",
                                      isSuccess=False,
                                      version=Version,
                                      message="Not reboot")

    def check_needs_restart(self):
        self.needs_restart.extend(self.get_pkg_needs_restart())
        patched_files = dict()
        for pkg in self.get_pkg_patched():
            cmd = ' '.join([self.pkg_query_cmd, pkg])
            try:
                retcode, output = waagent.RunGetOutput(cmd)
                patched_files[os.path.basename(pkg)] = [filename for filename in output.split("\n") if os.path.isfile(filename)]
            except Exception:
                self.log_and_syslog(logging.ERROR, "Failed to " + cmd)
        # for k,v in patched_files.items():
        #     self.log_and_syslog(logging.INFO, k + ": " + " ".join(v))
        open_deleted_files = list()
        for filename in self.open_deleted_files_after:
            if filename not in self.open_deleted_files_before:
                open_deleted_files.append(filename)
        # self.log_and_syslog(logging.INFO, "Open deleted files: " + " ".join(open_deleted_files))
        for pkg,files in patched_files.items():
            for filename in files:
                realpath = os.path.realpath(filename)
                if realpath in open_deleted_files and pkg not in self.needs_restart:
                     self.needs_restart.append(pkg)
        msg = "Packages needs to restart: "
        pkgs = " ".join(self.needs_restart)
        if pkgs:
            msg += pkgs
        else:
            msg = "There is no package which needs to restart"
        self.log_and_syslog(logging.INFO, msg)

    def get_pkg_needs_restart(self):
        return []

    def check_open_deleted_files(self):
        ret = list()
        retcode,output = waagent.RunGetOutput('lsof | grep "DEL"')
        if retcode == 0:
            for line in output.split('\n'):
                if line:
                    filename = line.split()[-1]
                    if filename not in ret:
                        ret.append(filename)
        return ret

    def create_stop_flag(self):
        waagent.SetFileContents(self.stop_flag_path, '')

    def delete_stop_flag(self):
        if self.exists_stop_flag():
            os.remove(self.stop_flag_path)

    def exists_stop_flag(self):
        if os.path.isfile(self.stop_flag_path):
            return True
        else:
            return False

    def get_pkg_to_patch(self, category):
        if not os.path.isfile(self.package_downloaded_path):
            return []
        pkg_to_patch = waagent.GetFileContents(self.package_downloaded_path)
        if not pkg_to_patch:
            return []
        patchlist = [line.split()[0] for line in pkg_to_patch.split('\n') if line.endswith(category)]
        if patchlist is None:
            return []
        return patchlist

    def get_pkg_patched(self):
        if not os.path.isfile(self.package_patched_path):
            return []
        pkg_patched = waagent.GetFileContents(self.package_patched_path)
        if not pkg_patched:
            return []
        patchedlist = [line.split()[0] for line in pkg_patched.split('\n') if line]
        return patchedlist

    def get_current_config(self):
        current_configs = []
        for k,v in self.current_configs.items():
            current_configs.append(k + "=" + v)
        return ",".join(current_configs)

    def provide_vm_status_test(self, status_test):
        for status,provided in status_test.items():
            if provided is None:
                provided = "False"
                level = logging.WARNING
            else:
                provided = "True"
                level = logging.INFO
            msg = "The VM %s test script is provided: %s" % (status, provided)
            self.log_and_syslog(level, msg)
            waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                      op="provides %s test script" % (status,),
                                      isSuccess=provided,
                                      version=Version,
                                      message=msg)

    def check_vm_idle(self, status_test):
        is_idle = True
        if status_test["Idle"]:
            is_idle = status_test["Idle"]()
            msg = "Checking the VM is idle: " + str(is_idle)
            self.log_and_syslog(logging.INFO, msg)
            waagent.AddExtensionEvent(name=self.hutil.get_name(),
                                      op="Check idle",
                                      isSuccess=is_idle,
                                      version=Version,
                                      message=msg)
            if not is_idle:
                self.log_and_syslog(logging.WARNING, "Current Operation is skipped.")
        return is_idle

    def log_and_syslog(self, level, message):
        if level == logging.INFO:
            self.hutil.log(message)
        elif level == logging.WARNING:
            self.hutil.log(" ".join(["Warning:", message]))
        elif level == logging.ERROR:
            self.hutil.error(message)
        if self.syslogger is None:
            self.init_syslog()
        self.syslog(level, message)

    def init_syslog(self):
        self.syslogger = logging.getLogger(self.hutil.get_name())
        self.syslogger.setLevel(logging.INFO)
        formatter = logging.Formatter('%(name)s: %(levelname)s %(message)s')
        try:
            handler = logging.handlers.SysLogHandler(address='/dev/log')
            handler.setFormatter(formatter)
            self.syslogger.addHandler(handler)
        except:
            self.syslogger = None
            self.hutil.error("Syslog is not ready.")

    def syslog(self, level, message):
        if self.syslogger is None:
            return
        if level == logging.INFO:
            self.syslogger.info(message)
        elif level == logging.WARNING:
            self.syslogger.warning(message)
        elif level == logging.ERROR:
            self.syslogger.error(message)

redpajama_set_name: RedPajamaGithub


An immaculate 2 double bedroom maisonette in a Victorian conversion located on a quiet leafy road in Stroud Green. The property consists of a modern fully fitted kitchen, huge separate lounge and luxury semi tiled bathroom.
Also boasts G.C.H, High ceilings and comes fully furnished. Located only 2 minutes from Haringey Overground Station that goes to Moorgate in 10 minutes, or a 10 minutes walk to Finsbury Park Station and all local amenties.


text:
package sib

/* Request Types */

type SMSCampaign struct {
	Name           string `json:"name"` // Mandatory
	Sender         string `json:"sender"`
	Content        string `json:"content"`
	Bat_sent       string `json:"bat_sent"`
	List_ids       []int  `json:"listid"` // Mandatory if Scheduled_date
	Exclude_list   []int  `json:"exclude_list"`
	Scheduled_date string `json:"scheduled_date"` // Format: YYYY-MM-DD 00:00:00
	Send_now       int    `json:"send_now"`       // 0 = campaign not ready to send, 1 = ready to send now
}

type SMSRequest struct {
	To      string `json:"to"`   // Mobile Number (Mandatory)
	From    string `json:"from"` // No more than 11 alphanumeric characters (Mandatory)
	Text    string `json:"text"` // No more than 160 characters (Mandatory)
	Web_url string `json:"web_url"`
	Tag     string `json:"tag"`
	Type    string `json:"type"` // "marketing" (default) or "transactional"
}

type SMSTest struct {
	To string `json:"to"`
}

/* Response Types */

type SMSCampaignData struct {
	Id int `json:"id"`
}

type SMSCampaignResponse struct {
	Code    string          `json:"code"`
	Message string          `json:"message"`
	Data    SMSCampaignData `json:"data"`
}

type SMSData struct {
	Status           string       `json:"status"`
	Number_sent      int          `json:"number_sent"`
	To               string       `json:"to"`
	Sms_count        int          `json:"sms_count"`
	Credits_used     float64      `json:"credits_used"`
	Remaining_credit float64      `json:"remaining_credit"`
	Reference        SMSReference `json:"reference"`
	Description      string       `json:"description"`
	Reply            string       `json:"reply"`
	Bounce_type      string       `json:"bounce_type"`
	Error_code       int          `json:"error_code"`
}

type SMSReference struct {
	One string `json:"1"`
}

type SMSResponse struct {
	Code    string  `json:"code"`
	Message string  `json:"message"`
	Data    SMSData `json:"data"`
}


In general regional meetings are held in either the spring or fall with the latter being the most active time.
Each year, the CMP recognize superior accomplishments of CIM members in the field of Mineral Processing at its Annual Banquet.
The CMP student program is very successful. We take great pride, care and concern for our students.
The Canadian Mineral Processors (CMP) is a Technical Society of the Canadian Institute of Mining, Metallurgy and Petroleum and had its beginning as an operator-oriented group called the Canadian Gold Metallurgists. The formation of the Canadian Gold Metallurgists was predicated on the principle of "Cost plus tails", i.e. obtaining the lowest possible cost per ton of ore milled with the highest recovery possible. This focus on operators and their interests is maintained as a priority today.


text:
Q: setBackgroundResource with RemoteViews not applying to layout I'm trying to set the background resource of my layout in my app widget. I'm using setBackground resource with RemoteViews like so:
val views = RemoteViews(context.packageName, R.layout.first_money_widget)
views.setInt(R.id.widget_relativeLayout, "setBackgroundResource", R.drawable.widget_background_night)

This doesn't change the app widget's background, but if I change it in my layout:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget_relativeLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/widget_background_night"> // Here
...
</RelativeLayout>

It changes the background resource successfully. But I need it to change programatically, why is my code not changing the background resource?
Full code of my onRecieve:
   override fun onReceive(context: Context, intent: Intent) {
    if (intent.action == "android.appwidget.action.APPWIDGET_UPDATE") {
        Toast.makeText(context, "AppWidgetUpdate now", Toast.LENGTH_SHORT).show()
        val views = RemoteViews(context.packageName, R.layout.widget_layout)
        val appWidgetManager = AppWidgetManager.getInstance(context)
        views.setInt(R.id.widget_relativeLayout, "setBackgroundResource", R.drawable.widget_background_night)
        val cn = ComponentName(context, MyWidgetProvider::class.java)
        appWidgetManager.updateAppWidget(cn, views)
    }

Update:
I tried moving the code over to the onUpdate method, and it still doesn't set the imageView resource. Just for testing, I tried doing:
views.setViewVisibility(R.id.someViewInMyWidget, View.INVISIBLE)

Instead of:
views.setInt(R.id.widget_relativeLayout, "setBackgroundResource", R.drawable.widget_background_night)

And to my surprise, this didn't make someViewInMyWidget go invisible. So I doubt its a problem to do with setting specifically imageViewResources. Anyway, I'm still looking for the answer and any help would be appreciated.

A: After a few days, I found the answer. I just needed to change:
val appWidgetManager = AppWidgetManager.getInstance(context)
val cn = ComponentName(context, MyWidgetProvider::class.java)
    appWidgetManager.updateAppWidget(cn, views)

to:
val widgetManager = AppWidgetManager.getInstance(context)
val appWidgetIds = widgetManager.getAppWidgetIds(ComponentName(context, MyWidgetProvider::class.java))
onUpdate(context, widgetManager, appWidgetIds)


text:
Samsung has a long history of designing and producing system-on-chips (SoCs) and has been manufacturing SoCs for its own devices as well as for sale to other manufacturers. The first Samsung SoC, the S3C44B0, was built around an ARM7 CPU which operated at 66 MHz clock frequency. Later, several SoCs (S3C2xxx) containing an ARM9 CPU were produced. For more information on Samsung's current SoCs see Exynos.

List of historical Samsung SoCs

References

Lists of computer hardware
System on a chip

redpajama_set_name: RedPajamaWikipedia


Wooden Counter-top Drawers in stock and on display in our showroom. A lovely set of wide yet shallow dark wood drawer. Would make a great desk tidy.
If you're interested in these Wooden Counter-top Drawers or any of our other reclaimed furniture pieces that we may have in stock, please do not hesitate to give us a call on 01580201258 and ask any questions you may have. Alternatively, you're more than welcome to visit our yard in Stonegate, East Sussex, TN5 7EF to view the item in person, which is always recommended. There will be a member of staff here to help point you in the right direction and answer any queries.


From Gerry Dahrouge This summer I celebrate THIRTY years as a member of the Berkshire Hills Chorus. What an awesome experience it continues to be. Meeting new friends, learning great music, and hearing those beautiful chords ringing clear. I love it and it never gets old!!!
All happy occasions should be celebrated. So tonight, the Berkshire Hills Chorus is gathered to honor our friend and sister in harmony, Hannah at a bridal shower. Many blessings to you in your life ahead.
County Fare: Berkshire Hills Chorus lands top medals As reported by The Berkshire Eagle (http://www.berkshireeagle.com/news/ci_28148005/county-fare:-berkshire-hills-chorus-lands-top-medals) Berkshire Hills Chorus of Pittsfield earned two first-place medals in the recent Region 1 competition of Sweet Adelines International. (Courtesy of Berkshire Hills Chorus) For the Pittsfield-based Berkshire Hills Chorus chapter of Sweet Adelines International, victory never sounded so good….


"They are a great local propane distributor. Their hours for drive up tank filling are fairly short but not bad. They also offer Saturday filling seasonally." – Sean H.
"I had a really hard time finding a gas company online with halfway decent ratings. We asked our neighbors for a recommendation and I have them to thank for referring us to KB Johnson. At KBJ, someone always answers the phone, services are ON TIME or a minute early for any appointment (rare in today's world), they stick to their quotes, and everyone I've come in contact with is knowledgeable and patient, especially Tim, who found a leak in our gas fireplace and dealt with my ridiculous questions with a smile on his face. So far, so good. I'm very happy with our gas company thus far and would recommend KB Johnson to anyone needing gas." – Lauren M.
"Best service, sales and employees around!! Give them a try." – Melanie P.
"By far the best customer service for your gas logs and BEST PRICES on propane gas anywhere!!! Thanks guys!" – Saralyn F.
"Great staff and knowledgeable people." – Joel M.


HealthRight International initiated the Tuberculosis Control Partnership Project in Kosovo in 1999 in response to the high rates of TB-related morbidity and mortality. The Project stressed the implementation of and compliance with the WHO recommended Directly Observed Treatment, Short-Course (DOTS). To improve case detection and treatment rates for TB, HealthRight implemented active TB case finding in minority (Roma and Serb) communities, and conducted knowledge, attitude, and practice surveys. Focusing on building the capacity of the local health system and community to treat and prevent the spread of TB, HealthRight provided trainings for health workers as well as school teachers, patients and families.
HealthRight launched its Deinstitutionalization Project in December of 2000, targeting children at Shtime and from the communities with special needs. HealthRight transitioned children living at SSI to community-based group homes and expanded rehabilitation activities to disabled children within the communities, providing education, health services, and rehabilitation. Thanks to HealthRight's advocacy, many children now attend public school or receive special education. Through organized activities and rehabilitation, children have been gradually integrated into community life. The project serves as a model for deinstitutionalization and establishes protocols for the development of an effective Kosovar social welfare system.
In 2002, HealthRight developed a model for and established two Women's Wellness Centers (WWCs) in Gjilan and Prizren to provide women with comprehensive health care throughout their reproductive lifespan. In 2007, HealthRight established its third WWC in partnership with the Main Family Medical Center in Pristina, Kosovo's capital. All three Centers have since been transferred to the control of the Kosovo Ministry of Health.


24th Annual WOW Conference - Feb. 11 - 15, 2016 United We Change the World!
If you need assistance please email wow@womenofwisdom.org or call (206)782-3363.
Share your experience with a friend!
Starting Monday, January 25th, when you purchase a 3-hour workshop, you can then also purchase one for your friend at a 40% discount! This is valid for all conference 3-hour workshops Saturday through Monday and can be used for multiple workshops at a time).
You have until Noon, February 10th to take advantage of this great deal!
Online and phone registration for the pre-conference 2-day Intensive workshop on February 10th – 11th, closes at noon on Tuesday, February 9th.
All other conference events, online and phone registrations close at 12:00 PM (noon) on Wednesday, February 10th.
After phone and online registration closes you can register ON SITE for events that still have space available. There are always events available for you to select onsite at our Registration table.
There is a small service fee included in the price for all events. Some events may also have a materials fee due on or before the workshop.
Here is a downloadable What To Bring list that includes information about materials fees and items recommended to bring (if any) for all the workshops. More information can be found on the Conference Info page.
Teens do not need to become members to purchase weekend packages, although it is welcomed and encouraged!
These passes do not include Mira Kelley's pre-conference workshop Feb. 10th & 11th.
Please Note: You will be sent a code after you register and pay for the weekend pass to use to sign up for your workshops. Be sure to register for your other events as soon as possible as some may fill up.
Register now for a weekend pass, and you will be sent a code to sign up for your events. Be sure to register for your other events as soon as possible as some may fill up.
For Featured Presenter and other events, please go to the schedule page to register.
Men are invited to attend the evening events (starting at 7pm) on Thursday, Friday and Saturday, February 11th – 13th, and evening workshops on Sunday, February 14th (Including the In The Rounds Workshops). Other workshops are designed for women only.
The Mira Kelley Two Day Intensive on site registration will be open at 8:30 am on Wednesday, February 10th at in the Conference Center Building at North Seattle College.
You can become a member beginning at $35 by clicking here to get to our membership page.
If you have event questions please contact WOW at 206-782-3363. Our phone line is staffed part time until mid January when we will have staff in the office full time through February 12th. Please leave your name, phone number and the best time to reach you and someone will return your call. Your questions will be answered quickly through email: wow@womenofwisdom.org.


Welcome to the Dental Assistant Resume Sample page. Did you know that Paul Revere was an amateur dentist?
If you want to build a resume quickly and with ease, try our customizable resume generator.
Not the industry you're looking for? View all of our professional resume examples.
Certified Dental Assistant with over 10 years of experience in crown polishing, preventive dentistry services, and maintaining confidential records. Aiming to apply my expertise in dental practice management and operations to fulfill the role senior dental assistant. Possess knowledge of Dentrix software and bilingual in English and Spanish.
A dentist has to go through a lot of school, training, and fieldwork to become a full-fledged practitioner. But it's worth it! Dental hygienist jobs are set to boom in the near future. Still, don't fall into passivity on the job.
The dental industry is well known to be one that is quickly changing. This is due to increasing patient interest, rapidly developing medical technology, and also the changes to healthcare laws mandated by the Affordable Care Act, also known as Obamacare. Be sure to educate yourself on the finer points of these new trends, because they could have an effect on your career if you do not stay ahead of the curve.
Quantifying your resume is an important part of communicating your skills effectively to a hiring manager. Wherever possible, try to give scope to the duties you perform, by describing them with numbers.
When writing your dental resume, try to communicate what it is that you do as a dentist. Below, we will pose a series of questions to help you get started on thinking about the content of your resume.
1. How many patients do you see each year?
On average, dentists see over 1,000 patients every year, with an average of 63 patients per week. Quantifying (adding numbers to) your resume is an important part of communicating your skills effectively to a hiring manager. Wherever possible, try to give scope to the duties you perform, by describing them with numbers.
2. Have you ever been involved in any media engagements, such as speeches, magazine articles, or interviews?
Demonstrate your breadth of knowledge and community engagement by including this information on your resume. Learn how to include the additional sections on your resume here.
3. Are you currently a faculty member at a University or some other kind of school or academy?
You may be involved in doing research projects of some kind, leading to important discoveries for oral health that could change and save lives. Reveal the nature of your research, the size of your team, the company or school sponsoring you, and also give a citation for any research you've published.
Be sure to educate yourself on the finer points of any new trends, because they could have an effect on your career if you do not stay ahead of the curve.
4. What have you learned about your field lately?
As stated earlier, the dental industry is developing rapidly. New tools and procedures are constantly being developed, possibly in part thanks to you! Be sure to include any courses, seminars, or training sessions you've attended to either brush up on or learn new skills. If you specialize in one of the 9 forms of dentistry listed above, you should theoretically be constantly deepening your knowledge.
5. If you're a manager, what kind of leader are you?
How many people do you manage in your clinic? How do you ensure that your employees achieve a high standard of safety, hygiene, focus, and skill? Do you measure your employee and customer satisfaction? This kind of information can be very persuasive on a resume.
Now that you've considered these questions, continue below to how to format and write the sections of your dental resume.
But first — does this remind you of you?
Dental resumes are written differently from most resumes. It has unusual sections, and they are listed in a different order than normal resume formats.
1. Contact Details: Let the hiring manager know how to contact you!
2. Education: This section needs to come before your professional experience on a dental resume, because as someone in the medical field, your education says a lot about your skill and depth of knowledge.
3. Licensure: This is the second most important section on your dental resume. They show that you're allowed to practice. Don't forget this section!
Fabricated plastic and porcelain facings, crowns, bridges, and precision attachment restorations, as well as performed other specialized procedures.
Managed 10 patients per day, cleaning teeth and performing examinations of dental hygiene.
New tools and procedures are constantly being developed, possibly in part thanks to you! Be sure to include any courses, seminars, or training sessions you've attended to either brush up on or learn new skills.
5. Professional Memberships: Why include a professional membership section in your resume? They show that you belong to a group that sets and enforces standards amongst your peers.
6. Continuing Education: This section is critical for your resume in the field of dentistry. Write the name of the institution, lecture, seminar, or training session you attended, the year you attended it, and the location it occurred.
7. Professional Meetings: Feel free to include this section, but it isn't necessary. Again, this section demonstrates your commitment to consistently achieving high standards for your practice by conferring with your peers, and learning from them.
8. Research: Only include this section if you have published research. Cite it in APA style.
9. Community Service: Another optional section that might be more effective if you are applying to work for an NGO.
10. Additional Skills: Being a dentist requires having many skills. The ability to construct bridges, dentures, crowns, and other orthopedic appliances, and use other dental cleaning equipment – these are valuable skills that should be expressed on your resume.
Write any skill that you can think of that are relevant to the job in this section.


text:
Philippines: Protests reject new 'sin tax'
Tony Iltis
The People's Coalition Against Regressive Taxation held a 4000-strong blockade of the upmarket Manila Shangri-La Hotel from December 5 to 6. The Bicameral Conference Committee, representing the upper and lower houses of the Philippines parliament, were inside debated the Sin Tax Bill, which will double the prices of cigarettes and alcohol.
Workers and farmers were represented in the blockade, whose ranks were drawn predominantly from the urban poor.
Supporters of the new tax, which includes health professional groups as well as purportedly progressive "civil society" organisations, claim reducing the affordability of tobacco and alcohol will improve the health of the poor.
This ignores the realities of the Philippines' impoverished masses, who typically subsist on one rice-based meal a day, suffer the stress of irregular employment and when they do find work it is usually with long hours and unhealthy and unsafe conditions. All these factors contribute to poor health as well as relatively high rates of smoking.
This poverty is made worse by an extremely regressive taxation system with corporations paying little or no tax and the government relying instead on a 12% sales tax.
The government claims that revenue from the "sin tax" will go to its "universal health program", a claim that would be more convincing if such a program existed.
In fact, the Philippines' mostly private health system is the most expensive and inaccessible in south-east Asia. The government is in the process of privatising public hospitals, including the Philippine General Hospital and the National Orthopedic Hospital.
The left-wing Party of the Labouring Masses (PLM) joined the protests on the basis that the Sin Tax is a regressive tax on consumption that further shifts the tax burden to the poor.
They questioned the reluctance of the government and "civil society" organisations to take on the corporations profiting from tobacco and alcohol sales, citing their failure to call for tobacco and beer baron Lucio Tan to pay his 1.2 trillion peso ($29.3 billion) tax bill.
They also criticised measures in the bill that will equalise prices between local and imported products. This will destroy the livelihood of Filipino farmers and weaken domestic industry, increasing poverty while benefiting multinational tobacco and alcohol companies.
Proposed amendments would mandate that 15% of tobacco be sourced locally, but, in a full page advertisement in the December 5 Philippine Daily Inquirer, the bill's "civil society" supporters opposed these amendments, saying they violate World Trade Organisation rules, specifically Article 3.5 of the General Agreement on Tariffs and Trade.
The PLM condemned this betrayal of the traditional stance of Filipino civil society, which opposed the neoliberal diktats of international bodies such as the WTO aimed at "opening" the Philippines as a market for multinational corporations at the expense of Filipino industry and farmers.
Reading Green Left online is free but producing it isn't
Green Left aims to make all content available online, without paywalls. We rely on regular support and donations from readers like you.
For just $5 per month get Green Left in your inbox each week. For $10 per month get the paper delivered to your door.
Green Left Weekly has been an outstanding proponent of clear-headed political analysis for years. I don't know what I'd do without my weekly brain food.
Craig McGregor
Secretary of the Victorian Allied Health Professionals Association

redpajama_set_name: RedPajamaCommonCrawl


text:
Understanding SCI
ABOUT SPINAL CORD INJURY
Pediatric Spinal Cord Injuries
Bedsores & Pressure Ulcers
How to Find the Right Wheelchair
Medical Interviews
Voices of Experience Series
United Spinal Association of Virginia
Your Guide to Paralysis
Family and Caregiver Support
Sports After Spinal Cord Injury
Sex and Fertility Information
Pediatric Spinal Cord Injury
Employment and Education
Disability Advocates
Medical Organizations
Model System Hospitals
Related Books and Publications
Care and Condition Fact Sheets
Here's what's in this section:
In the United States of America, individuals with spinal cord injuries and other disabilities are protected by a variety of laws that provide entitlements that safeguard and promote their health, welfare, and independence. Legislation came into being because of the work of disability advocacy groups across the country. Explore this section to learn more about programs, agencies, resource centers, and special interest groups who promote accessibility, inclusion, and equality for individuals living with a spinal cord injury.
Scroll through the resources below to identify various Disability Resource Centers that serve as clearinghouses of disability-specific information. These include sources for health and patient advocates who can help you navigate the complexities of the health care system. Learn about self-advocacy across a spectrum of needs – medical, psychological, social, emotional, recreational, and vocational. Understand how to find healthcare providers and identify additional support through community-based disability groups.
This section also includes state-wide disability action centers and alliances involved in promoting and ensuring civil rights for people with disabilities. These include state-wide Centers for Independent Living (CIL), National Spinal Cord Injury Association chapters, Family Caregiver Alliances and foundations that support spinal cord injury recovery. These groups provide transition support and counseling for housing, home-based services, personal assistants, and other legal services. Centers for Independent Living and Spinal Cord Associations also provide peer mentoring programs for youth and adults.
The United Spinal Association of Virginia's mission is to enable people with spinal cord injuries and disease to achieve their highest level of health and independence. Services and programs aim to improve quality of life by providing information, referral services, and peer-support. Explore the pull down options under Living With SCI on the top toolbar to explore resources and services to support individuals with spinal cord injuries or disease, their families, health professionals, policymakers and others interested in spinal cord injury.
SCI Medical Experts
People Living With SCI
FacingDisability.com is an informational and support website for families facing spinal cord injuries. The website does not provide medical advice, recommend or endorse health care products or services, or control the information found on external websites. The Hill Foundation is a 501 (c) (3) private operating foundation established by Robert Hill and Thea Flaum.
737 N. Michigan Ave., Suite 1560 , Chicago, IL 60611.
© 2011 – 2022 Hill Foundation for Families Living With Disabilities
Photography by Rona Talcott
Understanding Spinal Cord Injury
Expert Videos
Personal Experience Videos
Donate to support families facing spinal cord injuries