In this eighth-grade humanities lesson, students watch a short video about the 2010 fight by the Coalition of Immokalee Workers for a penny more per pound of tomatoes picked, and read an article that describes where consumer food dollars go in the food system. Students make posters that synthesize the information, and discuss the roles consumers, government officials, and food system workers play in working for a more just food system. This is the fourth in the Debate Plate lesson series, a six-lesson series that focuses on factors and considerations that influence personal food choices and the impacts of those choices.
Understand that their food choices as consumers impact other people within the food system.
Discuss the relative proportion of the money they spend on food that goes to each player in the food system, and compare how these proportions vary depending on the characteristics of the food system.
Begin to form opinions and build arguments around the theme of justice/injustice in the food system, and consumer responsibility in regards to food choices.
Connect consumer choices to farmworkers' lives by reflecting on the impact paying one penny more per pound for tomatoes would have on the Immokalee Workers' pay after watching a video by the Coalition of Immokalee Workers (CIW).
Discuss their thoughts, reactions, and opinions in regards to the CIW video and "Where Does Your Grocery Money Go?" article.
So when we're talking about labor in relation to the food we eat, what, or who, do you think we could be talking about? To put it another way, who are some of the people who work on getting food from the farm to your plate? Tell students this is just a preliminary list that you'll add to as the class goes on.
Today, as we look at labor and justice in the food system, we'll be focusing mostly on the work that farmers and farmworkers do and the compensation they receive for that work. Clarify that "farmers" usually refer to the people who run the farms, and they may or may not actually work in the fields, and "farmworkers" are paid by the farmers to do manual labor on the farm—anything from planting to fertilizing, spraying pesticides if the farm is not organic, and harvesting.
In 2011, a group of farmworkers in Immokalee, Florida, launched a Campaign for Fair Food to fight for higher wages. If you have ever eaten a tomato in the winter, it probably came from Florida, and possibly was picked by one of these workers.
Hopefully, that gives you a sense of the type of work farmworkers do, and the conditions workers face on the job. In that video, the workers were asking for just one penny more per pound that they picked. Now we're going to jump into some specifics on where the money that you spend at the grocery store goes.
In a less-industrialized food cycle with fewer people and processes between the grower and consumer, a much larger proportion of your food dollars – even up to 100% - goes directly to the farmer and farmworkers.
Make-a-poster activity: Students make posters summarizing what they think is the most important or interesting information for people to know about labor and justice in the food system based on the video and article.
If there is time, students share the posters with the whole class or in small groups.
Should consumers be responsible for knowing about their food in terms of justice around production and labor practices?
Should consumers be responsible for buying food from responsible sources? Paying more for food?
Is it the government's responsibility for making laws around fair pay?
What might barriers to making "responsible" consumer choices be?
What would be a deal-breaker for you around supporting a company or product?
What is the responsibility of the consumer in terms of being informed about their food?
Are there any things you have learned about food that affect how you make food choices?
Are there areas you feel are more or less important to be informed?
Are there disagreements in your family about food choices?
Are there any things that you would change about how you eat or the food available to you, but are not able to?
Have you experienced not being in control of the decisions that affect your conscience as a consumer?
Do you have a conscience as a consumer?
What are the areas that you do feel empowered to make choices around what you consume?
Thank students for their participation in the class, and tell them that they'll continue to explore the theme of labor and justice when they return to the Kitchen.
Article: Where Does Your Grocery Money Go?


text:
Q: How to send parameter data from angular to spring boot I have an application where server-side is in spring boot and client-side in angular. I want to send some data from client to spring boot controller but the data is not passing.
Angular service code:

startProcess(env: string, processList: Array<any>): Observable<any> {
  const params = new HttpParams().set('env', env).set('processList', JSON.stringify(processList));

  return this.http.get<string>(this.starturl, {
    params
  })
    .pipe(tap(), catchError(this.handleError));
}

Spring boot controller code:
public List<String> startProcess(
  @RequestParam(required=false, defaultValue="Null") String environment,
  @RequestParam(required=false, defaultValue="Null") List<String> processList
) {
 // ...
}

The values are showing Null in the controller. The data is not getting passed properly. Please suggest how can I pass string and an Array of string from angular to spring boot controller and user my Array list(the format of list should be iterable like normal list).

A: Isn't it better to use POST to send your data to server?. May be change your controller something like below
@PostMapping(path = "/process")
    public void getProcess(@RequestBody ProcessObj processObj){
        //do anything with processObj
    }

//Where ProcessObj is defined as below

public class ProcessObj{
    private String env;
    private List<String> processList;

    public String getEnv() {
        return env;
    }

    public void setEnv(String env) {
        this.env = env;
    }

    public List<String> getProcessList() {
        return processList;
    }

    public void setProcessList(List<String> processList) {
        this.processList = processList;
    }
}

And in Javascript
this.http.post(url, {"env":"ABC", "processList":["A", "B", "C"]})
You could refer more Angularjs samples here https://angular.io/guide/http#making-a-post-request

redpajama_set_name: RedPajamaStackExchange


There are two positions available at our local Big Brothers Big Sisters Office, please see more information below.
The Executive Director is responsible to the Board of Directors for the effective management and leadership of the agency in its provision of service to children and their families in Williams Lake and the South Cariboo.
Please submit your resume and cover letter. This job position closes on March 5, 2019. We thank all of those who apply; however, only those selected for an interview will be contacted.


text:
package de.uni_hildesheim.sse.vil.templatelang.templateLanguageTranslation;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;

import de.uni_hildesheim.sse.vil.expressions.expressionDsl.Call;
import de.uni_hildesheim.sse.vil.expressions.expressionDsl.ExpressionDslPackage;
import de.uni_hildesheim.sse.vil.templatelang.TemplateLangModelUtility;
import net.ssehub.easy.basics.modelManagement.RestrictionEvaluationException;
import net.ssehub.easy.dslCore.translation.MessageHandler;
import net.ssehub.easy.dslCore.translation.TranslatorException;
import net.ssehub.easy.instantiation.core.model.common.VilException;
import net.ssehub.easy.instantiation.core.model.expressions.AbstractCallExpression;
import net.ssehub.easy.instantiation.core.model.expressions.CallArgument;
import net.ssehub.easy.instantiation.core.model.expressions.CallExpression;
import net.ssehub.easy.instantiation.core.model.expressions.Expression;
import net.ssehub.easy.instantiation.core.model.expressions.ExpressionVersionRestriction;
import net.ssehub.easy.instantiation.core.model.expressions.ExpressionVersionRestrictionValidator;
import net.ssehub.easy.instantiation.core.model.expressions.ResolvableOperationCallExpression;
import net.ssehub.easy.instantiation.core.model.templateModel.ExpressionStatement;
import net.ssehub.easy.instantiation.core.model.templateModel.ImplicitVariableDeclaration;
import net.ssehub.easy.instantiation.core.model.templateModel.Resolver;
import net.ssehub.easy.instantiation.core.model.templateModel.VariableDeclaration;
import net.ssehub.easy.instantiation.core.model.vilTypes.TypeDescriptor;

/**
 * A specific expression translator for the template language.
 *
 * @author Holger Eichelberger
 */
public class ExpressionTranslator
    extends de.uni_hildesheim.sse.vil.expressions.translation.ExpressionTranslator<VariableDeclaration, Resolver,
    ExpressionStatement> {

    /**
     * Processes a function call.
     *
     * @param firstParam the first parameter (may be null)
     * @param call the function all (may be null, but then arrayEx is required)
     * @param arrayEx an array access expression (may be null, but then call is required)
     * @param resolver a resolver instance for resolving variables etc.
     * @return the resulting expression node
     * @throws TranslatorException in case that the translation fails for some reason
     */
    protected Expression processCall(Expression firstParam, Call call, CallType type,
        de.uni_hildesheim.sse.vil.expressions.expressionDsl.Expression arrayEx, Resolver resolver)
        throws TranslatorException {
        AbstractCallExpression result;
        List<CallArgument> arguments = new ArrayList<CallArgument>();
        if (null != firstParam) {
            arguments.add(new CallArgument(firstParam));
        }
        List<VariableDeclaration> varDecls = resolveIteratorDeclarations(call, type, arguments, resolver);
        String name = resolveCallArguments(call, varDecls, arguments, arrayEx, resolver);
        CallArgument[] arg = new CallArgument[arguments.size()];
        arguments.toArray(arg);
        if (CallType.SYSTEM == type) {
            throw new TranslatorException("system calls are not supported", call,
                ExpressionDslPackage.Literals.CALL__NAME, TranslatorException.INTERNAL);
        } else {
            result = null;
            VilException semanticException = null;
            try {
                result = resolver.createCallExpression(CallType.SUPER == type, name, arg);
            } catch (VilException e) {
                semanticException = e;
            }
            if (null == result || continueResolution(semanticException)) {
                try {
                    result = new CallExpression(null, name, arg);
                    semanticException = checkSemantics(result);
                } catch (VilException e) {
                    // wrong expression
                }
            }
            if ((null == result || continueResolution(semanticException))) {
                // last resort
                try {
                    result = resolver.createExtensionCallExpression(name, arg);
                    semanticException = checkSemantics(result);
                } catch (VilException e) {
                    // wrong expression
                }
            }
            if (null == result || continueResolution(semanticException)) {
                VariableDeclaration opVar = resolver.resolve(name, false);
                if (null != opVar) {
                    try {
                        result = new ResolvableOperationCallExpression(opVar, arg);
                        semanticException = checkSemantics(result);
                    } catch (VilException e) {
                        // wrong expression
                    }
                }
            }
            if (null != semanticException) {
                throw new TranslatorException(semanticException, call, ExpressionDslPackage.Literals.CALL__NAME);
            }
        }
        return checkCallExpression(result, type, call);
    }

    @Override
    protected VariableDeclaration createVariableDeclaration(String name, TypeDescriptor<?> type,
        boolean isConstant, Expression expression, Resolver resolver) {
        return new VariableDeclaration(name, type, isConstant, expression);
    }

    @Override
    protected VariableDeclaration createImplicitVariableDeclaration(String name, TypeDescriptor<?> type,
        boolean isConstant, Expression expression, Resolver resolver) {
        return new ImplicitVariableDeclaration(name, type, isConstant, expression);
    }

    @Override
    protected ExpressionVersionRestriction createExpressionVersionRestriction(Expression expr,
        net.ssehub.easy.instantiation.core.model.common.VariableDeclaration decl,
        EObject cause, EStructuralFeature feature)
        throws RestrictionEvaluationException {
        try {
            ExpressionVersionRestrictionValidator validator = new ExpressionVersionRestrictionValidator(
                new MessageHandler(this, cause, feature));
            expr.accept(validator);
            return new net.ssehub.easy.instantiation.core.model.templateModel.
                ExpressionVersionRestriction(expr, decl);
        } catch (VilException e) {
            throw new RestrictionEvaluationException(e.getMessage(), e.getId());
        }
    }

    @Override
    public Expression parseExpression(String expression, Resolver resolver, StringBuilder warnings) throws VilException {
        return TemplateLangModelUtility.INSTANCE.createExpression(expression, resolver, warnings,
            getIvmlMessageAdapter());
    }

    @Override
    protected ExpressionStatement createExpressionStatement(Expression expression, Resolver resolver) {
        return new ExpressionStatement(expression, resolver.getCurrentModel());
    }

    @Override
    protected String cannotAssignHint() {
        return "VTL cannot assign values to configurable elements.";
    }

}

