text:
What adults need to know, and how they can help after shootings like Oxford High School
Phoebe Wall Howard
It is essential, after a school shooting, that parents and other adults control their emotions around their children to restore a feeling of calm and safety and limit anxiety, according to medical experts interviewed by the Free Press.
"In general, children, especially younger ones, do not have a good ability of threat detection or appraising the level of the danger. The most important thing is to control our own fear or negative emotions around kids — all kids," said Dr. Arash Javanbakht, a psychiatrist and director of the Stress, Trauma and Anxiety Research clinic at Wayne State University. "Parents must show they're in control. For parents to create an atmosphere of safety is very important."
Watching the news, which may include graphic video, should be avoided at home when children are in the vicinity as it can fuel anxiety, he and other psychiatrists said. Repeated exposure, especially for younger children, might lead to them believing the events are recurring.
"Do not deny kids' fears or thoughts or questions. Be open to the kids. Listen to them, see what are their concerns and address those concerns. Remind them they are safe at home, and that there are many adults including parents, teachers and police, working every day to keep them safe," said Javanbakht, an expert on psychiatry surrounding shootings.
Basic facts can calm fears and alleviate a sense of chaos, and create a sense of control, medical experts said.
Children of all ages may respond to trauma in different ways. They may feel anxious when separating from caregivers, find it hard to concentrate, have nightmares or not want to sleep alone. These are issues that may need professional attention.
Everything we know:Oxford High School shooting leaves 3 dead, multiple injured
More:4 dead, multiple injured in Oxford High School shooting; suspect is 15-year-old student
'No right or wrong way'
Dr. Zakia Alavi, an associate professor in the Department of Pediatrics and Human Development at Michigan State University who is board certified in child and adolescent psychiatry, said she had been talking with parents all afternoon Tuesday about how to handle the Oxford High School shooting situation as events unfolded.
"The first thing to know is, there is no right or wrong way to address this. Any talk is better than no talk in terms of allowing children to express themselves and their concerns," Alavi said.
She suggested organizing advice into three major categories:
Providing reassurance regarding safety.
Regulating parents' expression of angst or fear.
Being proactive — things you can do rather than just worry.
Preteens and younger children generally see events as related to them, because of them or for them, Alavi said. Teenagers generally want to know how events will affect them and what could have been done differently.
Parents must be aware of their own anxiety and regulate that emotion in front of children because it goes a long way toward a feeling that everything will be OK, Alavi said.
"We want kids to feel the adults in their lives can keep them safe. There is nothing more terrifying for kids than thinking that their family is not in control," she said. "Also, limit the consumption of social media and TV. Repeated coverage can be re-traumatizing."
Special Subscription Offers
Perhaps key to moving forward may be family discussion about becoming active in creating student or parent or community support groups. Channeling energy can be productive for young adults and restore faith in control and safety, psychiatrists said.
"You want to empower children to be agents of change," Alavi said. "It sounds like a tall order. It's not asking them to run for political office. It's saying, 'You're not powerless. You do have power.' It goes a long way toward mitigating a sense of hopelessness and helplessness when there's a tragedy like this."
More:Police school liaison officer: 'It's the most important position in department'
After traumatic events, parents may notice changes in the behavior of students at home.
"They may feel a wide range of feelings and that's normal. They may find themselves struggling now and in the days to come with intense feelings — fear, depression, anxiety, anger," said Dr. Peter Langman, a psychologist based in Allentown, Pennsylvania, and author of "Warning Signs: Identifying School Shooters Before they Strike."
"An incident like this has a big impact on us as people," he said. "For some, they may seem more agitated, irritated, may act out more. They may show more of a temper or have trouble sleeping. Kids may be more quiet or withdrawn. You may see crying or an unwillingness to even go back to school or participate in normal activities. Or they may seek more support."
Symptoms of anxiety may present as loss of appetite or increased appetite, in addition to sleep disruption.
Children should be encouraged to talk with anyone who provides a feeling of safety, whether it's adults at home, teachers, coaches, counselors — connection is essential.
"You cannot always see the attack coming, especially when you talk about juvenile school shooters," said Langman, who is also a researcher with the National Threat Assessment Center of the U.S. Secret Service.
"What's so heartbreaking in studying these cases over the years is how many people knew something and didn't take action," he said. "It's so important that people know there are typically warning signs and if they're reported, authorities can intervene effectively. You can prevent these incidents. I encourage students, faculty, parents and anyone who comes across a warning sign to take action and report it to the school."
Early news reports confirmed that some students who attended Oxford High School did, in fact, stay home on Tuesday because they felt uneasy. Parents interviewed by the news media confirmed concerns about rumors involving potential violence.
'Little kids concerned'
Stephanie Hartwell, dean of the College of Liberal Arts and Sciences at Wayne State, is a medical sociologist who has researched gun violence. On Tuesday, her daughter texted news of the shooting to her.
"My kids were 8 and 5 when the Sandy Hook school shooting happened. And that was first graders. I was completely traumatized. It changes your perception of how safe the world is. So you start to question everything," Hartwell said.
Contact Phoebe Wall Howard at313-618-1034 orphoward@freepress.com.Follow her on Twitter@phoebesaid.


Recognition of the importance of teaching alongside research as the mission of a medical, dental or veterinary school is on today's agenda. ASPIRE is a programme that recognises international excellence in education in a medical, dental or veterinary school.
Over the past decade, the move to recognise excellence in universities has been reflected in increasing attention being paid to university league tables. Rankings, however, have concentrated on research and have paid lip service to education. This bias in the information base of existing excellence rankings towards research outcomes could detract from efforts to improve educational performance (1).
While excellence in teaching has not featured prominently in world ranking tables, the concept of teaching excellence has attracted attention from academics, governments and the public, and is now part of the everyday language and practice of higher education.
There is currently no mechanism at a global level for a professional peer review of excellence in teaching. There is a need for a form of quality assurance that goes beyond accreditation, which recognises excellence that rightly falls outside the formal accreditation process and is the remit of professional educational bodies. The ASPIRE Programme has been established to go beyond the traditional accreditation process and to recognise that the education programme in a medical, dental or veterinary school can be subjected to peer review against a set of criteria that identifies world-class excellence in education.
ASPIRE was developed by a group of leading international authorities in medical education and educational bodies with a commitment to excellence, led by AMEE in collaboration with the University of Queensland, Australia. ASPIRE offers a means whereby world-class excellence in education in medical, dental and veterinary schools can be recognised against an agreed set of standards or benchmarks.
The approach is based upon a 'differential effectiveness' that recognises that the characteristics of excellence will vary according to local contexts.
The ASPIRE initiative encourages and promotes outstanding performance and excellence in education. An ASPIRE award allows schools to be recognised internationally for their excellence in education. ASPIRE recognition provides the entrepreneurial university with an enhanced capability for monitoring, demonstrating and promoting its exceptional excellence in teaching and learning.
Benchmark your school against what is considered as best practice in an aspect of education.
Demonstrate to the students, staff and other stakeholders that the quest for excellence in education is part of the school's vision and mission.
Have your school recognised nationally and internationally for its education programme.
Become a member of a network of schools recognised for excellence in education.
Read here how one school discovered the benefits of applying for an ASPIRE award.
The ASPIRE initiative was launched at AMEE 2012 and following a pilot process was successfully implemented in 2013. The closing date for 2018 submissions is 28th February 2019. The awards are presented at the AMEE annual conference in August/September, reported in the press and promoted on the ASPIRE, AMEE and MedEdWorld websites.


text:
/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.prestosql.sql.planner;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import io.prestosql.Session;
import io.prestosql.connector.CatalogName;
import io.prestosql.cost.CachingCostProvider;
import io.prestosql.cost.CachingStatsProvider;
import io.prestosql.cost.CostCalculator;
import io.prestosql.cost.CostProvider;
import io.prestosql.cost.StatsAndCosts;
import io.prestosql.cost.StatsCalculator;
import io.prestosql.cost.StatsProvider;
import io.prestosql.execution.warnings.WarningCollector;
import io.prestosql.metadata.Metadata;
import io.prestosql.metadata.NewTableLayout;
import io.prestosql.metadata.QualifiedObjectName;
import io.prestosql.metadata.TableHandle;
import io.prestosql.metadata.TableMetadata;
import io.prestosql.spi.PrestoException;
import io.prestosql.spi.connector.ColumnHandle;
import io.prestosql.spi.connector.ColumnMetadata;
import io.prestosql.spi.connector.ConnectorTableMetadata;
import io.prestosql.spi.statistics.TableStatisticsMetadata;
import io.prestosql.spi.type.Type;
import io.prestosql.sql.analyzer.Analysis;
import io.prestosql.sql.analyzer.Field;
import io.prestosql.sql.analyzer.RelationId;
import io.prestosql.sql.analyzer.RelationType;
import io.prestosql.sql.analyzer.Scope;
import io.prestosql.sql.planner.StatisticsAggregationPlanner.TableStatisticAggregation;
import io.prestosql.sql.planner.optimizations.PlanOptimizer;
import io.prestosql.sql.planner.plan.AggregationNode;
import io.prestosql.sql.planner.plan.Assignments;
import io.prestosql.sql.planner.plan.DeleteNode;
import io.prestosql.sql.planner.plan.ExplainAnalyzeNode;
import io.prestosql.sql.planner.plan.LimitNode;
import io.prestosql.sql.planner.plan.OutputNode;
import io.prestosql.sql.planner.plan.PlanNode;
import io.prestosql.sql.planner.plan.ProjectNode;
import io.prestosql.sql.planner.plan.StatisticAggregations;
import io.prestosql.sql.planner.plan.StatisticsWriterNode;
import io.prestosql.sql.planner.plan.TableFinishNode;
import io.prestosql.sql.planner.plan.TableScanNode;
import io.prestosql.sql.planner.plan.TableWriterNode;
import io.prestosql.sql.planner.plan.ValuesNode;
import io.prestosql.sql.planner.sanity.PlanSanityChecker;
import io.prestosql.sql.tree.Analyze;
import io.prestosql.sql.tree.Cast;
import io.prestosql.sql.tree.CreateTableAsSelect;
import io.prestosql.sql.tree.Delete;
import io.prestosql.sql.tree.Explain;
import io.prestosql.sql.tree.Expression;
import io.prestosql.sql.tree.Identifier;
import io.prestosql.sql.tree.Insert;
import io.prestosql.sql.tree.LambdaArgumentDeclaration;
import io.prestosql.sql.tree.LongLiteral;
import io.prestosql.sql.tree.NodeRef;
import io.prestosql.sql.tree.NullLiteral;
import io.prestosql.sql.tree.Query;
import io.prestosql.sql.tree.Statement;
import io.prestosql.type.TypeCoercion;