redpajama_set_name: RedPajamaGithub


text:
Barbet – rasa psów myśliwskich, średniej wielkości, przeznaczona do polowania na ptactwo wodne, wyszukuje i wypłasza ptactwo, ukryte w zaroślach i trzcinach, i aportuje strzelone sztuki. Bardzo odporny na zimno, powinien iść do wody bez względu na pogodę. Rasa obecnie rzadko spotykana, zakwalifikowana przez FCI do sekcji 3 grupy VIII. Rasa podlega próbom pracy.

Rys historyczny
Pierwszy raz nazwa barbet została użyta przez Jacques du Fouilloux w XVI wieku dla określenia psów o obfitej sierści, tworzącej brodę na pysku psa (fr. barbe). Do końca XIX wieku nazwa barbet, określała we Francji grupę psów a nie konkretną rasę. W XIX wieku selekcja i krzyżowanie typu psów określanych jako "barbety", doprowadziła do ostatecznego wykształcenia się wielu ras w tym psów w typie wyżła (fr. griffon) takich jak Gryfon Khortalsa, Gryfon Bouleta czy właśnie barbet. Dość rozpowszechnioną aczkolwiek całkowicie nieuzasadnioną jest teoria o pochodzeniu barbetów od pudli (bądź pudli od barbetów). Ma ona swoje źródło w błędnej interpretacji standardu pudla, który stwierdza, że  "Rasa pochodzi od barbeta, którego wiele cech zachowała aż do teraz.". Wzmianka ta dotyczy barbeta jako typu psa a nie rasy barbet. Standard pudla jest znacznie starszy niż barbeta, ponadto pudel wywodzi się z Niemiec podczas gdy barbet jest rasą francuską. Barbety były krzyżowane z innymi rasami myśliwskimi i pasterskimi m.in. z Berger de Crau, Bouvierem i irlandzkim spanielem wodnym. Blisko spokrewniony z barbetem był gryfon Bouleta obecnie wymarły. Barbet o imieniu Janus był jednym z ośmiu psów, których hrabia Eduard Korthals użył do wyhodowania gryfona Korthalsa.   W 1886 roku powstał pierwszy standard rasy. Za psa wzorcowego posłużył Pilote (ustalał wymiary psa od 45 cm do 55). W 1885 roku pierwsze barbety – Thug i Plock pojawiły się na wystawie w Paryżu, oba psy wystawione były w klasie "wyżłów długowłosych i barbetów". W początkach XX wieku napływ doskonałych użytkowo ras angielskich doprowadził do znacznego spadku liczebności relatywnie młodej i mało rozpowszechnionej rasy.

Po I wojnie światowej istniały tylko dwie hodowle na południu Francji – Floriac w Dordogne prowadzona przez Le Houellera oraz Mas De la Chapelle w Graveson prowadzona przez dr Charles'a Vincenti. Druga wojna światowa przyniosła kres zorganizowanej pracy hodowlanej i zagroziła dalszemu istnieniu rasy. Szczątkowa liczba psów, już nierejestrowanych w Société Centrale Canine, przetrwała na farmach w okolicach Graveson. W latach 50. i 60. ostatnia linia Barbetów żyła na farmie braci Ayme. W roku 1969 pierwszy z tych Barbetów – R'Lucky został zarejestrowany w Société Centrale Canine jako Titre Initial (T.I). Następnie do hodowli były wprowadzane kolejne psy w typie barbeta uzyskujące status Titre Initial. Do początku lat 80. trwał powolny, za to stabilny proces odbudowy rasy. Do 1986 rasa należała do grupy wyżłów i psów gończych. Pod koniec lat 80. do rasy wprowadzono pudle, znacząco zmieniając wygląd i cechy psa. Od tego czasu w rasie występują dwie linie psów, jedna w starym typie i druga w typie pudla.  Inna nazwa rasy to Griffon d'arrêt à Poil Laineux.

Z nazwą tej rasy wiążą się francuskie powiedzenia:
 "crotté comme un Barbet" – być brudnym jak barbet,
 "Suivre quelqu'un comme un Barbet" – podążać za kimś jak barbet,
 "C'est un Barbet!" – to po prostu barbet! (myśliwskie zawołanie po aporcie postrzałki).

Wygląd ogólny

Barbety są psami średniej wielkości o proporcjonalnej budowie ciała. Charakterystyczną cechą rasy jest kędzierzawa bądź falująca, gęsta i długa sierść (10-15cm), która umożliwia psu pracę w niesprzyjających warunkach. Sierść równomiernie pokrywa całe ciało nadając psu naturalny wygląd, który jest charakterystyczną cechą rasy. Gęsta sierść formuje na pysku psa charakterystyczną brodę od której to rasa wywodzi swoją nazwę. Umaszczenie psów jest czarne, szare (obecnie nie występuje a spotykane współcześnie szare umaszczenie jest efektem postępującego z wiekiem szarzenia na skutek ekspresji locusu g, pochodzącego od pudli) brązowe, płowe, piaskowe lub białe. Pies może mieć łaty dowolnej wielkości w kolorze białym w połączeniu z jakimkolwiek kolorem podstawowym. Odcień powinien być jednakowy na całym ciele. Barbet jest silnym, zwartym i wytrzymałym psem, o szerokiej głowie i głębokiej szerokiej klatce piersiowej.

Wzorzec rasy według FCI

 Głowa: Kufa nieco krótsza od czaszki oraz nieco większa długość tułowia od wysokości w kłębie to podstawowe proporcje zaznaczone w standardzie rasy. Włos na głowie podobnie jak na cały ciele ma być długi i obfity, oznacza to, że sierść psa opada na grzbiet nosa, broda jest obfita i długa a na całej długości kufy pies ma wąsy. Czaszka psa powinna być szeroka i zaokrąglona, a stop – wyraźny. Nos psa jest stosunkowo duży o szerokim grzbiecie, czarny lub czekoladowy, w zależności od umaszczenia. Wargi powinny być grube, dobrze pigmentowane zakryte długim włosem, podobnie jak w przypadku nosa dopuszczalny kolor pigmentu i krawędzi warg to czekoladowy bądź czarny. Oczy okrągłe, pożądane ciemnobrązowe. Jedną z charakterystycznych cech rasy są uszy, powinny być one nisko osadzone (linia oczu lub niżej), długie (ułożone wzdłuż kufy wraz z włosem powinny sięgać co najmniej 5 cm poza nos, a małżowina sięga dalej, niż kącik warg), szerokie i płaskie, porośnięte długim włosem.

 Tułów i kończyny: Budowa tułowia oraz kończyn barbeta musi odpowiadać jego charakterystyce użytkowej, czyli pracy w ciężkich warunkach. Grzbiet powinien być mocny i dobrze zaznaczony, nie może być wklęsły. Lędźwie wysklepione, krótkie i mocne. Klatka piersiowa – szeroka i pojemna, sięgająca łokcia. Ogon długi, co pomaga w pływaniu, nisko osadzony z charakterystycznym haczykiem na końcu (ogon noszony ponad linią grzbietu byłby poważną wadą, gdyż zahaczałby o krzewy i gałęzie drzew). Kończyny muszą być mocne i silnie, tak by były w stanie unieść psa np. w sytuacji gdy wychodzi z wody na stromy brzeg niosąc aport, dlatego standard wymagana silnego umięśnienie ramion, przedramion i ud. Śródstopie powinno być pionowe a sama łapa duża, okrągła (by pies nie zapadał się w grząskim gruncie) i mocno owłosiona. Ruch psa jest swobodny, kończyny poruszają się równolegle wobec linii środkowej tułowia. Tylne kończyny dają mocny napęd.

 Szata i skóra: Szata i skóra barbeta pełni przede wszystkim funkcję ochronną, zarówno przed zimnem jak i urazami. Skóra powinna być gruba a sama sierść pokrywająca całe ciało – obfita, długa, wełnista i kędzierzawa (może tworzyć sznury bądź loki). Naturalny wygląd okrywy jest najważniejszą i niezbędną cechą rasy. Modelowanie sierści dopuszczalne jest o tyle, o ile pomaga psu w pracy lub ułatwia codzienne utrzymanie.

 Wady: Standard rasy wymienia kilkanaście podstawowych wad, z czego najpoważniejsza jest agresja lub wyraźna lękliwość, ponadto psy wykazujące wyraźne wady fizyczne i/lub zaburzenia charakteru powinny być dyskwalifikowane.

Polski standard rasy zawiera kilka błędów i nieścisłości w tłumaczeniu mogących mieć wpływ na ocenę psa, w szczególności błędnie został przetłumaczony opis ogona, który powinien brzmieć: "Nieznacznie podniesiony ponad poziom (grzbietu), gdy pies jest w ruchu, osadzony nisko, na końcu wyraźnie zawinięty" zamiast: "Lekko wzniesiony, w ruchu noszony powyżej poziomu grzbietu, nisko osadzony, z haczykiem na końcu".

Zachowanie, charakter, użytkowość
Barbet to pies wesoły i pogodny, na co dzień opanowany, w zabawie żywiołowy. Mała szczekliwość w połączeniu z ufnym i pozbawionym agresji charakterem nie czynią z niego dobrego psa stróżującego. Barbet jest psem towarzyskim, przywiązuje się do właściciela. Potrzebuje bliskiego kontaktu z człowiekiem, dobrze sprawdza się w kontaktach z dziećmi jak również z innymi zwierzętami domowymi. Barbety łatwo i szybko się uczą. Pies może mieszkać w bloku jak i w domu z ogrodem, ale potrzebuje ruchu. Duża skłonność do wody wynika z użytkowości tej rasy jako aporterów. Barbety wykorzystywane są do pracy z niewidomymi jak również w charakterze psów terapeutycznych. Barbety mogą brać udział w próbach pracy psów myśliwskich, wyszkolone psy sprawdzają się w charakterze płochaczy i aporterów.

Wychowanie

Barbet nie jest psem o dominującym charakterze i nie sprawia problemów wychowawczych. Wymaga jednak zapewnienia mu odpowiedniej dawki wysiłku fizycznego i psychicznego. Łatwy w szkoleniu i inteligentny, może brać udział w takich konkurencjach jak: agility, obedience, dock-diving.

Żywienie, pielęgnacja i zdrowie
Żywienie barbeta niczym nie odbiega od żywienia innych psów z powodzeniem można stosować karmę jak i BARF. Pielęgnacja ogranicza się do regularnego kontrolowania stanu małżowin usznych, które mają tendencję do zarastania co w połączeniu ze słabą wentylacją ucha i częstymi kąpielami, może prowadzić do powstania stanów zapalnych. Pielęgnacja włosa ogranicza się do niezbyt częstego szczotkowania bądź czesania w przypadku włosa dobrej jakości. Im gorsza jakość włosa (suchy i mocno kręcony) tym więcej czasu i wysiłku kosztuje utrzymanie okrywy w należytym stanie, prowadząc czasem do konieczności regularnego strzyżenia. W upalne dni trzeba zapewnić psu chłodne i zacienione miejsce oraz możliwość kąpieli, za to zimą gruba okrywa powoduje, że pies wytrzymuje niskie temperatury. Psa nie należy golić, gdyż nawet w upalne dni jego sierść stanowi doskonałą izolację i zabezpiecza przed przegrzaniem organizmu.