import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;

import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Verify.verify;
import static com.google.common.collect.ImmutableList.toImmutableList;
import static com.google.common.collect.ImmutableMap.toImmutableMap;
import static com.google.common.collect.Streams.zip;
import static io.prestosql.spi.StandardErrorCode.NOT_FOUND;
import static io.prestosql.spi.StandardErrorCode.NOT_SUPPORTED;
import static io.prestosql.spi.statistics.TableStatisticType.ROW_COUNT;
import static io.prestosql.spi.type.BigintType.BIGINT;
import static io.prestosql.spi.type.VarbinaryType.VARBINARY;
import static io.prestosql.sql.planner.plan.AggregationNode.singleGroupingSet;
import static io.prestosql.sql.planner.plan.TableWriterNode.CreateReference;
import static io.prestosql.sql.planner.plan.TableWriterNode.InsertReference;
import static io.prestosql.sql.planner.plan.TableWriterNode.WriterTarget;
import static io.prestosql.sql.planner.sanity.PlanSanityChecker.DISTRIBUTED_PLAN_SANITY_CHECKER;
import static java.lang.String.format;
import static java.util.Objects.requireNonNull;

public class LogicalPlanner
{
    public enum Stage
    {
        CREATED, OPTIMIZED, OPTIMIZED_AND_VALIDATED
    }

    private final PlanNodeIdAllocator idAllocator;

    private final Session session;
    private final List<PlanOptimizer> planOptimizers;
    private final PlanSanityChecker planSanityChecker;
    private final SymbolAllocator symbolAllocator = new SymbolAllocator();
    private final Metadata metadata;
    private final TypeCoercion typeCoercion;
    private final TypeAnalyzer typeAnalyzer;
    private final StatisticsAggregationPlanner statisticsAggregationPlanner;
    private final StatsCalculator statsCalculator;
    private final CostCalculator costCalculator;
    private final WarningCollector warningCollector;

    public LogicalPlanner(Session session,
            List<PlanOptimizer> planOptimizers,
            PlanNodeIdAllocator idAllocator,
            Metadata metadata,
            TypeAnalyzer typeAnalyzer,
            StatsCalculator statsCalculator,
            CostCalculator costCalculator,
            WarningCollector warningCollector)
    {
        this(session, planOptimizers, DISTRIBUTED_PLAN_SANITY_CHECKER, idAllocator, metadata, typeAnalyzer, statsCalculator, costCalculator, warningCollector);
    }

    public LogicalPlanner(Session session,
            List<PlanOptimizer> planOptimizers,
            PlanSanityChecker planSanityChecker,
            PlanNodeIdAllocator idAllocator,
            Metadata metadata,
            TypeAnalyzer typeAnalyzer,
            StatsCalculator statsCalculator,
            CostCalculator costCalculator,
            WarningCollector warningCollector)
    {
        this.session = requireNonNull(session, "session is null");
        this.planOptimizers = requireNonNull(planOptimizers, "planOptimizers is null");
        this.planSanityChecker = requireNonNull(planSanityChecker, "planSanityChecker is null");
        this.idAllocator = requireNonNull(idAllocator, "idAllocator is null");
        this.metadata = requireNonNull(metadata, "metadata is null");
        this.typeCoercion = new TypeCoercion(metadata::getType);
        this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null");
        this.statisticsAggregationPlanner = new StatisticsAggregationPlanner(symbolAllocator, metadata);
        this.statsCalculator = requireNonNull(statsCalculator, "statsCalculator is null");
        this.costCalculator = requireNonNull(costCalculator, "costCalculator is null");
        this.warningCollector = requireNonNull(warningCollector, "warningCollector is null");
    }

    public Plan plan(Analysis analysis)
    {
        return plan(analysis, Stage.OPTIMIZED_AND_VALIDATED);
    }

    public Plan plan(Analysis analysis, Stage stage)
    {
        PlanNode root = planStatement(analysis, analysis.getStatement());

        planSanityChecker.validateIntermediatePlan(root, session, metadata, typeAnalyzer, symbolAllocator.getTypes(), warningCollector);

        if (stage.ordinal() >= Stage.OPTIMIZED.ordinal()) {
            for (PlanOptimizer optimizer : planOptimizers) {
                root = optimizer.optimize(root, session, symbolAllocator.getTypes(), symbolAllocator, idAllocator, warningCollector);
                requireNonNull(root, format("%s returned a null plan", optimizer.getClass().getName()));
            }
        }

        if (stage.ordinal() >= Stage.OPTIMIZED_AND_VALIDATED.ordinal()) {
            // make sure we produce a valid plan after optimizations run. This is mainly to catch programming errors
            planSanityChecker.validateFinalPlan(root, session, metadata, typeAnalyzer, symbolAllocator.getTypes(), warningCollector);
        }

        TypeProvider types = symbolAllocator.getTypes();
        StatsProvider statsProvider = new CachingStatsProvider(statsCalculator, session, types);
        CostProvider costProvider = new CachingCostProvider(costCalculator, statsProvider, Optional.empty(), session, types);
        return new Plan(root, types, StatsAndCosts.create(root, statsProvider, costProvider));
    }

    public PlanNode planStatement(Analysis analysis, Statement statement)
    {
        if (statement instanceof CreateTableAsSelect && analysis.isCreateTableAsSelectNoOp()) {
            checkState(analysis.getCreateTableDestination().isPresent(), "Table destination is missing");
            Symbol symbol = symbolAllocator.newSymbol("rows", BIGINT);
            PlanNode source = new ValuesNode(idAllocator.getNextId(), ImmutableList.of(symbol), ImmutableList.of(ImmutableList.of(new LongLiteral("0"))));
            return new OutputNode(idAllocator.getNextId(), source, ImmutableList.of("rows"), ImmutableList.of(symbol));
        }
        return createOutputPlan(planStatementWithoutOutput(analysis, statement), analysis);
    }

    private RelationPlan planStatementWithoutOutput(Analysis analysis, Statement statement)
    {
        if (statement instanceof CreateTableAsSelect) {
            if (analysis.isCreateTableAsSelectNoOp()) {
                throw new PrestoException(NOT_SUPPORTED, "CREATE TABLE IF NOT EXISTS is not supported in this context " + statement.getClass().getSimpleName());
            }
            return createTableCreationPlan(analysis, ((CreateTableAsSelect) statement).getQuery());
        }
        else if (statement instanceof Analyze) {
            return createAnalyzePlan(analysis, (Analyze) statement);
        }
        else if (statement instanceof Insert) {
            checkState(analysis.getInsert().isPresent(), "Insert handle is missing");
            return createInsertPlan(analysis, (Insert) statement);
        }
        else if (statement instanceof Delete) {
            return createDeletePlan(analysis, (Delete) statement);
        }
        else if (statement instanceof Query) {
            return createRelationPlan(analysis, (Query) statement);
        }
        else if (statement instanceof Explain && ((Explain) statement).isAnalyze()) {
            return createExplainAnalyzePlan(analysis, (Explain) statement);
        }
        else {
            throw new PrestoException(NOT_SUPPORTED, "Unsupported statement type " + statement.getClass().getSimpleName());
        }
    }

    private RelationPlan createExplainAnalyzePlan(Analysis analysis, Explain statement)
    {
        RelationPlan underlyingPlan = planStatementWithoutOutput(analysis, statement.getStatement());
        PlanNode root = underlyingPlan.getRoot();
        Scope scope = analysis.getScope(statement);
        Symbol outputSymbol = symbolAllocator.newSymbol(scope.getRelationType().getFieldByIndex(0));
        root = new ExplainAnalyzeNode(idAllocator.getNextId(), root, outputSymbol, statement.isVerbose());
        return new RelationPlan(root, scope, ImmutableList.of(outputSymbol));
    }