Nieobowiązkowym w ZKwP badaniem jakie może wykonać hodowca jest prześwietlenie w kierunku dysplazji bioder i łokci, oraz badanie oczu (pojedyncze przypadki entropii). Znane są również bardzo rzadkie przypadki epilepsji, badania nad oznaczeniem genu odpowiedzialnego za chorobę prowadzi obecnie Uniwersytet w Helsinkach. Dobrze prowadzony barbet żyje około 13-15 lat, najdłużej odnotowanym żyjącym psem był UGLI Poppenspäler's, który dożył 18 lat. Poważnym zagrożeniem dla rasy jest niewielka populacja, o wąskiej i mało zróżnicowanej puli genetycznej.

Dzieje współczesne
Obecnie liczebność rasy wynosi około 3000 psów (w Polsce około 150). Utrzymuje się stabilna roczna liczba urodzeń. Psy żyją w Kanadzie i USA, jak również kilku krajach europejskich w tym w Polsce. Poważnym problem rasy jest nieduża i rozproszona populacja, co niekorzystnie wpływa na różnorodność genetyczną rasy. 4 sierpnia 2012 roku, w Châtel-Guyon odbyło się sympozjum poświęcone rasie, organizowane przez Société centrale canine.

Pierwszym barbetem w Polsce była Ratafia pochodząca z hodowli Poppenspäler's. Pierwszą sukę użytkową i hodowlaną, Championa Polski, sprowadził z Francji Piotr Piotrowski. Była to Ottavia, której matką była Poppenspaler's Verveine a ojcem Febus Brun Des Marecages du Prince. Pierwszy jej miot urodził się 2 czerwca 2006 roku, drugi 5  grudnia 2007 a trzeci 28 listopada 2008. W hodowli pozostała Atta z Górki Podduchownej z pierwszego miotu po Ottavi, która też była Championem Polski, suką użytkową i hodowlaną i wydała na świat cztery mioty. Obecnie jest już kilka hodowli barbetów.

Przypisy

Bibliografia

Linki zewnętrzne

 Strona poświęcona historii rasy (ang.)
 Historia rasy autorstwa Elaine Fichter (fr.)

 Barbet History Project(ang.)

Rasy psów
Psy dowodne

redpajama_set_name: RedPajamaWikipedia


Creating the perfect blend of shadow as the light bounces off this spectacular multifaceted Geometric bust. This bold, custom 3D Printed Sculpture is sure to attract both attention and admiration. Crafted here in NZ and printed using organic PLA before being finished with the highest quality paints. Available in White, Gold Effect, Riviera Past, and Macrew Purple.


NORTHERN NEW YORK BLDRS EXCHANGE, INC.
It is the desire of the Exchange to operate in accordance with the best interests of the Membership. Therefore, observance of a very few rules will result in greater service to all.
1. PLAN ROOM REGISTER: Please sign the Plan Room Register each time you (or your agent) use this facility. This helps to keep you informed of last minute addendums. 2. CONDITION OF PLANS & SPECS: Please do not check with pencil marks when making take-offs. Check marks create a serious condition for other estimators; and of course, kindly do not write on the plans or in the specs.
3. ORDER: It is especially important that addendums and loose sheets be prevented from becoming separated from the specs. Copies of materials can be made in the Office at a cost of $.15 per copy. Engineer copies may also be made ranging in price from $3.00-$4.50 depending on size. Please sign in the number of copies made and company name.
4. NON-MEMBERS: Plans and Specs are not available for use by non-members on a regular basis.
5. QUIET: Please, out of consideration for others, work quietly.
6. OVER NIGHT: No plans and specs may be removed from the Plan Room. Door codes are provided so that members may use the Plan Room after hours and on weekends. Failure to follow this rule will result in loss of Plan Room privileges.
7. COOPERATION: Plan Room users are required to cooperate with one another during peak periods so that all may have the opportunity to use the Plans and Specs for a particular job.
8. BULLETIN: Please read your weekly Plan Room Bulletin for upcoming projects.
9. COMPUTER: A computer is available in our plan room for members to access the Electronic Plan room free of charge.


Fire! You control the wind, and your goal is to burn everything down! Don't let the fire get extinguished. Have fun!
Destroy the aliens until they are all dead. Good luck!
This game is a hard-hitting documentary on the daily life of a Capetonian taxi-driver. People need to get to their destinations, but once they've paid, you're happy enough to drop them off at the nearest point accross the road. A game of deception, bravery, and above all - money.


The Bose SoundDock Portable is in many ways simply a portable version of the original SoundDock; however, it does offer a few unique features.
For those of us who follow iPod accessories, it's difficult to believe that it's been nearly four years since Bose's original SoundDock was released, making it one of first "desktop" speaker systems for the iPod. Perhaps just as surprising is that while most of the other big vendors of iPod gear have revised their speaker lines several times over that period, Bose has continued selling essentially the same SoundDock, at the same £199 price, that it released back in 2004.
So when Bose announced a new version of the SoundDock, I expected it to be a replacement for the original. Instead, Bose added a second product to the SoundDock line: the £299 SoundDock Portable. True to its name, the SoundDock Portable is in many ways simply a portable version of the original SoundDock; however, it does offer a few unique features.
Available in either black or white with a silver front grill, the SoundDock Portable is just slightly smaller than original at 17.1cm high by 30.6cm wide by 15.4cm deep when closed for travel; it weighs a hefty - for a portable system – 2.37kg. The Portable retains the full-frontal-grill design of the standard SoundDock, but includes several aesthetic and functional changes.
The Portable also includes touch-sensitive Volume Up and Volume Down buttons, located on the right-hand side of the system. Separating these buttons from the dock cradle, where they were located on the original SoundDock, is useful thanks to another new feature: an auxiliary-input jack, located on the back of the unit, that lets you connect another audio device. You can listen to an external audio source even if the Portable' dock cradle is collapsed inside the unit; in fact, to listen to a source connected to the auxiliary input, you need to first remove your iPod or iPhone from the cradle. Also on the back of the system is a bass port that doubles as a handle - a nice touch that makes it easier to carry the system.
But the biggest new feature is the Portable's rechargeable, lithium-ion battery, which lets you take the system to locations not blessed with electrical outlets. Bose claims the battery provides three hours of playback at full volume - an interesting approach to rating, given that most vendors provide battery-life figures based on "typical listening volume" (a euphemism that generally means "not too loud").
To Bose's credit, when listening to an audio system outside, you need to crank the volume considerably higher than you do inside to get a comparable listening level, so the company's worst-case-scenario estimate errs on the conservative side. But I never needed to turn the volume full-blast when outside, which means I saw much longer playback times in my testing. If you'll be listing at relatively modest levels, you can expect well over 10 hours of playback.
Interestingly - and unlike most portable iPod speaker systems - the SoundDock Portable charges your iPod or iPhone even when the system is running off battery power; most speaker systems charge your iPod or iPhone only when the system is connected to AC power. The battery is also easily replaceable; you need only a small coin to unlock the battery and swap it with a fresh one. Bose sells replacement batteries for £69.
A small light, located behind the metal grill just above the Portable's iPod dock, indicates various statuses - powered on, charging, low battery, and more - depending on the light's colour and whether it's solid or blinking. This indicator is useful, but I found it difficult to remember what the various colours and states meant.


February is National Children's Dental Health Month, which is dedicated to raising awareness about the importance of oral health. Taking care of your pearly whites is necessary at all ages, but teaching your kids about proper oral care while they're young is even more essential.
So, let's chat and chew about simple steps you can take to help your child properly care for his or her teeth.
According to the Centers for Disease Control and Prevention (CDC), "42% of children ages 2 to 11 have had cavities in baby teeth; 21% of those ages 6 to 11 have had cavities in permanent teeth." The CDC also says, tooth decay is the most common childhood disease—five times more common than asthma to be exact. It's also almost entirely preventable.
The root of the problem doesn't stop there though. Check out this infographic to learn more.
Research shows that good dental habits should start before your child's first tooth comes in—certainly before the age of two. FamilyDoctor.org suggests, "wiping your baby's gums with a soft damp cloth after feedings [to help] prevent a buildup of bacteria." As your child begins to age, they become more susceptible to oral hygiene issues. Don't delay when it comes to teaching your kids about proper dental health! See the image below for a timeline of your child's dental health.
Maintaining a balanced diet is another key part that is necessary for your child to develop strong, decay-resistant teeth. Chew on these suggestions from WebMD to help protect your child's teeth.
Eat fruits and vegetables. Consider options that have a high volume of water, such as pears, melons, celery, and cucumbers. If your child likes bananas or raisins, always brush right after eating.
Say cheese. Eating cheese as a snack or with lunch triggers the flow of saliva, which in turn washes food particles away from teeth. Try cheddar, Gouda, Swiss, or other aged cheeses.
Mix-in the sugar. It's hard to convince a adult, let alone an child, to cut out all snacks. If you plan on giving your child sweets, do it immediately following a meal. Since there is an increased amount of saliva already in your child's mouth, it will be easier to wash away the sugar.
Avoid foods that linger. Foods that tend to overstay their welcome include hard candies, cough drops, and mints. They constantly coat the teeth with sugar, which can lead to tooth decay.
Drink milk. Simply put, calcium is essential to build strong teeth.
As with most habits, the younger you start, the more likely you are to stick with them as you grow up. Help your child develop great oral hygiene skills to avoid any long-term, painful, and expensive health issues down the road. In the end, your child will thank you for their million dollar smile!
Compass Rose Health Plan members have access to a Discount Dental & Vision Program through Careington included with coverage. For more information, visit www.compassrosebenefits.com/Careington.
October is National Health Literacy Month – a time to reflect upon the importance of understanding health care lingo as it pertains to you and your insurance benefits.
According to a study conducted by the U.S. Department of Education (2006), more than 90 million Americans have basic or below-basic skills for handling health information; however, experts also contribute this to the lack of responsibility placed on the organizations and health professionals to provide easily accessible and understandable information.
Poor health literacy has led to higher rates of hospital readmission, misuse of medication(s), poor management of chronic disease, and other complications. Moreover, research from the University of Connecticut estimates health literacy issues are costing the U.S. economy as much as $238 billion a year!!
Prior to any doctor's appointment, make a list of your symptoms and when they started, as well as any medication you're currently taking.
Always ask questions if something is unclear.
Request any necessary contact information in case you have questions or experience problems later on.
Ask for written materials in plain language.
Although a significant gap still exists between how health professionals communicate issues and how their patients understand them, more is being done to resolve this matter. One way is the U.S. Department of Health and Human Services' National Action Plan to Improve Health Literacy—click here for a plan summary.
Don't be in the dark when it comes to your health! Can't find what you need? Our Member Services Team is only a phone call away – call (866) 368-7227. Or, members can check out the Compass Rose Health Plan brochure's list of terms, which defines key words used to explain coverage and benefits information.


The first fully enclosed, double-storey regional mall in the bustling town of Thohoyandou, Limpopo, is set to introduce a wide range of new retailers to its region when it opens on 24 August 2017.
A sod-turning ceremony marked the official start of construction on the new R1 billion Thavhani Mall at Thavhani City in the bustling Limpopo town of Thohoyandou on Friday, 31 July 2015.
Thavhani Property Investments and the Thulamela Municipality are pleased to announce the transfer of the land on which the new 50,000m2 Thavhani Mall will be developed.


text:
Bill seeks additional restrictions on 'double dipping' by state retirees
But opponents say forcing retired state employees or teachers to forgo their pensions when returning to work will only harm those workers and hamper efforts to fill niche jobs.
AUGUSTA — Organizations representing teachers, school administrators and state employees warned against preventing retirees from collecting both a pension and a paycheck at a time when many schools are struggling to fill specialized jobs.
Democratic and Republican members of a legislative committee also appeared skeptical of the financial need for additional restrictions on so-called "double dipping" by public sector employees.
"I actually think the best argument you make is not a financial one but one where you are trying to bring in new blood and encourage new people to apply. … But I guess I don't follow the logic you are presenting on the financial sense," said Rep. Tom Winsor, R-Norway, a conservative member of the Legislature's Appropriations and Financial Affairs Committee.
The issue of "double dipping" – when school or state employees retire with a pension but then go back to work in the public sector – has been an emotional one for years. The debate has been most heated in education circles, where some superintendents and principals have collected six-figure salaries on top of their pension benefits.
In 2014, nearly 2,400 public employees drew both a salary and a pension, with the average pension $28,832, according to data provided by the Maine Public Employees Retirement System.
The Legislature changed the law in 2011 to specify that public sector retirees could only receive 75 percent of the prior salary after returning and work no longer than five years. Additionally, employees must wait at least 30 days before returning to work after retirement.
But Rep. Heidi Sampson, R-Alfred, has introduced legislation that would effectively force retired state employees or teachers to suspend their pension payments if they opt to return to working for the state or in public schools.
"When someone is drawing from the retirement system while at the same time still working, they are no longer contributing to the system," Sampson said. "This, in fact, will have a negative impact on those state employees who have not retired and it exacerbates the unfunded liability. Additionally, this practice denies individuals a better-paying position who would otherwise be contributing to the retirement system."
But bill opponents said the Maine pension system's unfunded liability is steadily decreasing. They also said Sampson's bill, L.D. 1509, would hurt state retirees who need to supplement their pension income while hampering the ability of schools and state agencies to fill niche positions.
Richard Durost, executive director of the Maine Principals' Association, said that contrary to suggestions often heard in the "double dipping" debate, schools are not choosing retirees over younger applicants. Instead, schools often turn to retirees because of a lack of qualified applicants, particularly in such specialized subjects as physics, chemistry or calculus or for top administrative posts, Durost said.
And the issue is not restricted to rural Maine, Durost said. A school district not far from Augusta is "scrambling for candidates" to fill three principal openings next year.
"We have some very difficult positions to fill out there," Durost said. "And if the local decision is the retiree is the best possible teacher to put in front of those kids in the classroom, or the retiree is the best possible person to put in the leadership of the school in that district, we should give them that option."
Eileen King, deputy executive director of the Maine School Management Association, said there are currently seven interim superintendents working in districts looking for a permanent replacement with another half-dozen openings expected by the end of the school year.
According to the Maine Education Association, nearly 40 percent of Maine teachers are age 55 or older, creating a situation of "a mass exodus from the profession in the next five to seven years." Additionally, John Kosinski with the MEA – the state's teachers union and advocacy organization – said retired teachers can only come back to work if the local school board and superintendent decide they deserve the job and, even then, are brought back as probationary teachers who can be let go "without cause."
"The bill discriminates only against Maine teachers," Kosinski said. "There is nothing stopping someone from Massachusetts from retiring, moving to Maine, re-entering the workforce and re-entering teaching with no penalty."
But L.D. 1509 has the support of the administration of Gov. Paul LePage, who has previously lashed out at so-called double-dippers.
Ian Swanberg, director of governmental and legislative affairs at the Department of Administrative and Financial Services, said the current system does not encourage schools or state agencies to play for the future by cultivating younger employees.
"Watching a manager retire in August and then return to their previous job in September is certain to demoralize the workers who are looking for upward mobility in their careers," Swanberg said. "This is likely to exacerbate the recruitment and retention issues the state and school departments already face."
Several Democratic lawmakers and at least three Republicans on the 13-member Appropriations Committee questioned Swanberg and other witnesses about whether the current system really places a strain on the pension system, however. Sen. Roger Katz, R-Augusta, said he has not heard many complaints from state employees frustrated that they could not advance because a retiree was rehired.
The committee had not yet announced a date for the work session on the bill.
maine legislature

redpajama_set_name: RedPajamaCommonCrawl


How fast is emulated PowerPC on a ~3Ghz Core2 with 6Mb L2 cache?
Does PPC-JIT exist yet for x86 CPUs?
How fast is 68k JIT on a ~3Ghz Core2 with 6Mb L2 cache?
Would it be sane to port AOS4 to emulated 68k?
I personally think that Hyperion's bet bet is to get it working on more hardware, quickly. That last word (in bold) is the key; an x86 port would NOT be quickly.
You can quickly port it to any hardware you want, it won't magically sell ouside Amiga fans.
And would it magically sell "ouside Amiga fans" (sic.) if a time consuming port to x86 were done?
Maybe, maybe not. It's hardly selling now, are they making much money? I know the hardware isnt' usefull to a lot of people. If it were on a hardware base that was vastly supported, easy to manufacture for, parts were as easy as you local computer store, cheap, maybe people would.
Non mainstream Hardware is a bad choice for increasing your user base esp when that H/W is so few and far between that no one realy knows about it or can see any reason for porting stuff to it. I maen, it's underpowered, expensive and low volume. Why would that be good to develop a program or hardware for. I don't see more users being attracted to that.
At the moment your argument is AMIGA only fans are the only ones going to buy AMIGA OS, when clearly, AMIGA fans are saying, they are not going to buy it, they don't want to develop for it because it's too slow and expensive. Seems to me that you just argued to get LESS AMIGA fans.
Unless those reducing fans are vastly wealthy have a lot of time to wait for new products that have slower performance and do less cause that's what we are talking about here.
I quite frankly are amazed there is still any development.
Even Dave Haynie (ex AMIGA designer) said x86 would be the way now and that was yeas ago.
Last edited by SHADES on 23-Mar-2009 at 09:41 AM.
Last edited by SHADES on 23-Mar-2009 at 09:31 AM.
Hyperion can continue to seek out overpriced and inferior architectures to support such as PPC to increase their hardware base quickly, but that means they've chosen to confine themselves to a very small base of hobby users, and hence low-volume sales/revenue. That won't keep the lights on for very long because most of the hobby users who can afford to buy a SAM have already done so. Nor will it provide enough revenue to keep any further development going. No bank would support such a venture. They would support a business plan based on a sound strategy which showed future growth, and the PPC line isn't it. PPC is the end of the line for Amiga as we know it. People can keep clinging to "console dreams" or their false beliefs that endianess can't be overcome. That won't pay any bills either. AmigaOS will have to move to something new soon.
There are two free usable PowerPC based emulators for X86/X64 PCs i.e.
1. Dolphin Nintendo GameCube/Wii emulator.
2. PearPC-JIT "new world" PowerMacintosh emulator.
PearPC-JIT is practically pointless (unless if you are developing PowerPC embedded devices) since Apple released MacOS X for X86.
From memory, PearPC-JIT 0.4pre amd MacOS X 10.2 was quite usable on AMD Mobile Athlon 64 3000+(1.8Ghz). I haven't set-up PearPC on any of my Core 2 machines.
Can any of the X86 parrots name ONE (just one) X86 motherboard that is available with any programming documentation?
Can any of the PS3 parrots tell me where I can find the programmning documentation of the PS3 motherboard ?
Good luck in breaching PS3's hypervisor. The closest you get to NVIDIA RSX GPU is via NVIDIA's LibCGM i.e. think of NVAPI or CUDA for NVIDIA G70 type GPU.
Can any of the X86 parrots name ONE (just one) X86 motherboard that is available with any programming documentation? The motherboard manufacturers don't release their info to anyone, so how on earth would Hyperion be able to port OS4 to any X86 motherboard?
And, as Rogue has said many times, the existence of a Linux or other open-source port is NOT the manufacturer support that they would need.
First, contact Intel or AMD, not mainboard manufactures. Intel or AMD governs/leads/dicates the hardware X86 clone army.
Last edited by Hammer on 23-Mar-2009 at 09:59 AM.
Intel reference mainboards are manufactured by …. Foxconn.
*squark (sorry my parrot is still bad).
There is plenty of documentation on the Internet on how to program for x86 platforms. PCI and PCI express and countless chipset designs are all made for the x86 platform and will continue to evolve and get better because there is a huge userbase for them.
Linux is free distro Ubuntu has heaps of code available for D/L with HAL documentation etc. how do you think they made the OS work on x86?
Regardless, there is plenty of information on how to get it to interface. Heck even the pre-boot code (initalization) for current AMIGA Hw is x86 from memory. It's no longer going to be some engineer has a brainwave of how to make a better PC on re-designed non x86 platforms. They are already doing it(creating new hardware) for an extensivly supported platform that just happens to use the x86 code base. It's cheaper for them to improve their products or invent new ones on and unless you have billions, I doubt u will re-invent the wheel now.
Last edited by SHADES on 23-Mar-2009 at 10:03 AM.
@Leo/@ferrels Is parrot the latest pundit safeword? What happened to apologist? All I see are a group of consumers voicing their desires. The parrot nonsense hearkens back to the days of adolescence and responses equivalent to "Yeah? Well you're stupid!"
world view incompatibility ends up with those defamatory substantives.
From: Inside the mind of a cow on a planet that's flying through space at 242.334765 miles per second.
In addtion to what SHADES said, heres my hat thrown into the ring.
I brought around 30 or so friends into the world of Amiga from non computer backgrounds. They all had to move onto other platforms when their hardware died out or they found they hit a brick wall with the Amiga capabilities.
Recently, I've been showing them vids on youtube of OS4 doing its thing and all of them got as exicted as I did and asked when they could get hold of it. After explaining the rather complex reason why they'd have to spend 500 quid on just a motherboard that really wasn't any good, they lost interest immediately. None of them wanted an underpowered computer, regardless of how responsive OS4 was in the demos because they all understand that means nothing when it comes to using the applications (which mostly are of the artwork and video fields).
Give me something I can give them that runs of the hardware they are already using (or has equal performance) and thats 30 sales right there. I'm sure this story is repeatable by many other former Amigans.
Keep with the existing hardware and the community will continue to deminish in size as clearly its been stated time and again, that a lot of us are simply not interested in the current options.
Whatever this announcement is thats coming up, if it still involves hardware that is inferior to x86 performance then its not really changing anything unless its so cheap (like the Mac Mini) that people don't mind paying.
"Anyone with a modicum of reasonableness may realize that it is like comparing the ride in the world to descend the stairs to catch the milk in the house."
Recently, I've been showing them vids on youtube of OS4 doing its thing and all of them got as exicted as I did and asked when they could get hold of it.
Of course not. You have to write something new, modern, and give people a reason to buy it... You could also give it for free (I would), but this wouldn't make them magically use it (see AROS indeed).
It's clearly the end of line, both for the current old OS architecture, and for the PPC.
If it's about survival, we need our best chance at it.
As I see it, AROS is just a port of the old AMIGA OS, there is nothing really new and no one sees any point.
Development and funding of a newer updated OS like 4.1? ..... Well, yes, there is the reason in the sentance itself, mainly because it's new, better, updated to work with better x86 hardware or at least some of it lol faster, funded and developed for, does things or the same things faster more efficiently.
If we were to use your reasoning about AMIGA OS / AROS has failed to attarct more users and that AMIGA is dead and not useful then I would like to put a counter argument we should also say make Windows 98 MK2 and see how many people would buy that and develop for it now. Fact is XP/Vista and the new Windows 7 is superior to Windows 98 and it's on the x86 H/W platform too. AMIGA OS 4.1 is superior to OS 3.9 legacy which is what AROS is ported from and to be comparable with. It's on their website.
The point is, development is hardly going to continue on a platform that no one but wealthy enthusiants can afford to have. At least on the x86 hardware that can be bought for under $50 (2nd hand), people could (if ported) enjoy the AMIGA experience and using mainstream hardware that is actively developed for.
It surely gives the best oppertunity to increase the userbase. I very much doubt there is much room for growth the other way.
Last edited by SHADES on 23-Mar-2009 at 11:50 AM.
Would be a whole lot less again/on top of what you just said if you also had to say you need to buy a $1000 PC mainboard that won't run current graphics H/W models or memory speeds or sound cards and it's CPU power is 10x less than a PC equiv. That was his point or part of it I believe.
AMIGA OS 4.1 may not be ready for everyone but it's being improved and if it is to gather further improvement and development, it makes sense to bring it to a platform that will enable all those developments to take place and be affordable to the userbase.
People might even port Firefox, they did for Linux. Linux is still developed and is now ready for mainstream use. It wasn't always the case.
Last edited by SHADES on 23-Mar-2009 at 11:41 AM.
Last edited by SHADES on 23-Mar-2009 at 11:35 AM.
Last edited by SHADES on 23-Mar-2009 at 11:33 AM.
Last edited by SHADES on 23-Mar-2009 at 11:31 AM.
Do a OS only for a expensive and slow Hardware only and make a OS not easy portable to other CPU as AROS or Linux and all newOS, is the stupidest thing a OS developer can do.
>It was "time to go x86" in 2001 when this ride started; the thing is, Hyperion never >had a mandate from Amiga, Inc. or whoever they are to do so. If Amiga, Inc. had >said "Port this to Intel/AMD architecture," then they would have by now.
Haage&Partner detect it right, and do amigaos xl and sell Amithlon.
Later can aos port in parts more and more to native X86, it is possible same way Mac do it or AFA.
it seem only when ainc get a more better looking contract they change.
Seem on this, ainc let Hyperion work on OS4 until ack want release it and announce. then the contract is going to cancel.
but inside see here, ainc seem not very happy with the job Hyperion do, because OS4 get lots of delay.
after the cebit 2003 they want buy back, read text on April.
I think with no OS4, amiga have more Users because AOS run then on faster and cheaper Hardware.
but now PPC is here and it was the false horse that is trained and financiate.
So we should look what we can do.
A way is, when the OS4 developers release there code that is ainc free, or Hyperion do not pay them, or they get for free from a leaving developer.
Last edited by bernd_afa on 23-Mar-2009 at 11:41 AM.
Erm, why would they bother using an emulator for the basis of an x86 AmigaOS? I thought, the same as for the PowerPC, that the whole point of it was to run the OS native?
Umilator? Just install WinUAE to your PC and you have fast Amiga emulation with AGA alongside Windows. More than Umilator could offer. There's your new OS.
Show me the stats if I am wrong.
At least on the x86 hardware that can be bought for under $50 (2nd hand), people can enjoy the AMIGA experience and using mainstream hardware that is actively developed for.
That is definetly not the target of all these fruitless pro x86 discussions. You propose to buy "old" hardware, which is at best half heartedly developed for, when most of the x86 supporters dream of brand new, absolutely actual hardware with "best" speed for a "moderate" price. You propose to buy old hardware, and that´s nothing else as the counter argument used in this diskussions ("PPC is dead, old slow..."). So, you have proven yourself the pointless argumentation used in such threads again and again.
Not to speak of all the other "supporters" who chose to constantly ignore the problems we will get with x86 hardware by referencing to Linux etc. without regarding to the fact that many drivers are still closed source and an effort from businesses interested in the Linux market (but in no way interested in endless discussing more-or-less Amiga interested people as customers!).
The motherboard manufacturers don't release their info to anyone, so how on earth would Hyperion be able to port OS4 to any X86 motherboard?
I may be pointing something obvious here, but wouldnt't they bend over backwards showing the info to Windows?