    private RelationPlan createAnalyzePlan(Analysis analysis, Analyze analyzeStatement)
    {
        TableHandle targetTable = analysis.getAnalyzeTarget().get();

        // Plan table scan
        Map<String, ColumnHandle> columnHandles = metadata.getColumnHandles(session, targetTable);
        ImmutableList.Builder<Symbol> tableScanOutputs = ImmutableList.builder();
        ImmutableMap.Builder<Symbol, ColumnHandle> symbolToColumnHandle = ImmutableMap.builder();
        ImmutableMap.Builder<String, Symbol> columnNameToSymbol = ImmutableMap.builder();
        TableMetadata tableMetadata = metadata.getTableMetadata(session, targetTable);
        for (ColumnMetadata column : tableMetadata.getColumns()) {
            Symbol symbol = symbolAllocator.newSymbol(column.getName(), column.getType());
            tableScanOutputs.add(symbol);
            symbolToColumnHandle.put(symbol, columnHandles.get(column.getName()));
            columnNameToSymbol.put(column.getName(), symbol);
        }

        TableStatisticsMetadata tableStatisticsMetadata = metadata.getStatisticsCollectionMetadata(
                session,
                targetTable.getCatalogName().getCatalogName(),
                tableMetadata.getMetadata());

        TableStatisticAggregation tableStatisticAggregation = statisticsAggregationPlanner.createStatisticsAggregation(tableStatisticsMetadata, columnNameToSymbol.build());
        StatisticAggregations statisticAggregations = tableStatisticAggregation.getAggregations();
        List<Symbol> groupingSymbols = statisticAggregations.getGroupingSymbols();

        PlanNode planNode = new StatisticsWriterNode(
                idAllocator.getNextId(),
                new AggregationNode(
                        idAllocator.getNextId(),
                        TableScanNode.newInstance(idAllocator.getNextId(), targetTable, tableScanOutputs.build(), symbolToColumnHandle.build()),
                        statisticAggregations.getAggregations(),
                        singleGroupingSet(groupingSymbols),
                        ImmutableList.of(),
                        AggregationNode.Step.SINGLE,
                        Optional.empty(),
                        Optional.empty()),
                new StatisticsWriterNode.WriteStatisticsReference(targetTable),
                symbolAllocator.newSymbol("rows", BIGINT),
                tableStatisticsMetadata.getTableStatistics().contains(ROW_COUNT),
                tableStatisticAggregation.getDescriptor());
        return new RelationPlan(planNode, analysis.getScope(analyzeStatement), planNode.getOutputSymbols());
    }

    private RelationPlan createTableCreationPlan(Analysis analysis, Query query)
    {
        QualifiedObjectName destination = analysis.getCreateTableDestination().get();

        RelationPlan plan = createRelationPlan(analysis, query);

        ConnectorTableMetadata tableMetadata = createTableMetadata(
                destination,
                getOutputTableColumns(plan, analysis.getColumnAliases()),
                analysis.getCreateTableProperties(),
                analysis.getParameters(),
                analysis.getCreateTableComment());
        Optional<NewTableLayout> newTableLayout = metadata.getNewTableLayout(session, destination.getCatalogName(), tableMetadata);

        List<String> columnNames = tableMetadata.getColumns().stream()
                .filter(column -> !column.isHidden())
                .map(ColumnMetadata::getName)
                .collect(toImmutableList());

        TableStatisticsMetadata statisticsMetadata = metadata.getStatisticsCollectionMetadataForWrite(session, destination.getCatalogName(), tableMetadata);

        return createTableWriterPlan(
                analysis,
                plan,
                new CreateReference(destination.getCatalogName(), tableMetadata, newTableLayout),
                columnNames,
                newTableLayout,
                statisticsMetadata);
    }

    private RelationPlan createInsertPlan(Analysis analysis, Insert insertStatement)
    {
        Analysis.Insert insert = analysis.getInsert().get();

        TableMetadata tableMetadata = metadata.getTableMetadata(session, insert.getTarget());

        List<ColumnMetadata> visibleTableColumns = tableMetadata.getColumns().stream()
                .filter(column -> !column.isHidden())
                .collect(toImmutableList());
        List<String> visibleTableColumnNames = visibleTableColumns.stream()
                .map(ColumnMetadata::getName)
                .collect(toImmutableList());

        RelationPlan plan = createRelationPlan(analysis, insertStatement.getQuery());

        Map<String, ColumnHandle> columns = metadata.getColumnHandles(session, insert.getTarget());
        Assignments.Builder assignments = Assignments.builder();
        for (ColumnMetadata column : tableMetadata.getColumns()) {
            if (column.isHidden()) {
                continue;
            }
            Symbol output = symbolAllocator.newSymbol(column.getName(), column.getType());
            int index = insert.getColumns().indexOf(columns.get(column.getName()));
            if (index < 0) {
                Expression cast = new Cast(new NullLiteral(), column.getType().getTypeSignature().toString());
                assignments.put(output, cast);
            }
            else {
                Symbol input = plan.getSymbol(index);
                Type tableType = column.getType();
                Type queryType = symbolAllocator.getTypes().get(input);

                if (queryType.equals(tableType) || typeCoercion.isTypeOnlyCoercion(queryType, tableType)) {
                    assignments.put(output, input.toSymbolReference());
                }
                else {
                    Expression cast = new Cast(input.toSymbolReference(), tableType.getTypeSignature().toString());
                    assignments.put(output, cast);
                }
            }
        }
        ProjectNode projectNode = new ProjectNode(idAllocator.getNextId(), plan.getRoot(), assignments.build());

        List<Field> fields = visibleTableColumns.stream()
                .map(column -> Field.newUnqualified(column.getName(), column.getType()))
                .collect(toImmutableList());
        Scope scope = Scope.builder().withRelationType(RelationId.anonymous(), new RelationType(fields)).build();

        plan = new RelationPlan(projectNode, scope, projectNode.getOutputSymbols());

        Optional<NewTableLayout> newTableLayout = metadata.getInsertLayout(session, insert.getTarget());
        String catalogName = insert.getTarget().getCatalogName().getCatalogName();
        TableStatisticsMetadata statisticsMetadata = metadata.getStatisticsCollectionMetadataForWrite(session, catalogName, tableMetadata.getMetadata());

        return createTableWriterPlan(
                analysis,
                plan,
                new InsertReference(insert.getTarget()),
                visibleTableColumnNames,
                newTableLayout,
                statisticsMetadata);
    }

    private RelationPlan createTableWriterPlan(
            Analysis analysis,
            RelationPlan plan,
            WriterTarget target,
            List<String> columnNames,
            Optional<NewTableLayout> writeTableLayout,
            TableStatisticsMetadata statisticsMetadata)
    {
        PlanNode source = plan.getRoot();

        if (!analysis.isCreateTableAsSelectWithData()) {
            source = new LimitNode(idAllocator.getNextId(), source, 0L, false);
        }

        // todo this should be checked in analysis
        writeTableLayout.ifPresent(layout -> {
            if (!ImmutableSet.copyOf(columnNames).containsAll(layout.getPartitionColumns())) {
                throw new PrestoException(NOT_SUPPORTED, "INSERT must write all distribution columns: " + layout.getPartitionColumns());
            }
        });

        List<Symbol> symbols = plan.getFieldMappings();

        Optional<PartitioningScheme> partitioningScheme = Optional.empty();
        if (writeTableLayout.isPresent()) {
            List<Symbol> partitionFunctionArguments = new ArrayList<>();
            writeTableLayout.get().getPartitionColumns().stream()
                    .mapToInt(columnNames::indexOf)
                    .mapToObj(symbols::get)
                    .forEach(partitionFunctionArguments::add);

            List<Symbol> outputLayout = new ArrayList<>(symbols);

            partitioningScheme = Optional.of(new PartitioningScheme(
                    Partitioning.create(writeTableLayout.get().getPartitioning(), partitionFunctionArguments),
                    outputLayout));
        }

        if (!statisticsMetadata.isEmpty()) {
            verify(columnNames.size() == symbols.size(), "columnNames.size() != symbols.size(): %s and %s", columnNames, symbols);
            Map<String, Symbol> columnToSymbolMap = zip(columnNames.stream(), symbols.stream(), SimpleImmutableEntry::new)
                    .collect(toImmutableMap(Entry::getKey, Entry::getValue));

            TableStatisticAggregation result = statisticsAggregationPlanner.createStatisticsAggregation(statisticsMetadata, columnToSymbolMap);

            StatisticAggregations.Parts aggregations = result.getAggregations().createPartialAggregations(symbolAllocator, metadata);

            // partial aggregation is run within the TableWriteOperator to calculate the statistics for
            // the data consumed by the TableWriteOperator
            // final aggregation is run within the TableFinishOperator to summarize collected statistics
            // by the partial aggregation from all of the writer nodes
            StatisticAggregations partialAggregation = aggregations.getPartialAggregation();

            PlanNode writerNode = new TableWriterNode(
                    idAllocator.getNextId(),
                    source,
                    target,
                    symbolAllocator.newSymbol("partialrows", BIGINT),
                    symbolAllocator.newSymbol("fragment", VARBINARY),
                    symbols,
                    columnNames,
                    partitioningScheme,
                    Optional.of(partialAggregation),
                    Optional.of(result.getDescriptor().map(aggregations.getMappings()::get)));

            TableFinishNode commitNode = new TableFinishNode(
                    idAllocator.getNextId(),
                    writerNode,
                    target,
                    symbolAllocator.newSymbol("rows", BIGINT),
                    Optional.of(aggregations.getFinalAggregation()),
                    Optional.of(result.getDescriptor()));

            return new RelationPlan(commitNode, analysis.getRootScope(), commitNode.getOutputSymbols());
        }

        TableFinishNode commitNode = new TableFinishNode(
                idAllocator.getNextId(),
                new TableWriterNode(
                        idAllocator.getNextId(),
                        source,
                        target,
                        symbolAllocator.newSymbol("partialrows", BIGINT),
                        symbolAllocator.newSymbol("fragment", VARBINARY),
                        symbols,
                        columnNames,
                        partitioningScheme,
                        Optional.empty(),
                        Optional.empty()),
                target,
                symbolAllocator.newSymbol("rows", BIGINT),
                Optional.empty(),
                Optional.empty());
        return new RelationPlan(commitNode, analysis.getRootScope(), commitNode.getOutputSymbols());
    }

    private RelationPlan createDeletePlan(Analysis analysis, Delete node)
    {
        DeleteNode deleteNode = new QueryPlanner(analysis, symbolAllocator, idAllocator, buildLambdaDeclarationToSymbolMap(analysis, symbolAllocator), metadata, session)
                .plan(node);

        TableFinishNode commitNode = new TableFinishNode(
                idAllocator.getNextId(),
                deleteNode,
                deleteNode.getTarget(),
                symbolAllocator.newSymbol("rows", BIGINT),
                Optional.empty(),
                Optional.empty());

        return new RelationPlan(commitNode, analysis.getScope(node), commitNode.getOutputSymbols());
    }