text:
Budgets, Performance Reviews Make Workplaces Ripe for Hostility
How to keep tempers in check during touchy start-of-year tasks
dana.wilkie@shrm.org
By Dana Wilkie January 10, 2017
The end of one year and the start of another bring tasks that can cause friction in any workplace: Managers may have to deliver bad news to employees during performance reviews; department heads may need to explain why they overspent a budget, or quibble about dividing the new budget; and workers may grow angry about the size of their bonus or salary increase.
All these conversations can be breeding grounds for hostility, finger-pointing, defensiveness and more. And stress left over from the holidays can compound people's emotions when they approach touchy subjects at work, said Norbert "Bert" Alicea, vice president of employee assistance programs and work/life services at benefits solutions firm Health Advocate Inc., based in Plymouth Meeting, Pa.
"The holidays can bring long-term issues to the surface," he said. "They can create stress, anxiety and depression among [some] employees. The combination of both professional and personal stress can be a major contributor to tension and conflict."
How can HR pros ensure that interactions remain civil?
Performance Reviews
No one likes to hear negative feedback during their performance review. The discussions between worker and supervisor can be ripe for hurt feelings, arguments and blame.
"The way employees are assessed is one of the biggest unnecessary stress factors," said Andrew Faas, founder of The Faas Foundation in Toronto, in the Ontario province of Canada,- and author of From Bully to Bull's Eye: Move Your Organization Out of the Line of Fire (RCG Press, 2017). "Subjectivity, ambiguity, biases and the ability to manipulate the performance management system has created a loathing of" such reviews.
Long before face-to-face reviews happens, managers need training on how to conduct them, said Catherine Mattice Zundel, SHRM-SCP, a consultant with Civility Partners in La Mesa, Calif.
"Performance management is one place a lot of organizations fail miserably," she said. "So many organizations never train managers on how to 'do' performance management. Every single manager out there should know how to prepare themselves for workers who react angrily, because they should've gone through a refresher training before they had the conversation. If you're not offering a refresher training on performance evaluations, do."
As part of that training, Alicea suggested asking supervisors to write down a list of reasons to help their employees understand why they received their rating. Remind supervisors to give employees suggestions to make improvements and to refer employees who feel that personal issues are keeping them from accomplishing their goals to HR.
Carole Lieberman, a Beverly Hills, Calif.-based psychiatrist and expert witness in employment cases, said it's always a good idea to first give an employee her performance review in writing.
"Let them address, in writing, what they disagree with, then the manager and employee can meet to discuss their differences of opinion, after each one has had time to think about it and cool down," she said.
Before the reviews, the HR department can remind supervisors and subordinates of some ground rules, Mattice Zundel said.
"This is our livelihood and who we are, so of course we're emotional when someone tells us we aren't meeting expectations," she said. "HR can suggest to employees—well before evaluations are scheduled—to keep emotions in check. This is a tall order. This is work. But employees who want to be heard must stick to the facts when they disagree. Keep it factual, unemotional, and focused on you."
Coach workers on how to react positively to what they perceive to be negative feedback, Alicea added.
HR managers should coach workers to turn negative feedback "into a positive or [take steps] to rectify the issue—without blaming others." If you a personal issue is interfering with someone's work, HR should encourage a discussion "to see if resources like an employee assistance program may be available to help relieve stress or address setbacks."
Budget Tensions
Workplace budgets are often a root cause of stress and tension at this time of year. While HR is not typically involved in other departments' financial discussions, those discussions can end up on HR's doorstep if conversations become heated.
"The best route for HR is to work directly with managers involved [in budget talks] to shift the discussion in a more positive and productive direction," Alicea said. "Managers set the tone, and the boundaries, for their departments, and their attitude and behavior will determine how their teams respond to potential conflict. When HR works with managers to overcome their anger or strife, it can help create an environment of mutual respect and civility, leading to easier resolution of budget reconciliation issues."
In the case of an overspent budget, it is tempting for a manager to point fingers—for instance, to blame the company for underfunding his department, to blame other departments for siphoning off his funds, or to blame subordinates for failing to be financially responsible.
"In the case of pointing fingers on overspending, this comes down to the organization's culture," Mattice Zundel said. "If your organization has a negative culture of blame, the only thing HR can do is to remind people to stay civil and keep eyes peeled for any behavior or language that is inappropriate. And in 2017, you better get moving on culture change."
One way HR can keep such talks civil, Lieberman said, is by suggesting that managers vote by secret ballot on how best to spend the year's budget, or how to avoid overspending in the future.
"Then a meeting can be held to discuss what suggestions were made, without ascribing these suggestions to the individuals who made them," she said. "This way, employees can more objectively discuss what expenditures will help the company as a whole, without being influenced by whether or not they like the employee who suggested it."
Post-Election Fallout
While the 2016 presidential campaign is over, politics may continue to be a source of friction in the workplace, said Jeanne C. Meister, founding partner of Future Workplace, an HR executive network and research firm in New York City.
[SHRM members-only Express Request: Managing Political Discussions]
"HR can expect the bitter aftereffects of the election to continue well into the first quarter of 2017," she said. "Business leaders must prepare for comments about politics entering into [company] town hall meetings, during team presentations and on the factory floor. Do not even think of banning this. It will have no impact at all."
Mattice Zundel suggests sending an e-mail to all employees—at all levels—reminding them how to conduct themselves during such discussions.
"Remind them that your organization is a workplace focused on respect and civility, so emotional and angry political conversations have no place in your company," she said.
She said HR can also offer these reminders:
*Although political conversations evoke strong emotions, everyone should keep their volume and emotions in check.
*If you don't like where a conversation is headed, say, "Excuse me, I'm going to step out" and walk away.
*Don't expect to convince others to agree with your political views. "If you go into political conversations knowing it will only be a conversation, and you will never be successful in swaying people, it can help keep your frustrations in check," Mattice Zundel said.
*Agree to disagree. "The workplace is already full of different people who believe in different religions, ways of life, and more, so continue to celebrate those differences and enjoy your co-workers," Mattice Zundel said.
Communication Employee Conduct Employee Relations Communication
Virutal Workplace Harassment: Practices for Leading a Healthy Culture
Why Executives Give Up the Corner Office
IRS to Permit Truncated Social Security Numbers on W-2s to Fight ID Theft
Summertime—and Working Ain't Easy


text:
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/io.h>
#include <linux/slab.h>
#include <linux/sysrq.h>
#include <linux/device.h>
#include <linux/clk.h>
#include <linux/amba/bus.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/miscdevice.h>
#include <linux/vmalloc.h>
#include <linux/mutex.h>
#include <linux/module.h>
#include <asm/hardware/coresight.h>
#include <asm/sections.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Alexander Shishkin");

/*
 * ETM tracer state
 */
struct tracectx {
	unsigned int	etb_bufsz;
	void __iomem	*etb_regs;
	void __iomem	**etm_regs;
	int		etm_regs_count;
	unsigned long	flags;
	int		ncmppairs;
	int		etm_portsz;
	int		etm_contextid_size;
	u32		etb_fc;
	unsigned long	range_start;
	unsigned long	range_end;
	unsigned long	data_range_start;
	unsigned long	data_range_end;
	bool		dump_initial_etb;
	struct device	*dev;
	struct clk	*emu_clk;
	struct mutex	mutex;
};

static struct tracectx tracer = {
	.range_start = (unsigned long)_stext,
	.range_end = (unsigned long)_etext,
};

static inline bool trace_isrunning(struct tracectx *t)
{
	return !!(t->flags & TRACER_RUNNING);
}

static int etm_setup_address_range(struct tracectx *t, int id, int n,
		unsigned long start, unsigned long end, int exclude, int data)
{
	u32 flags = ETMAAT_ARM | ETMAAT_IGNCONTEXTID | ETMAAT_IGNSECURITY |
		    ETMAAT_NOVALCMP;

	if (n < 1 || n > t->ncmppairs)
		return -EINVAL;

	/* comparators and ranges are numbered starting with 1 as opposed
	 * to bits in a word */
	n--;

	if (data)
		flags |= ETMAAT_DLOADSTORE;
	else
		flags |= ETMAAT_IEXEC;

	/* first comparator for the range */
	etm_writel(t, id, flags, ETMR_COMP_ACC_TYPE(n * 2));
	etm_writel(t, id, start, ETMR_COMP_VAL(n * 2));

	/* second comparator is right next to it */
	etm_writel(t, id, flags, ETMR_COMP_ACC_TYPE(n * 2 + 1));
	etm_writel(t, id, end, ETMR_COMP_VAL(n * 2 + 1));

	if (data) {
		flags = exclude ? ETMVDC3_EXCLONLY : 0;
		if (exclude)
			n += 8;
		etm_writel(t, id, flags | BIT(n), ETMR_VIEWDATACTRL3);
	} else {
		flags = exclude ? ETMTE_INCLEXCL : 0;
		etm_writel(t, id, flags | (1 << n), ETMR_TRACEENCTRL);
	}

	return 0;
}

static int trace_start_etm(struct tracectx *t, int id)
{
	u32 v;
	unsigned long timeout = TRACER_TIMEOUT;

	v = ETMCTRL_OPTS | ETMCTRL_PROGRAM | ETMCTRL_PORTSIZE(t->etm_portsz);
	v |= ETMCTRL_CONTEXTIDSIZE(t->etm_contextid_size);

	if (t->flags & TRACER_CYCLE_ACC)
		v |= ETMCTRL_CYCLEACCURATE;

	if (t->flags & TRACER_BRANCHOUTPUT)
		v |= ETMCTRL_BRANCH_OUTPUT;

	if (t->flags & TRACER_TRACE_DATA)
		v |= ETMCTRL_DATA_DO_ADDR;

	if (t->flags & TRACER_TIMESTAMP)
		v |= ETMCTRL_TIMESTAMP_EN;

	if (t->flags & TRACER_RETURN_STACK)
		v |= ETMCTRL_RETURN_STACK_EN;

	etm_unlock(t, id);

	etm_writel(t, id, v, ETMR_CTRL);

	while (!(etm_readl(t, id, ETMR_CTRL) & ETMCTRL_PROGRAM) && --timeout)
		;
	if (!timeout) {
		dev_dbg(t->dev, "Waiting for progbit to assert timed out\n");
		etm_lock(t, id);
		return -EFAULT;
	}

	if (t->range_start || t->range_end)
		etm_setup_address_range(t, id, 1,
					t->range_start, t->range_end, 0, 0);
	else
		etm_writel(t, id, ETMTE_INCLEXCL, ETMR_TRACEENCTRL);

	etm_writel(t, id, 0, ETMR_TRACEENCTRL2);
	etm_writel(t, id, 0, ETMR_TRACESSCTRL);
	etm_writel(t, id, 0x6f, ETMR_TRACEENEVT);

	etm_writel(t, id, 0, ETMR_VIEWDATACTRL1);
	etm_writel(t, id, 0, ETMR_VIEWDATACTRL2);

	if (t->data_range_start || t->data_range_end)
		etm_setup_address_range(t, id, 2, t->data_range_start,
					t->data_range_end, 0, 1);
	else
		etm_writel(t, id, ETMVDC3_EXCLONLY, ETMR_VIEWDATACTRL3);

	etm_writel(t, id, 0x6f, ETMR_VIEWDATAEVT);

	v &= ~ETMCTRL_PROGRAM;
	v |= ETMCTRL_PORTSEL;

	etm_writel(t, id, v, ETMR_CTRL);

	timeout = TRACER_TIMEOUT;
	while (etm_readl(t, id, ETMR_CTRL) & ETMCTRL_PROGRAM && --timeout)
		;
	if (!timeout) {
		dev_dbg(t->dev, "Waiting for progbit to deassert timed out\n");
		etm_lock(t, id);
		return -EFAULT;
	}

	etm_lock(t, id);
	return 0;
}

static int trace_start(struct tracectx *t)
{
	int ret;
	int id;
	u32 etb_fc = t->etb_fc;

	etb_unlock(t);

	t->dump_initial_etb = false;
	etb_writel(t, 0, ETBR_WRITEADDR);
	etb_writel(t, etb_fc, ETBR_FORMATTERCTRL);
	etb_writel(t, 1, ETBR_CTRL);

	etb_lock(t);

	/* configure etm(s) */
	for (id = 0; id < t->etm_regs_count; id++) {
		ret = trace_start_etm(t, id);
		if (ret)
			return ret;
	}

	t->flags |= TRACER_RUNNING;

	return 0;
}

static int trace_stop_etm(struct tracectx *t, int id)
{
	unsigned long timeout = TRACER_TIMEOUT;

	etm_unlock(t, id);

	etm_writel(t, id, 0x440, ETMR_CTRL);
	while (!(etm_readl(t, id, ETMR_CTRL) & ETMCTRL_PROGRAM) && --timeout)
		;
	if (!timeout) {
		dev_err(t->dev,
			"etm%d: Waiting for progbit to assert timed out\n",
			id);
		etm_lock(t, id);
		return -EFAULT;
	}

	etm_lock(t, id);
	return 0;
}

static int trace_power_down_etm(struct tracectx *t, int id)
{
	unsigned long timeout = TRACER_TIMEOUT;
	etm_unlock(t, id);
	while (!(etm_readl(t, id, ETMR_STATUS) & ETMST_PROGBIT) && --timeout)
		;
	if (!timeout) {
		dev_err(t->dev, "etm%d: Waiting for status progbit to assert timed out\n",
			id);
		etm_lock(t, id);
		return -EFAULT;
	}

	etm_writel(t, id, 0x441, ETMR_CTRL);

	etm_lock(t, id);
	return 0;
}

static int trace_stop(struct tracectx *t)
{
	int id;
	unsigned long timeout = TRACER_TIMEOUT;
	u32 etb_fc = t->etb_fc;

	for (id = 0; id < t->etm_regs_count; id++)
		trace_stop_etm(t, id);

	for (id = 0; id < t->etm_regs_count; id++)
		trace_power_down_etm(t, id);

	etb_unlock(t);
	if (etb_fc) {
		etb_fc |= ETBFF_STOPFL;
		etb_writel(t, t->etb_fc, ETBR_FORMATTERCTRL);
	}
	etb_writel(t, etb_fc | ETBFF_MANUAL_FLUSH, ETBR_FORMATTERCTRL);

	timeout = TRACER_TIMEOUT;
	while (etb_readl(t, ETBR_FORMATTERCTRL) &
			ETBFF_MANUAL_FLUSH && --timeout)
		;
	if (!timeout) {
		dev_dbg(t->dev, "Waiting for formatter flush to commence "
				"timed out\n");
		etb_lock(t);
		return -EFAULT;
	}

	etb_writel(t, 0, ETBR_CTRL);

	etb_lock(t);

	t->flags &= ~TRACER_RUNNING;

	return 0;
}

static int etb_getdatalen(struct tracectx *t)
{
	u32 v;
	int wp;

	v = etb_readl(t, ETBR_STATUS);

	if (v & 1)
		return t->etb_bufsz;

	wp = etb_readl(t, ETBR_WRITEADDR);
	return wp;
}

/* sysrq+v will always stop the running trace and leave it at that */
static void etm_dump(void)
{
	struct tracectx *t = &tracer;
	u32 first = 0;
	int length;

	if (!t->etb_regs) {
		printk(KERN_INFO "No tracing hardware found\n");
		return;
	}

	if (trace_isrunning(t))
		trace_stop(t);

	etb_unlock(t);

	length = etb_getdatalen(t);

	if (length == t->etb_bufsz)
		first = etb_readl(t, ETBR_WRITEADDR);

	etb_writel(t, first, ETBR_READADDR);

	printk(KERN_INFO "Trace buffer contents length: %d\n", length);
	printk(KERN_INFO "--- ETB buffer begin ---\n");
	for (; length; length--)
		printk("%08x", cpu_to_be32(etb_readl(t, ETBR_READMEM)));
	printk(KERN_INFO "\n--- ETB buffer end ---\n");

	etb_lock(t);
}

static void sysrq_etm_dump(int key)
{
	if (!mutex_trylock(&tracer.mutex)) {
		printk(KERN_INFO "Tracing hardware busy\n");
		return;
	}
	dev_dbg(tracer.dev, "Dumping ETB buffer\n");
	etm_dump();
	mutex_unlock(&tracer.mutex);
}

static struct sysrq_key_op sysrq_etm_op = {
	.handler = sysrq_etm_dump,
	.help_msg = "etm-buffer-dump(v)",
	.action_msg = "etm",
};

static int etb_open(struct inode *inode, struct file *file)
{
	if (!tracer.etb_regs)
		return -ENODEV;

	file->private_data = &tracer;

	return nonseekable_open(inode, file);
}