    private PlanNode createOutputPlan(RelationPlan plan, Analysis analysis)
    {
        ImmutableList.Builder<Symbol> outputs = ImmutableList.builder();
        ImmutableList.Builder<String> names = ImmutableList.builder();

        int columnNumber = 0;
        RelationType outputDescriptor = analysis.getOutputDescriptor();
        for (Field field : outputDescriptor.getVisibleFields()) {
            String name = field.getName().orElse("_col" + columnNumber);
            names.add(name);

            int fieldIndex = outputDescriptor.indexOf(field);
            Symbol symbol = plan.getSymbol(fieldIndex);
            outputs.add(symbol);

            columnNumber++;
        }

        return new OutputNode(idAllocator.getNextId(), plan.getRoot(), names.build(), outputs.build());
    }

    private RelationPlan createRelationPlan(Analysis analysis, Query query)
    {
        return new RelationPlanner(analysis, symbolAllocator, idAllocator, buildLambdaDeclarationToSymbolMap(analysis, symbolAllocator), metadata, session)
                .process(query, null);
    }

    private ConnectorTableMetadata createTableMetadata(QualifiedObjectName table, List<ColumnMetadata> columns, Map<String, Expression> propertyExpressions, List<Expression> parameters, Optional<String> comment)
    {
        CatalogName catalogName = metadata.getCatalogHandle(session, table.getCatalogName())
                .orElseThrow(() -> new PrestoException(NOT_FOUND, "Catalog does not exist: " + table.getCatalogName()));

        Map<String, Object> properties = metadata.getTablePropertyManager().getProperties(
                catalogName,
                table.getCatalogName(),
                propertyExpressions,
                session,
                metadata,
                parameters);

        return new ConnectorTableMetadata(table.asSchemaTableName(), columns, properties, comment);
    }

    private static List<ColumnMetadata> getOutputTableColumns(RelationPlan plan, Optional<List<Identifier>> columnAliases)
    {
        ImmutableList.Builder<ColumnMetadata> columns = ImmutableList.builder();
        int aliasPosition = 0;
        for (Field field : plan.getDescriptor().getVisibleFields()) {
            String columnName = columnAliases.isPresent() ? columnAliases.get().get(aliasPosition).getValue() : field.getName().get();
            columns.add(new ColumnMetadata(columnName, field.getType()));
            aliasPosition++;
        }
        return columns.build();
    }

    private static Map<NodeRef<LambdaArgumentDeclaration>, Symbol> buildLambdaDeclarationToSymbolMap(Analysis analysis, SymbolAllocator symbolAllocator)
    {
        Map<NodeRef<LambdaArgumentDeclaration>, Symbol> resultMap = new LinkedHashMap<>();
        for (Entry<NodeRef<Expression>, Type> entry : analysis.getTypes().entrySet()) {
            if (!(entry.getKey().getNode() instanceof LambdaArgumentDeclaration)) {
                continue;
            }
            NodeRef<LambdaArgumentDeclaration> lambdaArgumentDeclaration = NodeRef.of((LambdaArgumentDeclaration) entry.getKey().getNode());
            if (resultMap.containsKey(lambdaArgumentDeclaration)) {
                continue;
            }
            resultMap.put(lambdaArgumentDeclaration, symbolAllocator.newSymbol(lambdaArgumentDeclaration.getNode(), entry.getValue()));
        }
        return resultMap;
    }
}

redpajama_set_name: RedPajamaGithub


text:
Medicine: Biographies
Lorenz Heister
Heister, Lorenz
(b. Frankfurt am Main, Germany, 19 September 1683; d. Bornum, near Königslutter, Germany, 18 April 1758)
anatomy, surgery, medicine.
Heister was the son of a lumber merchant who later became an innkeeper and wine merchant. His mother, Maria Alleins, was the daughter of a merchant. He was educated at the Frankfurt Gymnasium and received additional private lessons in French and Italian. In 1702–1703 he studied at the University of Giessen and in 1703–1706 at the University of Wetzlar. When he left Wetzlar, Heister had completed the study of all subjects needed for the practice of medicine. Thereafter he went to Amsterdam, where he attended the botanical lectures of Caspar Commelin and the anatomical demonstrations of Frederik Ruysch. Amsterdam was at the time the world center for the study of exotic plants and one of the few places where anatomy could be studied by practical dissection.
In June 1707, during the War of the Spanish Succession, Heister worked in the field hospitals at Brussels and Ghent. After his return to Holland, he studied in Leiden for a short time, attending Hermann Boerhaave's lectures on chemistry and on the diseases of the eye and Goverd Bidloo's anatomical lessons. He obtained his M.D. at the University of Harderwijk in May 1708. After his return to Amsterdam, Heister gave lessons in anatomy with demonstrations on cadavers. Ruysch, the official professor of anatomy, limited himself to an hour's discussion of his anatomical preparations daily. Heister's first class consisted of ten French surgeons' apprentices, his second of German students; he lectured to each group in its own language.
In July 1709 Heister rejoined the Dutch army, this time as a field surgeon during the siege of Tournai. Later he tended those wounded in the battles of Oudenarde and Malplaquet. On 11 November 1711 he was appointed professor of anatomy and surgery at the University of Altdorf, near Nuremberg. In 1720 Heister was appointed professor of anatomy and surgery at Helmstedt. Here his teaching duties changed several times: in 1730 he was charged with the teaching of theoretical medicine and botany and in 1740 with the teaching of practical medicine and botany. He remained in Helmstedt for the rest of his life.
Heister made many minor anatomical discoveries and corrected some faulty observations of his predecessors. While a field surgeon, he discovered the true cause of cataracts: an opacity of the crystalline lens, instead of a film over the cornea, as had been believed. His main significance, though, is as a teacher and author. In Altdorf and in Helmstedt he trained a large number of surgeons and physicians. His books on anatomy, surgery, and medicine dominated the field for several generations, serving to educate thousands of surgeons and physicians throughout western Europe. Heister's main work, the Chirurgie, which was originally written in German, was translated into seven languages, including Latin and Japanese. Although not the first European book on surgery to be translated into Japanese, it was certainly the most successful, introducing Western methods to many Japanese surgeons.
I. Original Works. Many students earned their doctorates under Heister's guidance. Since it was then the custom for the professor, not the candidate, to write the dissertation, these dissertations (there are at least seventyfive) should be counted among Heister's work. In addition, he contributed many papers to the Ephemerides Caesareo-Leopoldinae naturae curiosorum and its successor, Acta physico-medica Academiae Caesarae Leopoldino-Carolinae naturae curiosorum. No modern bibliography of Heister's works appears to exist. The following are his most imimportant books: Dissertatio inauguralis de tunica choroidea oculi (Harderwijk, 1708), doctoral diss.; Oratio inauguralis de hypothesium medicarum fallacia et pernice (Altdorf, 1710), his inaugural lecture as professor of anatomy and surgery; De cataracta glaucomate et amaurosi tractate etc. (Altdorf, 1711); Apologia et uberior illustratio systematis sui de cataracta glaucomati et amaurosi contra Wolhusi ocularii parisiensis cavillationes et objectiones (Altdorf, 1717); Compendium anatomicum, veterum recentiorumque observationes brevissime complectens etc. (Altdorf, 1717; other eds., some with slightly changed title, 1719, 1727, 1732; Amsterdam, 1723, 1733, 1748; Freiburg, 1726; Venice, 1730; Breslau, 1733; Nuremberg, 1736, 1737; Vienna, 1770), translated into English as A Compendium of Anatomy, Containing a Short, but Perfect View of All Parts of the Human Body (London, 1721, 1752), also translated into French (Paris, 1724, 1729, 1735, 1753), Dutch (Amsterdam, 1728), and Italian (Venice, 1772). Chirurgie, in welcher alles was zur Wund Arztney gehöret, nach der neuesten und besten Art, gründlich abgehandelt wird usw. (Nuremberg, 1718, 1719, 1724, 1731, 1739, 1743), also translated into Latin as Institutiones chirurgicas etc. (Amsterdam, 1739, 1750; Venice, 1740; Naples, 1759), into Dutch as Heelkundige Onderwijzingen enz. (Amsterdam, 1741, 1755, 1776), into English as A General System of Surgery etc. (London, 1750, 1768), Italian (Venice, 1765, 1770), French (Paris, 1771), and Spanish (Madrid, 1785); Vindiciae sententiae suae de cataracta glaucomate et amaurosi adversus ultimas animadversiones atque objectiones etc. (Altdorf, 1719); Oratio de incrementis anatomiae in hoc seculo XVIII habita (Helmstedt–Nuremberg, 1720), his inaugural lecture as professor of anatomy and surgery at Helmstedt; Infantes pro a diabolo olim suppositir habitos, revera nihil nisi Rachiticos fuisse (Helmstedt, 1725); Epistola de morte Silii Italici, celebris poetae et oratoris, ex clavo insanabili (Helmstedt, 1735); Compendium institutionum sive fundamentum medicinae (Helmstedt, 1736; Leiden, 4 eds., incl. 1749, 1764), also translated into Dutch (Amsterdam, 1761) and German (Leipzig, 1763); Nachricht von dem Leben und Thaten des englischen Augenarztes John Taylor (Helmstedt, 1736); Compendium medicae practicae, cui praemisse est dissertatio de medicinae praestantia (Amsterdam, 1743, 1748, 1762; Venice, 1763), also translated into Spanish (Madrid, 1752) and German (Leipzig, 1763; Nuremberg, 1767); Kleine Chirurgie oder Wund-Arztney, in welcher ein kurtzer doch deutlicher Unterricht und Begriff dieser Wissenschaft gegeben usw, (Nuremberg, 1747, 1764 [?], 1767), also translated into Dutch (Amsterdam, 1743) and Latin (Amsterdam, 1743, 1748); Systema plantarum generale ex fructificatione, cum regulis de nominibus plantarum a Linnei longe diversis (Helmstedt, 1748); Anatomisch-chirurgisches Lexicon (Berlin, 1753): Descriptio novi generis plantae rarissimae et speciosissimae africanae ex bulbosarum classe Brunsvigiae illustre nomen imposuit (Brunswick, 1753), also translated into German (Brunswick, 1755); and Medicinische, chirurgische und anatomische Wahrnehmungen (Rostock, 1753, 1770), also translated into English (London, 1755).
The bibliography of the Japanese translations is confused. All of them are based on the Dutch trans. Heelkundige Onderwijzingen enz. (Amsterdam, 1755). It seems that, starting in 1792, several pts. of this book were translated under different titles and were circulated in MS only. of these, a diss. on the dressing of wounds, Geka Shūkō translated by Ōtsuki Genkan was published in 1814 in three maki (pts.). The work Yōi Shinshō attributed to Sugita Gempaku and Ōtsuki Gentaku published in 1822 in fifty maki, is sometimes considered to be the trans. of Heister's complete work. It is actually a collection of the MS translations mentioned above. Another trans., in 100 maki, was made in 1819 by Koshimura Tokumoto under the title Yōi seisen but was not printed. However, the atlas to this work, Yōka seisen zukai was published in 1820.
II. Secondary Literature. See Apparatus librorum nec non instrumentarum chirurgicorum Laurentii Heisteri (Helmstedt, 1760), the auction catalog of the books and instruments in Heister's estate; V. Fossel, Studiën zur Geschichte der Medizin (Stuttgart, 1909), pp. 111–152; E. Gurlt, "Lorenz Heister," in Allgemeine deutsche Biographie, XI (Leipzig, 1880), 672–676; Dr. L. [Léon Labbé?], "Laurent Heister," in Nouvelle biographie générale, XXIII (Paris, 1858), 806; C. P. Leporin, Ausführliches Bericht vom Leben und Sehriften des durch gantz Europam berühmten Herrn D. Laurentii Heisteri... (Quedlinburg, 1725); F. Schlipp, Laurentius Heister in seiner Bedeutung für die Augenheilkunde (Haarlem, 1910); V. Schmieden, "Laurentius Heister, ein Beitrag zur Chirurgie," in Zentralblatt für Chirurgie, 51 1924, 710–718; and J. Vossmann, Zahnärztliches bei Laurentius Heister (Leipzig, 1924).
P. W. van der Pas
Complete Dictionary of Scientific Biography
"Heister, Lorenz ." Complete Dictionary of Scientific Biography. . Encyclopedia.com. 13 Jan. 2021 <https://www.encyclopedia.com>.
"Heister, Lorenz ." Complete Dictionary of Scientific Biography. . Encyclopedia.com. (January 13, 2021). https://www.encyclopedia.com/science/dictionaries-thesauruses-pictures-and-press-releases/heister-lorenz
"Heister, Lorenz ." Complete Dictionary of Scientific Biography. . Retrieved January 13, 2021 from Encyclopedia.com: https://www.encyclopedia.com/science/dictionaries-thesauruses-pictures-and-press-releases/heister-lorenz
Gerard Of Cremona , Gerard of Cremona GERARD OF CREMONA (b. Cremona, Italy, ca. 1114; d. Toledo, Spain, 1187), translation of scientific and philosophical works from Ara… Theodoric Of Cervia , (b. Parma or Lucca, Italy, ca. 1205; d. Bologna, Italy, 1298) medicine, surgery. It is quite certain that Theodoric's father was Hugh of Lucca, a pio… Guy De Chauliac , Chauliac, Guy De (b. Chauliac, Auvergne, France, ca. 1290; d. in or near Lyons, France, ca. 1367–1370), medicine. Guy's family were of the peasant cl… Nikolai Ivanovich Pirogov , Surgery, anatomy. The son of a major in the commissary service, Pirogov grew up in fairly cultured surroundings, learned to read early, and was fluen… Translation , TRANSLATION The restatement of the forms of one LANGUAGE in another: the chief means of exchanging information between different language communities… Gaspard Bauhin , anatomy, botany. Bauhin was the younger son of Jean Bauhin, a French Protestant physician and surgeon from Amiens, who sought refuge from religious p…
Leonhardi, Johann Gottfried
Guinter, Joannes
Dominic Gundisalvi (Gundissalinus)
AVIGDOR, ABRAHAM
SICOT
Moerbeke, William of
Theodoric Borgognoni of Lucca
Translation of Children's Literature
Lorenz curve
Lorentzen, Ragnhild (b. 1968)
Lorentzen, Ragnhild (1968–)
Lorentzen, Ingeborg (b. 1957)
Lorentzen, Ingeborg (1957–)
Lorentzen, Bent
Lorentz, Pare
Lorengar, Pilar (real name, Pilar Lorenza García)
Lorengar, Pilar (1928—)
Lorengar, Pilar
Lorence, James J(ohn) 1937-
Lorena Hickok
Loren, Sophia (1934—)
Loren, Alicia (Alicia Loren Chavez, Alicia Sorell)
Lorelei, Die
Lordy
Lords, Traci (Elizabeth) 1968-
Lords of Trade and Plantation
Lorenz Oken
Lorenz, Alfred (Ottokar)
Lorenz, Edward N. 1917–2008
Lorenz, Edward Norton
Lorenz, Ericka (1981–)
Lorenz, Hans
Lorenz, Konrad (1903-1989)
Lorenz, Konrad (1903–1989)
Lorenz, Lee (Sharp)
Lorenz, Ludwig Valentin
Lorenz, Max
Lorenzana y Buitrón, Francisco Antonio de (1722–1804)
Lorenzana, Francisco Antonio de
Lorenzani, Paolo
Lorenzini, Carlo
Lorenzo da Firenze
Lorenzo Fernândez, Oscar
Lorenzo Mascheroni
Lorenzo Romano Amedeo Carlo Avogadro
Lorenzo Troya, Victoriano (1864–1903)
Lorenzo's Oil
Lorenzo, Teresa (fl. 1358)
Lorenzoni, Giuseppe

redpajama_set_name: RedPajamaCommonCrawl