static ssize_t etb_read(struct file *file, char __user *data,
		size_t len, loff_t *ppos)
{
	int total, i;
	long length;
	struct tracectx *t = file->private_data;
	u32 first = 0;
	u32 *buf;
	int wpos;
	int skip;
	long wlength;
	loff_t pos = *ppos;

	mutex_lock(&t->mutex);

	if (trace_isrunning(t)) {
		length = 0;
		goto out;
	}

	etb_unlock(t);

	total = etb_getdatalen(t);
	if (total == 0 && t->dump_initial_etb)
		total = t->etb_bufsz;
	if (total == t->etb_bufsz)
		first = etb_readl(t, ETBR_WRITEADDR);

	if (pos > total * 4) {
		skip = 0;
		wpos = total;
	} else {
		skip = (int)pos % 4;
		wpos = (int)pos / 4;
	}
	total -= wpos;
	first = (first + wpos) % t->etb_bufsz;

	etb_writel(t, first, ETBR_READADDR);

	wlength = min(total, DIV_ROUND_UP(skip + (int)len, 4));
	length = min(total * 4 - skip, (int)len);
	buf = vmalloc(wlength * 4);

	dev_dbg(t->dev, "ETB read %ld bytes to %lld from %ld words at %d\n",
		length, pos, wlength, first);
	dev_dbg(t->dev, "ETB buffer length: %d\n", total + wpos);
	dev_dbg(t->dev, "ETB status reg: %x\n", etb_readl(t, ETBR_STATUS));
	for (i = 0; i < wlength; i++)
		buf[i] = etb_readl(t, ETBR_READMEM);

	etb_lock(t);

	length -= copy_to_user(data, (u8 *)buf + skip, length);
	vfree(buf);
	*ppos = pos + length;

out:
	mutex_unlock(&t->mutex);

	return length;
}

static int etb_release(struct inode *inode, struct file *file)
{
	/* there's nothing to do here, actually */
	return 0;
}

static const struct file_operations etb_fops = {
	.owner = THIS_MODULE,
	.read = etb_read,
	.open = etb_open,
	.release = etb_release,
	.llseek = no_llseek,
};

static struct miscdevice etb_miscdev = {
	.name = "tracebuf",
	.minor = 0,
	.fops = &etb_fops,
};

static int etb_probe(struct amba_device *dev, const struct amba_id *id)
{
	struct tracectx *t = &tracer;
	int ret = 0;

	ret = amba_request_regions(dev, NULL);
	if (ret)
		goto out;

	mutex_lock(&t->mutex);
	t->etb_regs = ioremap_nocache(dev->res.start, resource_size(&dev->res));
	if (!t->etb_regs) {
		ret = -ENOMEM;
		goto out_release;
	}

	t->dev = &dev->dev;
	t->dump_initial_etb = true;
	amba_set_drvdata(dev, t);

	etb_unlock(t);
	t->etb_bufsz = etb_readl(t, ETBR_DEPTH);
	dev_dbg(&dev->dev, "Size: %x\n", t->etb_bufsz);

	/* make sure trace capture is disabled */
	etb_writel(t, 0, ETBR_CTRL);
	etb_writel(t, 0x1000, ETBR_FORMATTERCTRL);
	etb_lock(t);
	mutex_unlock(&t->mutex);

	etb_miscdev.parent = &dev->dev;

	ret = misc_register(&etb_miscdev);
	if (ret)
		goto out_unmap;

	/* Get optional clock. Currently used to select clock source on omap3 */
	t->emu_clk = clk_get(&dev->dev, "emu_src_ck");
	if (IS_ERR(t->emu_clk))
		dev_dbg(&dev->dev, "Failed to obtain emu_src_ck.\n");
	else
		clk_enable(t->emu_clk);

	dev_dbg(&dev->dev, "ETB AMBA driver initialized.\n");

out:
	return ret;

out_unmap:
	mutex_lock(&t->mutex);
	iounmap(t->etb_regs);
	t->etb_regs = NULL;

out_release:
	mutex_unlock(&t->mutex);
	amba_release_regions(dev);

	return ret;
}

static int etb_remove(struct amba_device *dev)
{
	struct tracectx *t = amba_get_drvdata(dev);

	iounmap(t->etb_regs);
	t->etb_regs = NULL;

	if (!IS_ERR(t->emu_clk)) {
		clk_disable(t->emu_clk);
		clk_put(t->emu_clk);
	}

	amba_release_regions(dev);

	return 0;
}

static struct amba_id etb_ids[] = {
	{
		.id	= 0x0003b907,
		.mask	= 0x0007ffff,
	},
	{ 0, 0 },
};

static struct amba_driver etb_driver = {
	.drv		= {
		.name	= "etb",
		.owner	= THIS_MODULE,
	},
	.probe		= etb_probe,
	.remove		= etb_remove,
	.id_table	= etb_ids,
};

/* use a sysfs file "trace_running" to start/stop tracing */
static ssize_t trace_running_show(struct kobject *kobj,
				  struct kobj_attribute *attr,
				  char *buf)
{
	return sprintf(buf, "%x\n", trace_isrunning(&tracer));
}

static ssize_t trace_running_store(struct kobject *kobj,
				   struct kobj_attribute *attr,
				   const char *buf, size_t n)
{
	unsigned int value;
	int ret;

	if (sscanf(buf, "%u", &value) != 1)
		return -EINVAL;

	mutex_lock(&tracer.mutex);
	if (!tracer.etb_regs)
		ret = -ENODEV;
	else
		ret = value ? trace_start(&tracer) : trace_stop(&tracer);
	mutex_unlock(&tracer.mutex);

	return ret ? : n;
}

static struct kobj_attribute trace_running_attr =
	__ATTR(trace_running, 0644, trace_running_show, trace_running_store);

static ssize_t trace_info_show(struct kobject *kobj,
				  struct kobj_attribute *attr,
				  char *buf)
{
	u32 etb_wa, etb_ra, etb_st, etb_fc, etm_ctrl, etm_st;
	int datalen;
	int id;
	int ret;

	mutex_lock(&tracer.mutex);
	if (tracer.etb_regs) {
		etb_unlock(&tracer);
		datalen = etb_getdatalen(&tracer);
		etb_wa = etb_readl(&tracer, ETBR_WRITEADDR);
		etb_ra = etb_readl(&tracer, ETBR_READADDR);
		etb_st = etb_readl(&tracer, ETBR_STATUS);
		etb_fc = etb_readl(&tracer, ETBR_FORMATTERCTRL);
		etb_lock(&tracer);
	} else {
		etb_wa = etb_ra = etb_st = etb_fc = ~0;
		datalen = -1;
	}

	ret = sprintf(buf, "Trace buffer len: %d\nComparator pairs: %d\n"
			"ETBR_WRITEADDR:\t%08x\n"
			"ETBR_READADDR:\t%08x\n"
			"ETBR_STATUS:\t%08x\n"
			"ETBR_FORMATTERCTRL:\t%08x\n",
			datalen,
			tracer.ncmppairs,
			etb_wa,
			etb_ra,
			etb_st,
			etb_fc
			);

	for (id = 0; id < tracer.etm_regs_count; id++) {
		etm_unlock(&tracer, id);
		etm_ctrl = etm_readl(&tracer, id, ETMR_CTRL);
		etm_st = etm_readl(&tracer, id, ETMR_STATUS);
		etm_lock(&tracer, id);
		ret += sprintf(buf + ret, "ETMR_CTRL:\t%08x\n"
			"ETMR_STATUS:\t%08x\n",
			etm_ctrl,
			etm_st
			);
	}
	mutex_unlock(&tracer.mutex);

	return ret;
}

static struct kobj_attribute trace_info_attr =
	__ATTR(trace_info, 0444, trace_info_show, NULL);

static ssize_t trace_mode_show(struct kobject *kobj,
				  struct kobj_attribute *attr,
				  char *buf)
{
	return sprintf(buf, "%d %d\n",
			!!(tracer.flags & TRACER_CYCLE_ACC),
			tracer.etm_portsz);
}

static ssize_t trace_mode_store(struct kobject *kobj,
				   struct kobj_attribute *attr,
				   const char *buf, size_t n)
{
	unsigned int cycacc, portsz;

	if (sscanf(buf, "%u %u", &cycacc, &portsz) != 2)
		return -EINVAL;

	mutex_lock(&tracer.mutex);
	if (cycacc)
		tracer.flags |= TRACER_CYCLE_ACC;
	else
		tracer.flags &= ~TRACER_CYCLE_ACC;

	tracer.etm_portsz = portsz & 0x0f;
	mutex_unlock(&tracer.mutex);

	return n;
}

static struct kobj_attribute trace_mode_attr =
	__ATTR(trace_mode, 0644, trace_mode_show, trace_mode_store);

static ssize_t trace_contextid_size_show(struct kobject *kobj,
					 struct kobj_attribute *attr,
					 char *buf)
{
	/* 0: No context id tracing, 1: One byte, 2: Two bytes, 3: Four bytes */
	return sprintf(buf, "%d\n", (1 << tracer.etm_contextid_size) >> 1);
}

static ssize_t trace_contextid_size_store(struct kobject *kobj,
					  struct kobj_attribute *attr,
					  const char *buf, size_t n)
{
	unsigned int contextid_size;

	if (sscanf(buf, "%u", &contextid_size) != 1)
		return -EINVAL;

	if (contextid_size == 3 || contextid_size > 4)
		return -EINVAL;

	mutex_lock(&tracer.mutex);
	tracer.etm_contextid_size = fls(contextid_size);
	mutex_unlock(&tracer.mutex);

	return n;
}

static struct kobj_attribute trace_contextid_size_attr =
	__ATTR(trace_contextid_size, 0644,
		trace_contextid_size_show, trace_contextid_size_store);

static ssize_t trace_branch_output_show(struct kobject *kobj,
					struct kobj_attribute *attr,
					char *buf)
{
	return sprintf(buf, "%d\n", !!(tracer.flags & TRACER_BRANCHOUTPUT));
}

static ssize_t trace_branch_output_store(struct kobject *kobj,
					 struct kobj_attribute *attr,
					 const char *buf, size_t n)
{
	unsigned int branch_output;

	if (sscanf(buf, "%u", &branch_output) != 1)
		return -EINVAL;

	mutex_lock(&tracer.mutex);
	if (branch_output) {
		tracer.flags |= TRACER_BRANCHOUTPUT;
		/* Branch broadcasting is incompatible with the return stack */
		tracer.flags &= ~TRACER_RETURN_STACK;
	} else {
		tracer.flags &= ~TRACER_BRANCHOUTPUT;
	}
	mutex_unlock(&tracer.mutex);

	return n;
}

static struct kobj_attribute trace_branch_output_attr =
	__ATTR(trace_branch_output, 0644,
		trace_branch_output_show, trace_branch_output_store);

static ssize_t trace_return_stack_show(struct kobject *kobj,
				  struct kobj_attribute *attr,
				  char *buf)
{
	return sprintf(buf, "%d\n", !!(tracer.flags & TRACER_RETURN_STACK));
}

static ssize_t trace_return_stack_store(struct kobject *kobj,
				   struct kobj_attribute *attr,
				   const char *buf, size_t n)
{
	unsigned int return_stack;

	if (sscanf(buf, "%u", &return_stack) != 1)
		return -EINVAL;

	mutex_lock(&tracer.mutex);
	if (return_stack) {
		tracer.flags |= TRACER_RETURN_STACK;
		/* Return stack is incompatible with branch broadcasting */
		tracer.flags &= ~TRACER_BRANCHOUTPUT;
	} else {
		tracer.flags &= ~TRACER_RETURN_STACK;
	}
	mutex_unlock(&tracer.mutex);

	return n;
}

static struct kobj_attribute trace_return_stack_attr =
	__ATTR(trace_return_stack, 0644,
		trace_return_stack_show, trace_return_stack_store);

static ssize_t trace_timestamp_show(struct kobject *kobj,
				  struct kobj_attribute *attr,
				  char *buf)
{
	return sprintf(buf, "%d\n", !!(tracer.flags & TRACER_TIMESTAMP));
}