text:
CNET's Editors' Choice Awards Musk Suspends Journalists Trump's NFT Collection 'Barbie' Movie Trailer 'Avatar: The Way of Water' Free COVID Tests 30 Gifts Under $30 Great Gift Ideas
Why You Can Trust CNET
Our expert, award-winning staff selects the products we cover and rigorously researches and tests our top picks. If you buy through our links, we may get a commission. Reviews ethics statement
Home Kitchen & Household
Sommelier Secrets: Here's How to Tell if That Cheap Wine Is Actually Good
We'll help you stock up on affordable wines for your holiday parties that will still impress your guests.
Pamela Vachon
Dec. 15, 2022 3:00 p.m. PT
Pamela Vachon Contributor
Pamela is a freelance food and travel writer based in Astoria, Queens. While she writes about most things edible and potable (and accessories dedicated to those topics,) her real areas of expertise are cheese, chocolate, cooking and wine. She's a culinary school grad, certified sommelier, former bartender and fine dining captain with 10 years in the industry. When not sitting at the keys, she leads in-home cheese classes, wine tastings and cocktail demonstrations.
Expertise Wine, cheese, chocolate, cooking.
There's a big difference between cheap wine and value wine, according to a sommelier.
d3sign/Getty Images
This story is part of Home Tips, CNET's collection of practical advice for getting the most out of your home, inside and out.
There are cheap wines, and there are value wines. Cheap wines may only set you back a few bucks, but their quality is, well, questionable. Value wines, on the other hand, can have a wide range of prices, from genuinely inexpensive to kinda pricey, but they overdeliver at whatever price they are. Cara Patricia is a sommelier and co-owner of San Francisco's DecantSF and shared some value wine-buying tips over email recently. "If [the price] seems too good to be true, it is," she said. "Wine can be cheap, but it has a cost."
Figuring out those wines that represent excellent value can be challenging, even for educated wine consumers, which is why people like Patricia have jobs they love. (Pro tip: Corks over screw caps don't necessarily mean a better wine.) Wine is a huge category to which people such as sommeliers and other wine professionals dedicate their lives.
As casual vino consumers, we're not expected to know everything or even anything, and yet sometimes we still feel intimidated asking for help. Somewhere in the last couple of decades, it feels like the prevailing attitude became that wine knowledge was a requirement for urbane adults. But what's an urbane adult to do when sometimes it feels like the only word we have to describe our wine preference is "dry," and the only financial strategy we have when buying wine is to choose the second least expensive selection? (Hint: This does not often represent the most bang for your buck.)
Patricia's wine motto is "drink for yourself," and DecantSF is known for its relaxed approach to connecting people with wines they'll love, without even a soupçon of pretension. As a woman- and queer-owned business, the top order of business at DecantSF is inclusivity, including on matters of budget. Using Patricia's wine expertise and consumer-friendly attitude, here are seven strategies on how to shop for the best value wines.
(We've also done the math on how much you can save shopping at Trader Joe's and at Costco, and if it's cheaper to buy toilet paper and household essentials on Amazon or at the grocery store.)
Best Alcohol Delivery Services
See at Cnet
"You're not going to get a wine expert at a big box store," Patricia said. "Shop at boutique stores where the experts are," and you'll have access to a wealth of knowledge honed over many years of studying, evaluating, and most importantly, drinking wine. Wine pros are often on a budget, too. "Go to a shop and ask for staff picks in your budget," Patricia advised. "If you're looking for wines under $25, ask for the staff's favorite wines, as that's what they are probably drinking most often at home."
"At DecantSF, we blind taste everything before we bring it into the shop, and the hardest section to blind taste for is our least expensive wines," Patricia said. "We really want these wines to over-deliver on value and deliciousness, so we're super picky with what we bring in. We stock our own homes with those wines, so they have to be good!"
A good local wine store will offer expertise. Many also run weekly or monthly curated tastings to let you try before you buy.
Ariel Skelley/Getty Images
But local isn't always an option. If your area doesn't sport a reputable wine store, you might peruse our list of best online wine clubs and best alcohol delivery services for 2022.
Know your price point
You have every right to your budget and should never feel self-conscious about what you're looking to spend. Wine pros deal every day with people whose budgets are in the tens of dollars, as well as people whose budgets are in the tens of thousands of dollars. Either way, they are prepared to play matchmaker and take a great deal of professional pride in connecting people to the right bottles along any budget considerations.
Some local wine stores like DecantSF offer deals and discounts on wines if you join a membership program.
DecantSF
"If I've learned one thing from being a restaurant sommelier and shop owner, it is: cut to the chase and be honest with what you're looking for," Patricia said. "Be upfront with what you want," especially if you're working with a tight budget. For example, she suggests opening with something like: "I'm looking for a red wine under $30. I've previously enjoyed wines like X, Y, and Z and would like something similar. Do you have any suggestions?" You are more likely to have a positive wine-shopping experience if you open with honesty.
Wine apps and websites are a great way to price compare and ensure you're not overpaying. Try one of these three free wine apps to make sure you're not getting gouged.
Avoid wine trends
"Be wary of fads, Instagram darlings or egregious marketing," Patricia said. A disproportionate amount of marketing dollars are spent on just a fraction of the world's wines. (Looking at you, Whispering Angel.) Most top-quality wine producers prefer to keep their dollars in the vineyards and winery, making excellent wines. They rely on their own tasting rooms, plus sommeliers and wine store staff to do the marketing for them, based on genuine enjoyment of the wines, rather than expensive ads and sponsorships with influencers. "There is often a premium upcharge on the coolest or hottest wines," Patricia said, "and you can tell when a lot of the money is going into the marketing instead of the product."
Orange or amber wines, however, are wine trends worth looking into for some excellent value selections.
Trendy wine may cost you more, especially while in the throes of its trendiness. But that doesn't mean you have to avoid them altogether.
Wines of Georgia
Pull out the world map
Becoming a sommelier has a tremendous amount to do with geography, which is another good reason to put them to work for you when it comes to finding good value wines. You don't need to know every minor wine-producing region, or even every major one, but you can do yourself a service by getting to know a couple of important regions for the styles or grapes you most like and then getting to know their neighbors.
"Look for regions that are just outside the famous regions," Patricia said. "Maybe Sancerre is getting a little too expensive, but there are plenty of lovely sauvignon blancs from Touraine to try. Napa Valley prices are insane! Let's try something from the El Dorado foothills, instead."
Madroña is just one of many great wine producers you'll find in the El Dorado foothills.
Madroña Vinyards
It can also be valuable to learn what New World or other emerging regions are producing similar style wines to some of the heavy hitters, as these are often places that over-deliver for their price point. If you love big cabernet sauvignons from Bordeaux or Napa Valley, look for big reds from Chile or Washington state to save money without sacrificing quality. Opulent chardonnays aren't limited to France and California either, with gorgeous, wallet-friendly expressions coming from Australia and South Africa.
Explore entry-level wines
The world's most famous wine producers became so for making some of the world's most legendary wines, which command top dollar. But these are very rarely the only wines they make, and most offer bottles that come from broader, less expensive wine regions than their top cuvées.
"Love dry Grosses Gewächs riesling but can't shell out $100? Try a dry Trocken riesling from the same estate at a quarter of the cost," Patricia said. "Wish you could splurge on Puligny-Montrachet? Try your favorite producer's Bourgogne Blanc, which can often be a blend of declassified fruit from younger vines."
Trocken riesling is similar to dry Grosses Gewächs riesling, but at a fraction of the cost.
Heroes of Riesling
Further to looking more broadly at the wine map, it can also be a savvy financial strategy to try less famous grapes from very famous producers. "Try different grape varieties from storied producers," Patricia said. "Love a particular Barolo? Try their Barbera d'Asti and get the same great winemaking with a different grape that costs way less to make."
Consider a wine club membership
Some wine stores offer membership deals that are worth looking into. "There are usually discounts for members and you get a lot more variety each period than you would be as a member of a winery's club," Patricia said. "For example, members of DecantSF's bottle clubs get 10% off any reorders of wines featured in clubs, waived corkage fees for drinking bottles in the store, complimentary wine flights, discounts on classes, presales and other perks."
As for online wine memberships or subscriptions, she advised applying healthy skepticism. "Stay away from online-only wine clubs that want you to be an 'investor,' or use an algorithm quiz instead of a sommelier to match your preferences, or guarantee a case of wine for way too cheap," Patricia said. "These are often the lowest quality wines using mass-produced fruit and exploited labor that's blended and bottled under fantasy names. You may as well buy from the bottom shelf at Walmart."
Nothing beats a great local wine store, but if your area is lacking, a sophisticated online wine club will suffice.
However, if your area doesn't sport a reputable wine store, we've vetted some online wine clubs for you with CNET's best wine club for 2022. Some online wine retailers, such as Wine.com, also offer introductory deals for first-time buyers, and Last Bottle periodically offers marathon buying weekends, all of which can be a good way to stock up.
Buy wine in bulk
Buying in bulk is a time-honored, money-saving strategy, and it surely doesn't stop with wine. "Buy more, save more," Patricia said. "For example, DecantSF gives a 5% discount on six bottles, or a 10% discount on 12-plus bottles." You can also save on shipping or delivery by stocking up on wine several times throughout the year, rather than popping out for a bottle for every individual occasion that necessitates one. Larger format bottles as well, such as magnums, or even boxed wine -- yes, I said it -- from reputable producers can save you some money.
More of CNET's boozy best
Best Wine Clubs for 2022
Use These Free Wine Apps and Never Overpay for a Bottle Again
A Guide to Coravin: The Gadget Serious Wine Drinkers Love Most
Best Beer Clubs for 2022
Best Gifts for a Wine Drinker
Get the CNET How To newsletter
Receive expert tips on using phones, computers, smart home gear and more. Delivered Tuesdays and Thursdays.


text:
'use strict';

var fs  = require('fs'),
    express = require('express'),
    consolidate = require('consolidate'),
    swig  = require('swig'),
    path  = require('path'),
    file = require('./controller/file'),
    layers = require('./model/layers'),
    config  = require(path.join(__dirname,'..') + '/config.json');

var app = express();

app.engine('twig', consolidate.swig);

app.set('view engine', 'twig');

app.set('views', 'guide/views');

app.use('/', express.static(path.join(__dirname,'..') + '/'));

app.get('/', function(req, res){
    res.render('index', config);
});

app.use('/file', file);

app.listen(3000, function(){
    console.log('Everything is running');
});


When choosing between a local builder and a larger Nationwide builder, local builders offer some unique benefits.
A local builder will usually be more flexible with your home design plans than a larger builder. We can work with you to make changes to existing plans and create a unique design that you will love. Our builders can work with your timelines and schedules.
Using local builders provides you with an affordable advantage. Local builders have a network of suppliers and have fewer overheads than national companies – they can afford to charge less. A local builder will work with you on a one-on-one basis – and will have a host of options that can be tailor-made to suit your budget.
Using Kennedy Homes as your builders in Caboolture and surrounding areas means that you are supporting your local community. When you deal with us as a local builder, the profits go back into your local area. The products, supplies, staff, and contractors are all sourced locally wherever possible. The money stays in the local region.
When using a local builder you have support close by if you have any problems in the future. You know that local builders will still be in your area for the long term, and can be on-site quickly if necessary.
Local builders build homes thoroughly. Some of the larger building companies build homes quickly and on mass, which can result in less meticulous workmanship than smaller building companies. At Kennedy Homes, we pride ourselves on our quality workmanship, quality builds, and superior designs.
As expert builders, we have a reputation for fine workmanship, professionalism, timeliness and impeccable customer service. Contact us for a building quote today! We proudly service Caboolture, Somerset, Caloundra, Redcliffe and surrounding areas.


For the last 4 decades Alarm Lock products has built a rock solid reputation as a respected security leader in the design and manufacture of electronic and mechanical access and egress control keyless entry products that can be used on door to provide controlled access to your home or business.
Originally known worldwide for its superior Sirenlock panic exit and delayed egress exit alarms in full-door and clapper styles, Alarm Lock has nearly eclipsed its original product success with that of another product line that is the incredibly-popular, innovative Trilogy line of standalone access keyless locks that enables Pre-Lock Security security to provide buildings of all kinds cost-effectively security and allow us to add dependable wireless access control a door at a time with a field-proven access solution and with a consistent model for every door type in your home or business.
Trilogy® electronic access control locks, include original standalone and new wireless networking Trilogy Networx access locks, featuring global lockdown in seconds and eliminates the need for door-to-door programming and audit trail queries by communicating wirelessly via ethernet or 802.11.
All Trilogys digital locks feature the same rugged dependability, and tool-free keypad programming, with cylindrical models boasting Grade 1 BHMA certification. Models are also available in dual-sided access, mortise, privacy lock and narrow stile, for glass doors, and exit trim models which automate existing mechanical pushbars by time-schedules you set and control.
Please take a moment and review some of the Trilogy products we carry and let us show you how we can provide you with the latest in digital access for your home or business.
Call us Today at 416 736-8383.


We are proud to present our latest release "Dramatic Pianos Vol 3" featuring 25 smooth, chilled and hypnotic piano sounds with cinematic flavours! These piano melodies will touch your soul and fuel your imagination!
This impressive piano library brings you 24 professionally played and inspiring piano themes and 24 meticulously programmed MIDI files at 70, 90 and 100 BPM all files are BPM and key-labeled to make choosing the right file even easier. You have the ultimate freedom to choose your own sounds, edit the tempo, change the key, velocity, length and create instant cinematic moods, atmospheres and dramatic textures in seconds. We have given you as much flexibility as possible - that will perfectly fit into your productions. MIDI files are 100% compatible with all major DAWs. Try layering your own sounds with the included wav files for huge powerful melodies and hooks. This natural sounding piano will work in just about any track mix.
"Dramatic Pianos Vol 3" comes with both WAV and MIDI format. From moody piano patterns to deeply emotional phrases, you are going to fall in love this product. Mix & match piano parts to create even deeper productions. MIDI files allow you to assign these melodic phrases to your favourite synth or sampler, allowing them to slot perfectly into your production. Simply drag and drop or import your chosen file into your sequencer software. You're then free to get creative to re-arrange the musical phrase exactly as you want it, add your own unique sound and build up your new track!
"Dramatic Pianos Vol 3" can be used in various genres such as Ambient, Chill-out, Post-Dubstep, Cinematic, Classical and whatever style you are into. Also perfect for use in Cinematic Composition, Film Scores, Short-movie Scores, Trailers, Commercials, Documentaries, Advertising, World and Background music.
Just sit back and listen carefully to discover some of the world's hidden treasures.


although the concept of SSL is known to many, this cheat astrill vpn create account sheet provides a simple model to follow when implementing transport layer protection for an application.
nAT Passthrough. Restore Save Upload Settings. Router Screenshots for the Asus RT-AC68U- m.
Traffic through Vyatta - can you watch uk netflix in the us 4.1 Allow FTP through Vyatta - 4.2 Allow TFTP through Vyatta - 4.3 Allow web traffic through Vyatta - 4.4 Allow DNS through Vyatta - 4.5 Allow Ping through Vyatta - 4.6 Allow PPTP through Vyatta - 4.7 Allow L2TP/IPsec through.
Learn about configuration for apps hosted behind proxy servers and load balancers, which often obscure important request information.
The stringent censorship laws in China lead to a highly restricted Internet. Learn about the best VPN for China 2018 that can grant you unrestricted access to the Internet.
This is why many companies, as well as educational institutions, want to gett a UAE IP address abroad. By having your employees and student at educational institutions from accessing unsuitable website, productivity is increasing. However, proxies and IP hiding tools are not working. Many companies.
with DirectAccess, directAccess uses IPv6-over-IPsec to encrypt communications transmitted across the Internet, even if the user astrill vpn create account is not logged on. Which provides maximum security while avoiding the need of using a VPN Software. IT administrators can manage mobile computers by updating Group Policy settings and distributing software updates any time the mobile computer has Internet connectivity, here is a nice video about Windows 7 DirectAccess.
although it may connect and disconnect during this time to save power, strongVPN's IPSec maintains an " always-on " connection, meaning it'll remain connected at all times until astrill vpn create account explicitly disabled. It will chromecast through proxy always activate the StrongVPN connection before connecting to the internet,Live Science Tom's Hardware m TopTenReviews AnandTech Tom's Guide Newsarama 2018 Purch All Rights Reserved.
the new 2018 MacBook Pro might be astrill vpn create account fast, apple 8,471 articles The 2018 MacBook Pro has a problem with overheating.
subscribe and download the VPN client for your particular platform. Install the VPN on your device. How to set up a free VPN. Go to the website of astrill vpn create account your desired VPN and click through. Run the app and select your preferred protocol.although the iOS device instructions are specific to an iPhone, they also work for astrill vpn create account other iOS devices - the user just has to find the equivalent items for the VPN settings.


You can't go wrong with this gift! Our succulent citrus is deliciously healthy, paired with delightfully decadent chocolate. This winning combination is packed in an attractive wicker basket loaded with our fresh fruit including Grove Navel Oranges, Tangerines, Petite Cara Cara Oranges, D'Anjou Pears and a crisp Orchard Apple. For the chocolate lovers, we've added Chocolate Chip Cookies, Orange Bark, Milk Chocolates, indulgent Sugar Belle Truffles, and Chocolate Crunch Popcorn.


text:
Volume: 45 Issue: 2 Mar 2019
Ovarian metastasis of renal cell carcinoma: Clinical and pathological presentation of a case
Orestis Porfyris 1 ,
Paraskevi Alexandrou 2 ,
Christos Masaoutis 2 ,
Filippos Nikolakakos 1
1 Department of Urology, General Hospital of Laconia, Sparta, Greece
2 Department of Pathology, National and Kapodistrian University, Athens, Greece
Turk J Urol 2019; 45: 150-153
DOI: 10.5152/tud.2018.96237
Key Words: Immunohistochemistry; renal cell carcinoma; ovarian metastasis
A 82-year-old woman was referred to our hospital with complaints of weight loss, loss of appetite, abdominal pain and a palpable pelvic mass. Abdominal imaging revealed a tumour at the upper pole of the right kidney with a maximum diameter of 8 cm and a second tumour in the pelvis, mostly solid, with a maximum diameter of 16 cm, that seemed to originate from the left ovary. As she was initially considered to have two distinct tumours, through a single transabdominal incision, she simultaneously underwent right radical nephrectomy and also bilateral salpingo-oophorectomy for the tumour that originated from the left ovary. Histopathological examination showed that the tumour in the right kidney was a clear-cell renal cell carcinoma (RCC) (stage pT3a, Fuhrman grade 2). The ovarian tumour proved to be an ovarian fibroma that included a circumscribed focus with a diameter of 0.7 cm which was a metastasis from the kidney tumour. Immunohistochemistry contributed significantly to the diagnosis, as the focus showed strong and diffuse expression of CD10 and RCC antigen, which are reliable markers of RCC. With less than 30 reported cases in the literature, it is very important to differentiate ovarian metastasis of RCC from primary ovarian tumour due to different treatment alternatives and prognosis.
Cite this article as: Porfyris O, Alexandrou P, Masaoutis C, Nikolakakos F. Ovarian metastasis of renal cell carcinoma: Clinical and pathological presentation of a case. Turk J Urol 2019; 45(2): 150-3.
AVES | Copyright © 2019 Turkish Association of Urology | Latest Update: 05.07.2019


ECB interest rate cut of at least 0.25% is expected to be announced at lunchtime today. Good news for mortgage holders, who will save Euro 104.17 per month on a Euro 500k mortgage.
Are 5 year fixed mortgage rates attractive?
Posted in Good Financial Housekeeping, Irish mortgage rates, To fix or not to fix	| Tagged 5 year fixed rate, ECB, fix, Good Financial Housekeeping, Irish mortgage rates, LTV, mortgage interest rates	| Comments Off on Are 5 year fixed mortgage rates attractive?
Time to go for fixed rates?
Posted in Good Financial Housekeeping, Irish mortgage rates, To fix or not to fix	| Tagged ECB, fix, Good Financial Housekeeping, mortgage interest rates	| Comments Off on Time to go for fixed rates?
Posted in Good Financial Housekeeping, Irish mortgage rates, To fix or not to fix	| Tagged ECB, Euribor, fix, Good Financial Housekeeping, mortgage interest rates	| Comments Off on To fix or not to fix?


text:
Лари́са Підгі́рна (13 липня 1976, Кам'янець-Подільський район, Хмельницька область) — українська письменниця, сценаристка, громадська діячка, блогерка, голова Го «Товариство Сонця та Місяця», авторка проекту "Літературний туризм ".

Аспірантка Кам'янець-Подільський національний університет імені Івана Огієнка

Біографія

Народилася 13 липня 1976 року у селі Шустівці, Кам'янець-Подільського району, Хмельницької області. Навчалася в Кам'янець-Подільській ЗОШ № 4, міському ліцеї № 18 Закінчила з відзнакою історичний факультет Кам'янець-Подільського Національного університету імені Івана Огієнка.

Працювала журналісткою в Кам'янець-Подільській газеті «Подолянин». Була редактором газети «Погляд» (м. Хмельницький). Найдовше співпрацювала з «Подільською порадницею» та «Криминальним обозрением». Завдяки роботі в журналі «Краля» мала змогу познайомитися з багатьма публічними людьми України.
Десять років проживала в Києві, працювала в газеті «Життя, як воно є». У Кам'янці-Подільському продовжила займатися журналістикою та літературно-мистецькими проєктами. Зокрема створила власне видання про культуру, мистецтво та непересічних людей «PROMO LUX» та започаткувала проект «Літературний туризм», який успішно діє уже впродовж сім років на територіях Хмельниччини, Тернопільщини, Львівщини. Пізніше, у Волочиську, видавала повнокольорове регіональне видання «Вечірні Новини» та продовжила діяльність культурологічних, краєзнавчих та просвітницьких проєктів, зокрема «Петлюрівські читання»у Кам'янці на Поділлі, "Свято Срібної сурми" — родинне дитяче свято на честь народження УПА та Козацької Покрови, краєзнавчий проект «Тарноруда», «Під знаком Білої Троянди» та «Чорні Запорожці повертаються».

У 2017 році авторка започаткувала у серії «Український історичний вестерн» цикл романів саги «Шведіана» «Пригоди Марка Шведа». Наразі, у видавництві «КМ-Букс» вийшла перша частина під назвою «Червона Офелія» (2017)
друга — «Печатка Святої Маргарити»  (2018). третя — «Під чужим прапором» (2019) та четверта — «Полювання на чорного дика» (2020)

У травні 2017 року побачив світ її новий історично-авантюрний роман, що став лауреатом Міжнародного конкурсу «Коронація Слова-2017» — «Омбре. Над темрявою і світлом», який розповідає про діяльність ордену тамплієрів на Поділлі.
Зараз авторка працює над продовженням роману «Омбре», який носитиме назву "Екліпс.Темінь наступає" та історичним романом з елементами фентезі «Хутір «Осіяння»», який, за словами Лори Підгірної, розповідатиме про діяльність УПА і стане такою собі «Сторожовою заставою для дорослих».

Сьогодні у друці видавництва КМ-Букс знаходиться продовження саги «Шведіана» «Пригоди Марка Шведа», п'ята частина "І велети падають".

На черзі в роботі у видавництві Фоліо (видавництво) перша частина нового циклу історичних шпигунських ретро-романів «ORIENT». Перший роман із циклу — «Близько до ворога», перенесе читачів у 20-30-ті роки, занурить в атмосферу міжвоєнного Стамбулу та протистояння таємного легіону УНР із радянською розвідкою.

Також, у видавництві Фоліо (видавництво) незабаром побачить світ новий пригодницький ретро-роман авторки «Вежа Мінерви», із нового циклу «Інесса Путс. Панянка-детектив з Проскурова».

Також Лора Підгірна продовжує роботу над історично-біографічний роман про генерал-полковника Армії УНР Олександра Удовиченка "Стій сонце над Гаваоном"

Лора Підгірна захоплюється кіно, історією, кулінарією, краєзнавством. Досліджує історію часів Гетьманщини та УНР.

Улюблені актори: Джеймс Нортон, Дольф Лундгрен

Улюблені книги: «Холодний яр» Юрій Горліс-Горський, «Україна у війні за державність» Олександр Удовиченко, «Меч Арея» Іван Білик

«Випадкова вакансія» Дж. Ролінг, «Нічний адіністратор» Дж. Ле Карре романи Олександр Дюма та «Код да Вінчі» Дена Брауна

Бібліографія
 Фото-альбом "Тарноруда. Під знаком Білої Троянди..." — 2015 р.
 Сага «Шведіана» Пригоди Марка Шведа. Червона Офелія: роман, серія «Український детектив» / Лора Підгірна. — Київ: Видавнича група КМ-БУКС, 2017, ISBN 978-617-7489-83-1.
 Сага «Шведіана» Пригоди Марка Шведа Печатка Святої Маргарити: роман, серія «Український детектив» / Лора Підгірна. — Київ: Видавнича група КМ-БУКС, 2018, ISBN 978-966-948-001-9.
 Омбре. Над темрявою і світлом: роман, серія «Український детектив» / Лора Підгірна. — Київ: Видавнича група КМ-БУКС, 2018, ISBN: 978-966-948-064-4 (Коронація слова 2017)
 Сага «Шведіана» Пригоди Марка Шведа Під чужим прапором: роман, серія «Український детектив» / Лора Підгірна. — Київ: Видавнича група КМ-БУКС, 2019, ISBN: 978-966-948-282-2
 Різдво через Збруч: збірка оповідань восьми авторів, серія: КМ The BEST/ укладач Лора Підгірна — Київ: Видавнича група КМ-БУКС, 2019, ISBN: 978-966-948-188-7
 Великдень через Збруч: збірка оповідань восьми авторів, серія: КМ The BEST/ укладач Лора Підгірна — Київ: Видавнича група КМ-БУКС, 2019, ISBN: 978-966-948-249-5
 Покрова через Збруч: збірка оповідань восьми авторів, серія: КМ The BEST/ укладач Лора Підгірна — Київ: Видавнича група КМ-БУКС, 2019, ISBN: 978-966-948-359-1
 Сага «Шведіана» Пригоди Марка Шведа Полювання на чорного дика: роман, серія «Український детектив» / Лора Підгірна. — Київ: Видавнича група КМ-БУКС,2020, ISBN: 978-966-948-439-0

Нагороди
 Корнація слова 2017 за роман «Омбре. Над темрявою і світлом» (диплом)

Примітки

Українські письменниці
Лауреати «Коронації слова»

redpajama_set_name: RedPajamaWikipedia


text:
Q: test directive link function in angular using jasmine //angular directive
directive('myDir', function(ConfigurationService) {
return {
    controller: 'myDirController',
    scope: {},
    restrict: 'E',
    templateUrl: '../app/template/myDir.html',
    link: function(scope, element, attributes) {
        myService.init(attributes).then(function(jsonObj){ // need to cover test

        scope.myObj = jsonObj; //jsonObj has a json and need to cover test
    });
 }
}

Now, if I need to do test coverage for this code in jasmine, how can I do that.
configurationService is a factory defined in another JS.
The myDir in html is used as

The jasmine test I want to write is:
it('should fetch data from url link',function(){});
it('should return json data and store in scope.myObj',function(){}

update 1:
I tried this.
it('should store data in scope object',function(){
    var element = $compile('<my-dir url="/Json/in/local/myJson.json"></my-dir>')($scope), iscope;
    $rootScope.$digest();
    iscope = element.isolateScope();
    console.log("scope.myObj: ",iscope.myObj); // getting undefined

});

I also, tried,   element.scope() and element.children().scope() , no use. still getting undefined.
If i get scope.myObj value then I want to do something like
expect(scope.myObj).toBe(what should i say?); //or how would I compare such a huge object that is coming in myObj?

redpajama_set_name: RedPajamaStackExchange


text:
Letters — From the March 2017 issue
Threat Watch
Jeremy Miller criticizes the McKittrick Policy as a threat to wolves, claiming that "it's not clear" why the policy exists ["Bounty Hunters," Letter from Utah, January]. On the contrary, its value is obvious. Last year, I wrote a law-review article in defense of the policy, and am currently litigating on behalf of several agricultural organizations in New Mexico that firmly support it.
The McKittrick Policy is the only legally permissible interpretation of the "take clause" of the Endangered Species Act, which makes it a crime to "knowingly" kill a protected species. Under McKittrick, prosecutors must prove that the defendant knew the identity of the species before taking it.
When you consider the exceptional breadth of the take clause, any other interpretation would be absurd. Although Miller's article focuses on hunting, endangered animals can also be killed by people engaged in such innocent activities as building a home, plowing a farm, driving a car, or going for a jog. Without the McKittrick Policy, a person doing any of those things could go to jail if he or she accidentally harmed any protected species — including more than a hundred insects.
Jonathan Wood
Arlington, Va.
Jeremy Miller's article exposes one of the ways in which states and the federal government use the law to encourage — or at least turn a blind eye toward — the killing of wolves and other predators. The Department of Justice's ill-advised McKittrick Policy, which the agency has never subjected to public comment or even formally announced, puts all endangered species at risk. A federal prosecutor once described to me how the policy prevented his office from prosecuting a man who had killed a California condor, because they lacked ironclad evidence that he knew he was killing North America's largest bird.
Unfortunately, this threat to endangered species pales in comparison to a new one on the horizon. Republican leaders in Congress have announced that they will move to weaken the Endangered Species Act itself — the federal law that has protected the country's most imperiled plants and wildlife for more than four decades. Without this legal bulwark, our children and grandchildren may never see a wolf — or many other species — outside a zoo.
Polls consistently show that most Americans strongly favor protecting endangered species; now would be an ideal time for people to convey this sentiment to their elected officials.
Daniel Rohlf
Professor of Law, Lewis and Clark Law School
Portland, Ore.
A line in the January Harper's Index noted that there are only nineteen statues of women in New York City's Central Park, every one of which represents a fictional person. Undoubtedly we need more statues of historical women, but that statistic alone may give the wrong impression about women's contributions to the park, which have been numerous and varied.
At the southern entrance, three equestrian statues of Latin American leaders dominate the plaza. Two of the three are by female sculptors. In 1916, Sally James Farnham's design for the SimÓn Bolívar monument won a worldwide competition sponsored by the Venezuelan government, which presented the statue to New York five years later. Next to Farnham's Bolívar stands Anna Hyatt Huntington's exciting portrait of Cuban patriot José Martí, which depicts the moment he was mortally wounded in a battle for his country's independence.
In the Thirties, the Parks Department commissioned a fountain at 77th Street, featuring characters from Alice's Adventures in Wonderland, as a memorial to Sophie Irene Loeb, a Russian-born journalist and social worker known as the "godmother of American children." Loeb was elected president of the New York City Welfare Board in 1923, and the following year she helped to found the Child Welfare Committee of America. The reservoir in the middle of the park, from 86th to 96th Street, has, of course, been named the Jacqueline Kennedy Onassis Reservoir.
Those are only some of the women whose lives and work have been honored with a place in Central Park. As important as it is to call attention to inequalities where they persist, it is just as important to know your history.
Edward F. Bergman
Professor Emeritus, City University of New York
Rebecca Solnit's most recent column shows that memory is both tenacious and tenuous ["The Monument Wars," Easy Chair, January]. A locus of memory, such as an anthem or a flag, tells us who we are and who we aspire to be. Once a proud symbol of the secessionist South's aspirations, the Confederate flag has long since become a symbol of slavery, Jim Crow oppression, and white supremacy. While Confederate flags and monuments should be removed from places of honor, they should not be hidden away. Like hominid remains, they belong in museums, as artifacts of the march toward equality and justice. They are a historical legacy showing America's people who they are and where they have been. As Santayana observed, erasings of history condemn a people to relive their past.
G. W. Stephen Brodsky
Sidney, British Columbia
[Letters]


text:
Хоби Лов е български телевизионен канал.

Каналът е развлекателен. Част е от мрежата на Булсатком. Програмата има специализиран профил - лов и риболов.

Източници

Телевизионни канали в България