static ssize_t trace_timestamp_store(struct kobject *kobj,
				   struct kobj_attribute *attr,
				   const char *buf, size_t n)
{
	unsigned int timestamp;

	if (sscanf(buf, "%u", &timestamp) != 1)
		return -EINVAL;

	mutex_lock(&tracer.mutex);
	if (timestamp)
		tracer.flags |= TRACER_TIMESTAMP;
	else
		tracer.flags &= ~TRACER_TIMESTAMP;
	mutex_unlock(&tracer.mutex);

	return n;
}

static struct kobj_attribute trace_timestamp_attr =
	__ATTR(trace_timestamp, 0644,
		trace_timestamp_show, trace_timestamp_store);

static ssize_t trace_range_show(struct kobject *kobj,
				  struct kobj_attribute *attr,
				  char *buf)
{
	return sprintf(buf, "%08lx %08lx\n",
			tracer.range_start, tracer.range_end);
}

static ssize_t trace_range_store(struct kobject *kobj,
				   struct kobj_attribute *attr,
				   const char *buf, size_t n)
{
	unsigned long range_start, range_end;

	if (sscanf(buf, "%lx %lx", &range_start, &range_end) != 2)
		return -EINVAL;

	mutex_lock(&tracer.mutex);
	tracer.range_start = range_start;
	tracer.range_end = range_end;
	mutex_unlock(&tracer.mutex);

	return n;
}

static struct kobj_attribute trace_range_attr =
	__ATTR(trace_range, 0644, trace_range_show, trace_range_store);

static ssize_t trace_data_range_show(struct kobject *kobj,
				  struct kobj_attribute *attr,
				  char *buf)
{
	unsigned long range_start;
	u64 range_end;
	mutex_lock(&tracer.mutex);
	range_start = tracer.data_range_start;
	range_end = tracer.data_range_end;
	if (!range_end && (tracer.flags & TRACER_TRACE_DATA))
		range_end = 0x100000000ULL;
	mutex_unlock(&tracer.mutex);
	return sprintf(buf, "%08lx %08llx\n", range_start, range_end);
}

static ssize_t trace_data_range_store(struct kobject *kobj,
				   struct kobj_attribute *attr,
				   const char *buf, size_t n)
{
	unsigned long range_start;
	u64 range_end;

	if (sscanf(buf, "%lx %llx", &range_start, &range_end) != 2)
		return -EINVAL;

	mutex_lock(&tracer.mutex);
	tracer.data_range_start = range_start;
	tracer.data_range_end = (unsigned long)range_end;
	if (range_end)
		tracer.flags |= TRACER_TRACE_DATA;
	else
		tracer.flags &= ~TRACER_TRACE_DATA;
	mutex_unlock(&tracer.mutex);

	return n;
}

static struct kobj_attribute trace_data_range_attr =
	__ATTR(trace_data_range, 0644,
		trace_data_range_show, trace_data_range_store);

static int etm_probe(struct amba_device *dev, const struct amba_id *id)
{
	struct tracectx *t = &tracer;
	int ret = 0;
	void __iomem **new_regs;
	int new_count;
	u32 etmccr;
	u32 etmidr;
	u32 etmccer = 0;
	u8 etm_version = 0;

	mutex_lock(&t->mutex);
	new_count = t->etm_regs_count + 1;
	new_regs = krealloc(t->etm_regs,
				sizeof(t->etm_regs[0]) * new_count, GFP_KERNEL);

	if (!new_regs) {
		dev_dbg(&dev->dev, "Failed to allocate ETM register array\n");
		ret = -ENOMEM;
		goto out;
	}
	t->etm_regs = new_regs;

	ret = amba_request_regions(dev, NULL);
	if (ret)
		goto out;

	t->etm_regs[t->etm_regs_count] =
		ioremap_nocache(dev->res.start, resource_size(&dev->res));
	if (!t->etm_regs[t->etm_regs_count]) {
		ret = -ENOMEM;
		goto out_release;
	}

	amba_set_drvdata(dev, t->etm_regs[t->etm_regs_count]);

	t->flags = TRACER_CYCLE_ACC | TRACER_TRACE_DATA | TRACER_BRANCHOUTPUT;
	t->etm_portsz = 1;
	t->etm_contextid_size = 3;

	etm_unlock(t, t->etm_regs_count);
	(void)etm_readl(t, t->etm_regs_count, ETMMR_PDSR);
	/* dummy first read */
	(void)etm_readl(&tracer, t->etm_regs_count, ETMMR_OSSRR);

	etmccr = etm_readl(t, t->etm_regs_count, ETMR_CONFCODE);
	t->ncmppairs = etmccr & 0xf;
	if (etmccr & ETMCCR_ETMIDR_PRESENT) {
		etmidr = etm_readl(t, t->etm_regs_count, ETMR_ID);
		etm_version = ETMIDR_VERSION(etmidr);
		if (etm_version >= ETMIDR_VERSION_3_1)
			etmccer = etm_readl(t, t->etm_regs_count, ETMR_CCE);
	}
	etm_writel(t, t->etm_regs_count, 0x441, ETMR_CTRL);
	etm_writel(t, t->etm_regs_count, new_count, ETMR_TRACEIDR);
	etm_lock(t, t->etm_regs_count);

	ret = sysfs_create_file(&dev->dev.kobj,
			&trace_running_attr.attr);
	if (ret)
		goto out_unmap;

	/* failing to create any of these two is not fatal */
	ret = sysfs_create_file(&dev->dev.kobj, &trace_info_attr.attr);
	if (ret)
		dev_dbg(&dev->dev, "Failed to create trace_info in sysfs\n");

	ret = sysfs_create_file(&dev->dev.kobj, &trace_mode_attr.attr);
	if (ret)
		dev_dbg(&dev->dev, "Failed to create trace_mode in sysfs\n");

	ret = sysfs_create_file(&dev->dev.kobj,
				&trace_contextid_size_attr.attr);
	if (ret)
		dev_dbg(&dev->dev,
			"Failed to create trace_contextid_size in sysfs\n");

	ret = sysfs_create_file(&dev->dev.kobj,
				&trace_branch_output_attr.attr);
	if (ret)
		dev_dbg(&dev->dev,
			"Failed to create trace_branch_output in sysfs\n");

	if (etmccer & ETMCCER_RETURN_STACK_IMPLEMENTED) {
		ret = sysfs_create_file(&dev->dev.kobj,
					&trace_return_stack_attr.attr);
		if (ret)
			dev_dbg(&dev->dev,
			      "Failed to create trace_return_stack in sysfs\n");
	}

	if (etmccer & ETMCCER_TIMESTAMPING_IMPLEMENTED) {
		ret = sysfs_create_file(&dev->dev.kobj,
					&trace_timestamp_attr.attr);
		if (ret)
			dev_dbg(&dev->dev,
				"Failed to create trace_timestamp in sysfs\n");
	}

	ret = sysfs_create_file(&dev->dev.kobj, &trace_range_attr.attr);
	if (ret)
		dev_dbg(&dev->dev, "Failed to create trace_range in sysfs\n");

	if (etm_version < ETMIDR_VERSION_PFT_1_0) {
		ret = sysfs_create_file(&dev->dev.kobj,
					&trace_data_range_attr.attr);
		if (ret)
			dev_dbg(&dev->dev,
				"Failed to create trace_data_range in sysfs\n");
	} else {
		tracer.flags &= ~TRACER_TRACE_DATA;
	}

	dev_dbg(&dev->dev, "ETM AMBA driver initialized.\n");

	/* Enable formatter if there are multiple trace sources */
	if (new_count > 1)
		t->etb_fc = ETBFF_ENFCONT | ETBFF_ENFTC;

	t->etm_regs_count = new_count;

out:
	mutex_unlock(&t->mutex);
	return ret;

out_unmap:
	iounmap(t->etm_regs[t->etm_regs_count]);

out_release:
	amba_release_regions(dev);

	mutex_unlock(&t->mutex);
	return ret;
}

static int etm_remove(struct amba_device *dev)
{
	int i;
	struct tracectx *t = &tracer;
	void __iomem	*etm_regs = amba_get_drvdata(dev);

	sysfs_remove_file(&dev->dev.kobj, &trace_running_attr.attr);
	sysfs_remove_file(&dev->dev.kobj, &trace_info_attr.attr);
	sysfs_remove_file(&dev->dev.kobj, &trace_mode_attr.attr);
	sysfs_remove_file(&dev->dev.kobj, &trace_range_attr.attr);
	sysfs_remove_file(&dev->dev.kobj, &trace_data_range_attr.attr);

	mutex_lock(&t->mutex);
	for (i = 0; i < t->etm_regs_count; i++)
		if (t->etm_regs[i] == etm_regs)
			break;
	for (; i < t->etm_regs_count - 1; i++)
		t->etm_regs[i] = t->etm_regs[i + 1];
	t->etm_regs_count--;
	if (!t->etm_regs_count) {
		kfree(t->etm_regs);
		t->etm_regs = NULL;
	}
	mutex_unlock(&t->mutex);

	iounmap(etm_regs);
	amba_release_regions(dev);

	return 0;
}

static struct amba_id etm_ids[] = {
	{
		.id	= 0x0003b921,
		.mask	= 0x0007ffff,
	},
	{
		.id	= 0x0003b950,
		.mask	= 0x0007ffff,
	},
	{ 0, 0 },
};

static struct amba_driver etm_driver = {
	.drv		= {
		.name   = "etm",
		.owner  = THIS_MODULE,
	},
	.probe		= etm_probe,
	.remove		= etm_remove,
	.id_table	= etm_ids,
};

static int __init etm_init(void)
{
	int retval;

	mutex_init(&tracer.mutex);

	retval = amba_driver_register(&etb_driver);
	if (retval) {
		printk(KERN_ERR "Failed to register etb\n");
		return retval;
	}

	retval = amba_driver_register(&etm_driver);
	if (retval) {
		amba_driver_unregister(&etb_driver);
		printk(KERN_ERR "Failed to probe etm\n");
		return retval;
	}

	/* not being able to install this handler is not fatal */
	(void)register_sysrq_key('v', &sysrq_etm_op);

	return 0;
}

device_initcall(etm_init);


Own the Maui Dream with this quiet luxury two-bedroom condo. It has been recently refreshed with new living room furniture, paint and carpet. From the private lanai enjoy gazing over the beautifully manicured gardens toward the inviting resort and ocean views of the neighboring island of Molokai. Everything you could wish for is here at Honua Kai with its three resort pools, spas, water slide and BBQ areas. You can play in the waves at the world famous Kaanapali Beach, snorkel with a wide variety of tropical fish and seal turtles, or you can just soak up the beach serenity and people watch. Complete your day on property at the popular Dukes restaurant where you can watch the fabulous sunset and sample delicious local food served with much Aloha.


All in a figure flattering bandage fabric this Casual Dress Muslimah is our current fave this season. Mermaid skirt is adorned with sparkling stones at its waist, while its satin material will show off your figure. Casual Dress Muslimah – great for inbetween seasons. A hidden side zipper closure on the dress gives showcases its flawless look. This Casual Dress Muslimah is adorable, lightweight, and perfect for summertime wear.
Video about Casual Dress Muslimah!