At the moment, there is not a more efficient and faster payment option than online transactions. When you are provided within online banking account you can start your e-banking life. Of course, there are two sides to every story and people are still concerned that making online transactions will reveal more about them than they would like to. Luckily, the growing number of paying alternatives provide new options for online money transfers. We are going to analyze the possibilities from a online business owner's point of view.
No matter if we are talking about ordinary or e-commerce websites, every website owner needs to approach the data safety matter in the most careful way. The greatest danger when it comes to data thefts is hidden your customers' old logs and track records. For instance, if you run a non-commercial business website that requires registration, your customers will have to give you their email addresses and passwords. What they can do is to come up with strong passwords. Your share of work, on the other side, is to perform regular data cleaning. On the other hand, commercial websites should not insist on too many personal details. A credit card number will suffice your needs. The more information you ask them to submit, the higher is the risk of losing their precious data.
If you want to keep your brick-and-mortar office safe from intruders, you have to protect it with the newest models of different security features, such as alarms, CCTV sets and smart security systems. You need to do the exactly same thing if you want to keep your online data well-protected from hackers' attacks. Since this sort of criminals often have technological advantage over their victims, website owners should always keep their online hubs up to date. The easiest way to get everything that can protect your website is to turn on the automatic updates. In addition, serious businesspeople will avoid free website templates, since they often lack the protection features necessary for online business needs.
Credit and Internet cards are the most frequently used payment options for online transactions. At the moment, there is a fierce battle between PayPal and banks offering credit cards to gain the trust of Internet users; read more about it here. However, if you are a small business player expecting steady growth, it would be smart to explore some other options, too, and use several payment alternatives, like the ones provided by Promise Pay. The more options you offer to your customers, the better impression you will leave on them. After all, it is your obligation to make them feel safe and create an image that your business is trustworthy, too.
Even if both you and your customers follow each and every step along the path of Internet security, you can always experience some completely unpredictable inconveniences. For instance, if the server that hosts your customers' data goes down, you will lose all the data. This is why every business owner has to be assertive with their hosting providers, to ensure that everything is backed up properly. If necessary, go for a more expensive package if it provides a satisfying number of backup copies. Your business reputation will be ruined forever if you customers' personal data get lost or stolen.
When an online business deals with payments and other online transactions, every single mistake can be used to harm the users of its services. Therefore, follow all the guidelines given in this piece to minimize the potential online risks. We sincerely hope you will never have a single negative experience with your customers' data.


TODAY IS the first day of a brand new year for Bahá'ís around the world. Called "Naw-Rúz", which means "New Day" in Persian, it is one of the nine holy days of the year, a joyous celebration that also welcomes the first day of spring.
Here's wishing all of you the joys and good health that spring brings! May they last through summer, fall, & winter . . . and may the light of His Divine mercy & protection surround you and your loved ones!


When I first came to Temple Beth Sholom to begin my tenure as rabbi in July of 1991, little did I know that my first big challenge was waiting for me just a few short months away. After the initial honeymoon period and the heady and hectic experience of my first High Holy Days at my new congregation, we soon got word that our long time administrator, Doris Jacobson was moving on. Doris had been a stalwart of the congregation and had seen us through many difficult times. She mentored me through my first days at Beth Sholom and I had come to rely upon her for support and good counsel. The Temple Beth Sholom board, the staff, in fact the whole congregation asked in disbelief, how could we ever replace Doris? In fact, the answer was very near at hand.
To our great pride and benefit, Susie Amster has developed into a nationally recognized leader in the field of synagogue management. She has served on the board and leadership of the National Association of Temple Administrators and has received awards for her innovative and outstanding contributions to the field. Temple Beth Sholom has grown and prospered in great measure as a result of her guidance, grace, and great personality, all of which have made Susie an invaluable part of the TBS family. For me, during my years as rabbi of Temple Beth Sholom, Susie was always a faithful support and source of good counsel. Above all, she was my cheerleader, and a constant source of encouragement and one of the main reasons why serving Temple Beth Sholom has always been such a source of blessing. Susie has always been a partner, working with her rabbis, lay leaders, staff and congregants to make Temple Beth Sholom the soul-filled place and warm spiritual home that it is.
Susie and her husband Bruce have raised their children Sharon and Adam, Lisa and Julie in the same spirit of community dedication and love of Judaism. In Proverbs 31, the Woman of Valor traditionally recited on Shabbat, in speaking of a talented and industrious woman it says that "Her children stand and bless her; her husband praises her." They do for Susie, and they will along with the whole TBS family!
How wonderfully fitting it is that Temple Beth Sholom salutes Susie Amster on April 24th. The gala event will begin at 6:00 p.m. and will include dinner, dancing, a silent auction, cash raffle, wine raffle and more. Reservations can be made by contacting the Temple Beth Sholom office at 714-628-4600 or RSVP Online at http://www.tbsoc.com/fundraiser/rsvp.html. Join us in saluting Susie Amster.
One Response to A Salute to Susie Amster!
My family and I are looking forward to sharing in these honors for Susie and her family. It has been not only a pleasure working with Susie over the years in various capacities, but since, to be so connected on a friendship level in many ways to this day. My entire family joins me in saluting Susie and her dear family with loving blessings and wishes, eternally!


text:
Recommind taps into $7.5million funding
Recommind, a supplier of enterprise search, email management and e-discovery systems, has just announced that it has secured the first institutional funding – for a total of $7.5 million – in the company's 7 year history. Kennet Partners, a global investment firm focused exclusively on mid-stage, high-growth companies in strategically critical markets, led the round. Experiencing dramatic growth across all product lines and geographies, Recommind is tapping into private equity in order to quickly ramp its global operations and acquire additional product and market breadth through acquisition.
"We are very proud of Recommind's track record of strong, organic growth and profitability over these past 7 years. But with the tremendous demand we have experienced, which has only accelerated with the recent financial market crisis, access to significant capital will be a key ingredient of our ability to fulfill exploding demand organically and through acquisitions going forward," said Robert Tennant, CEO, Recommind.
"At Kennet Partners, we focus on well run, capital efficient companies with strong franchises that have shown a consistent track record of sustained revenue growth. Recommind is directly in our sweet spot and we are pleased to be the first institutional investors in the company," said Eric Filipek, Principal at Kennet Partners. "Recommind is following a similar path taken by some of the most successful technology companies to date by becoming a key supplier of strategically critical technology to a rapidly expanding vertical industry. We are excited to be a part of what is a tremendous success story that continues to gain momentum, even in turbulent times such as these."

redpajama_set_name: RedPajamaCommonCrawl


text:
Madden NFL 2001
Just like Madden NFL 2000, don't even try it.
User Rating: 1.2 | Madden NFL 2001 GBC
By Feedbackdrmmr15 | Review Date: June 11, 2007
Game Review-Gameboy Color-Madden NFL 2001
Released: November 13, 2000
Developers: EA Sports, 3d6 Games
Game Genre: Sports/Football Sim
I really don't understand why EA Sports even tries to make football games on handheld systems. The GBC's limitations are so large in number than it almost makes it impossible. Almost everything is flawed.
As always, the standard game modes are there: Exhibition, Season, Playoffs, etc.
As for in-game…um…well…it's just not there. I suppose I'll break it down and waste my time.
Offense:
The offensive gameplay is almost funny. You select your play, etc. You line up to hike the ball, and the play starts. Even though there are 4 or 5 receivers on the field, there are only two that you have the choice of throwing to: A or B. As for running, there is no sprint button. All you can do is run.
Just plain not there. On kickoffs, you do not control anything but the kick. You can, of course, control a defender when the offense has the ball, but all you can do is run towards the guy with an arrow above his head because you can't tell who has the ball any other way.
Special Teams:
So incredibly easy that a dog could make a field goal.
The graphics still have not improved at all.
Previous Game: Madden NFL 2000
How does none at all sound? The game unimproved.
Yeah, it's ridiculous.
As always, the main menu sounds suck, but now, when the ball is kicked or thrown, there's a sound that's pretty reminiscent of a bomb. You know, where the whistle gets higher and then lower when the bomb almost hits the ground. It's kinda like that.
Controls: You just run, press A or B to throw the ball on offense, and press A to dive.
Difficulty: Very Easy
The computer has the IQ of a fish.
This one barely escaped a full-fledged 1, but it has now set the record for my lowest review ever, and it's my 54th review.


text:
Editorial Cartoon by Graeme MacKay, The Hamilton Spectator – Friday October 16, 2020
Make Canada's electric vehicle bet pay off
The federal and Ontario governments have just rolled the dice — using taxpayers' money — in hopes of hitting it big in the electric vehicle industry.
After anteing up $295 million apiece, they recently convinced Ford Motor Co. of Canada to commit about $1.4 billion of its own money to start manufacturing these zero-emission machines and the batteries that power them at its Oakville plant by 2025.
It's a smart, and admirably non-partisan, gamble on the part of these governments that could preserve thousands of Canadian auto-sector jobs and grow the economy while doing something just as important — fighting climate change.
But if they want this steep, $590-million bet to pay off, they have to do more than just put up money. It's not as easy as saying if you build it they'll buy it.
While there are plenty of hybrid and fully electric vehicles on the market, only about 0.5 per cent of the 23 million passenger vehicles on Canadian roads are electric. There are strong reasons more Canadians haven't leapt behind the wheel of an EV, reasons Ottawa and Queen's Park need to address.
For starters, electric vehicles are generally more expensive to buy than the ones driven by the internal combustion engines that are doing so much to heat up this planet. When it comes to range, most EVs can't travel nearly as far on a full-charge as their gasoline-driven rivals on a full tank, though the gap is decreasing. And the number of electric recharging stations is pitifully small — just a fraction of the number of gas stations out there.
These negatives shouldn't make anyone a naysayer about the future of Canada's electric car and battery industry. It is, in fact, visionary for our nation to embrace what will surely be the technology of the future. Unfortunately there are no givens in the global auto sector and too often good intentions on the parts of governments and even industrial gurus don't pan out.
Canada badly lags behind other countries, such the United States, Germany, Japan and especially China in making EVs. When the current federal Liberal government asked every single EV manufacturer in the world to move to Canada, the answer was consistently no.
But there's an upside to the fact that Ford Motor's first zero-emission vehicles won't roll of the line in Oakville for another five years. That gives the federal and Ontario governments a half decade to ensure their — your — investment ultimately pays off.
Canada needs recharge stations, lots of them. Establishing and paying for more of this essential infrastructure should be part of the federal Liberals' plan for rebuilding post-pandemic Canada.
Perhaps they could partner with existing gas stations. If their owners give the matter some thought they'll realize they, too, have a stake in transitioning away from petroleum-based fuels.
Programs could be established or beefed up across the country to help homeowners as well as condo and apartment complexes, to install their own recharging facilities. In addition, the federal government should review its current rebate program for people buying electric vehicles to determine if it's working and even if it should be enhanced.
Finally, attention must also be paid to the Canadian mining companies that produce the minerals, such as cobalt, nickel and lithium, that will go into the electric vehicle batteries. Do they require help in meeting what could be a significant new demand?
When it comes to electric vehicles, Ottawa and Queen's Park may feel that, as Ford Motor once proclaimed, they have "a better idea." They need to back it up. (Hamilton Spectator Editorial)
Posted in: Ontario	Tagged: 2020-34, automobiles, climate change, cuts, Doug Ford, electric, environment, EV, Ford, Green Energy, Ontario, solar, vehicles, wind power
Monday June 24, 2013
June 24, 2013 by Graeme MacKay
By Graeme MacKay, The Hamilton Spectator – Monday June 24, 2013
Kathleen Wynne backing away from Ontario Green Energy Act
It's always instructive to see how a government frames an announcement that is backtracking on one of its own initiatives.
Conveniently for the Ontario Liberals, they are amassing considerable experience in this regard.
So, when the government on Thursday dropped the news that it was restructuring its 2010 wind-power deal with Samsung, it presented it in terms of extended job commitments and savings to electricity ratepayers. Samsung was guaranteeing jobs until 2016, instead of 2015, and the government was now only committing to buy $6-billion of Samsung's renewable power at well above market rates, down from $9.7-billion in the original contract. Hooray for savings!
Those extended job commitments, though, are a result of Samsung's having missed targets in the original contract; it now has more time to meet them. And that reduction in spending? It comes as Samsung, which won the original contract absent a competition, agrees to drop its own investment in the province from $7-billion to $5-billion, with projects expected to generate 1,369 megawatts of energy, down steeply from 2,500 megawatts in the first deal.
Ontario will be paying less, and receiving less. This is probably not the result of a particularly hard-fought negotiation.
What's more notable are the things that the announcement from Energy Minister Bob Chiarelli did not mention, for example the 16,000 jobs that the original contract was said to create when it was announced in 2010. (Source: The National Post)
Posted in: Ontario	Tagged: Dalton McGuinty, energy, Green Energy, Kathleen Wynne, Ontario, Ontario Liberal Party, Samsung, wind power


Boilers play a big part in maintaining the coziness and comfort of homes in cold weather. While retaining the warmth around the house, boilers operate silently and give a better performance than forced air heating systems. If you are looking for help installing boilers on your residential property, make sure to work with experienced contractors.
As a full-service HVAC contractor, we dedicate ourselves to achieve 100% customer satisfaction. We work with many reputable brands of boilers like Lennox, Burnham, Peerless, Crown, Weil-McLain, and many more.
We are experienced and perform a seamless boiler repair service on the boilers installed in your property. Get in touch with our technicians today for a quality boiler repair job. A timely boiler repair service today will save you from the hassle of replacing them tomorrow.
Still no luck with your faulty boiler even after numerous repairs? It is time to call expert HVAC contractors for efficient boiler replacement service. Our experts will analyze your situation, understand your requirements, and offer a reliable boiler replacement, with low maintenance, that will provide comfortable heating to your home.
We have experience in handling boilers of different makes and models. Our technicians are experienced and diligent with their work. Trust us for quick, hassle-free and effective boiler replacement service.
Even if you are not sure whether you need a repair service or a full replacement, you can call our experts who will guide you through the process.
Do you have a faulty boiler? Call Green City Heating and Air Conditioning at 206-249-9772 for quality boiler repair service in the Central District area.


text:
Q: React Native Nested Stack Inside BottomTabNavigator issue The navigation process I want to achieve is (BottomTabNavigator -> RoutinesStackNavigator -> Routines) which I'm using a stack navigator nested inside a bottom tab navigator
When I navigate to the RoutinesStackNavigator it isn't loading the Routines page and I am not sure why.
BottomTabNavigation.tsx
export default function Navigation() {
  return (
    <>
      <SoundProvider>
        <TimerProvider>
          <NavigationContainer>
            <Tab.Navigator
              sceneContainerStyle={{ backgroundColor: COLORS.white }}
              initialRouteName="Pomodoro"
              screenOptions={({ route, navigation }) => ({
                tabBarShowLabel: false,
                headerShown: false,
                tabBarStyle: [styles.tabBar, styles.tabBarBoxShadow],
                tabBarIcon: ({ focused }) => {
                  let rn = route.name;
                  let iconTag;
                  // assigning navigation icon based on name of route
                  if (rn === pomodoroName) {
                    // assigning JSX Tag
                    iconTag = (
                      <PomodoroIcon
                        size={iconSize}
                        fillColor={iconColor}
                        isFocused={focused}
                      />
                    );
                  } else if (rn === agendaName) {
                    iconTag = (
                      <AgendaIcon
                        size={iconSize}
                        fillColor={iconColor}
                        isFocused={focused}
                      />
                    );
                  } else if (rn === tutorialsName) {
                    iconTag = (
                      <TutorialsIcon
                        size={iconSize}
                        fillColor={iconColor}
                        isFocused={focused}
                      />
                    );
                  } else if (rn === routinesStackNavigatorName) {
                    iconTag = (
                      <RoutinesIcon
                        size={iconSize}
                        fillColor={iconColor}
                        isFocused={focused}
                      />
                    );
                  }
                  return (
                    <Pressable
                      onPress={() => {
                        // add haptic feedback and navigate to new route
                        addLightHapticFeedback("light");
                        navigation.navigate(rn);
                      }}
                    >
                      {iconTag}
                    </Pressable>
                  );
                },
              })}
            >
              <Tab.Screen name={pomodoroName} component={Pomodoro} />
              <Tab.Screen name={agendaName} component={Agenda} />
              <Tab.Screen name={tutorialsName} component={Tutorials} />
              <Tab.Screen
                name={routinesStackNavigatorName}
                component={RoutinesStackNavigator}
              />
            </Tab.Navigator>
          </NavigationContainer>
        </TimerProvider>
      </SoundProvider>
    </>
  );
}

RoutinesStackNavigator.tsx
export default function RoutinesStackNavigator() {
  const Stack = createStackNavigator();

  return (
    <>
      <SafeAreaView>
        <Stack.Navigator initialRouteName="Routines">
          <Stack.Screen name="Routines" component={Routines} />
          <Stack.Screen name="CreateRoutine" component={CreateRoutine} />
        </Stack.Navigator>
      </SafeAreaView>
    </>
  );
}

index.Routines.tsx
export default function Routines() {
  const { width } = useWindowDimensions();
  return (
    <>
      <FocusedStatusBar barStyle="light-content" />
      <View style={styles.container}>
        <View style={styles.row}>
          <Text style={styles.title}>{STRINGS.routinesTitle}</Text>
          <TouchableOpacity onPress={() => {}}>
            <AntDesign name="pluscircle" size={44} color={COLORS.white} />
          </TouchableOpacity>
        </View>
        <View style={[styles.main, { width: width }]}>
          <View style={{ height: "72%" }}>
            <ScrollView
              showsVerticalScrollIndicator={true}
              style={{ marginTop: 10, marginBottom: 10 }}
            >
              <RoutineCard />
              <RoutineCard />
            </ScrollView>
          </View>
          <TouchableOpacity style={styles.button} onPress={() => {}}>
            <Text style={styles.buttonText}>Start Session</Text>
          </TouchableOpacity>
        </View>
      </View>
    </>
  );
}

none of the Routines component renders, except the StatusBar color changes. So the component must be rendering but the rest of the content doesn't show up.

A: You have to remove <SafeAreaView> from RoutinesStackNavigator.tsx
const Stack = createStackNavigator();

export default function RoutinesStackNavigator() {

  return (
    <Stack.Navigator initialRouteName="Routines">
      <Stack.Screen name="Routines" component={Routines} />
      <Stack.Screen name="CreateRoutine" component={CreateRoutine} />
    </Stack.Navigator>
  );
}

redpajama_set_name: RedPajamaStackExchange


text:
Pasanggrahan is een bestuurslaag in het regentschap Cirebon van de provincie West-Java, Indonesië. Pasanggrahan telt 3574 inwoners (volkstelling 2010).

Plaats in West-Java

redpajama_set_name: RedPajamaWikipedia


text:
package com.github.blindpirate.gogradle.task.go;

import com.github.blindpirate.gogradle.GolangPluginSetting;
import com.github.blindpirate.gogradle.build.BuildManager;
import com.github.blindpirate.gogradle.common.LineCollector;
import com.github.blindpirate.gogradle.crossplatform.GoBinaryManager;
import com.github.blindpirate.gogradle.task.AbstractGolangTask;
import com.github.blindpirate.gogradle.task.go.test.GoTestResultExtractor;
import com.github.blindpirate.gogradle.unsafe.GradleInternalAPI;
import com.github.blindpirate.gogradle.util.IOUtils;
import org.apache.commons.io.filefilter.SuffixFileFilter;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.gradle.api.Incubating;
import org.gradle.api.tasks.options.Option;
import org.gradle.api.internal.tasks.testing.junit.result.TestClassResult;
import org.gradle.api.logging.Logger;
import org.gradle.api.logging.Logging;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.InputFiles;
import org.gradle.api.tasks.Optional;
import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.TaskAction;

import javax.inject.Inject;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;

import static com.github.blindpirate.gogradle.common.GoSourceCodeFilter.SourceSetType.PROJECT_TEST_AND_VENDOR_BUILD_FILES;
import static com.github.blindpirate.gogradle.common.GoSourceCodeFilter.SourceSetType.PROJECT_TEST_FILES_ONLY;
import static com.github.blindpirate.gogradle.common.GoSourceCodeFilter.filterGoFiles;
import static com.github.blindpirate.gogradle.common.GoSourceCodeFilter.filterTestsMatchingPattern;
import static com.github.blindpirate.gogradle.task.GolangTaskContainer.VENDOR_TASK_NAME;
import static com.github.blindpirate.gogradle.task.go.GoCover.COVERAGE_PROFILES_PATH;
import static com.github.blindpirate.gogradle.util.CollectionUtils.asStringList;
import static com.github.blindpirate.gogradle.util.CollectionUtils.isEmpty;
import static com.github.blindpirate.gogradle.util.IOUtils.clearDirectory;
import static com.github.blindpirate.gogradle.util.IOUtils.encodeInternally;
import static com.github.blindpirate.gogradle.util.IOUtils.filterFilesRecursively;
import static com.github.blindpirate.gogradle.util.IOUtils.forceMkdir;
import static com.github.blindpirate.gogradle.util.IOUtils.safeListFiles;
import static com.github.blindpirate.gogradle.util.StringUtils.fileNameEndsWithAny;
import static com.github.blindpirate.gogradle.util.StringUtils.fileNameStartsWithDotOrUnderline;
import static com.github.blindpirate.gogradle.util.StringUtils.toUnixString;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;

public class GoTest extends AbstractGolangTask {
    private static final Logger LOGGER = Logging.getLogger(GoTest.class);
    private static final String REWRITE_SCRIPT_RESOURCE = "test/rewrite.html";
    private static final String TEST_REPORT_DIR = ".gogradle/reports/test";

    @Inject
    private GolangPluginSetting setting;

    @Inject
    private GoTestResultExtractor extractor;

    @Inject
    private BuildManager buildManager;

    @Inject
    private GoBinaryManager goBinaryManager;

    private List<String> testNamePattern;

    private boolean generateCoverageProfile = true;

    private boolean continueOnFailure;

    private Map<String, String> environment = new HashMap<>();

    public GoTest() {
        setDescription("Run all tests.");
        dependsOn(VENDOR_TASK_NAME);
    }

    public void environment(String key, String value) {
        environment.put(key, value);
    }

    public void environment(Map<String, String> map) {
        environment.putAll(map);
    }

    @Deprecated
    public void setContinueWhenFail(boolean continueOnFailure) {
        LOGGER.warn("continueWhenFail is deprecated, please use continueOnFailure instead.");
        this.continueOnFailure = continueOnFailure;
    }

    public void setContinueOnFailure(boolean continueOnFailure) {
        this.continueOnFailure = continueOnFailure;
    }

    public void setGenerateCoverageProfile(boolean generateCoverageProfile) {
        this.generateCoverageProfile = generateCoverageProfile;
    }

    @Option(option = "tests", description = "Sets test class or method name to be included, '*' is supported.")
    @Incubating
    public GoTest setTestNamePattern(List<String> testNamePattern) {
        this.testNamePattern = testNamePattern;
        return this;
    }

    @TaskAction
    public void run() {
        setGogradleGlobalContext();

        prepareCoverageProfileDir();
        List<TestClassResult> testResults = doTest();
        generateTestReport(testResults);
        rewritePackageName(getReportDir());
        reportErrorIfNecessary(testResults, getReportDir());
    }

    @Input
    @Optional
    List<String> getTestNamePattern() {
        return testNamePattern;
    }

    @Input
    String getGoVersion() {
        return goBinaryManager.getGoVersion();
    }

    @Input
    List<String> getBuildTags() {
        return setting.getBuildTags();
    }

    @InputFiles
    Collection<File> getAllGoFiles() {
        return filterGoFiles(getProjectDir(), PROJECT_TEST_AND_VENDOR_BUILD_FILES);
    }

    @OutputDirectory
    File getReportDir() {
        return new File(getProjectDir(), TEST_REPORT_DIR);
    }

    @OutputDirectory
    File getCoverageDir() {
        return new File(getProjectDir(), GoCover.COVERAGE_PROFILES_PATH);
    }

    private Map<File, List<File>> groupByParentDir(Collection<File> files) {
        return files.stream()
                .collect(groupingBy(File::getParentFile));
    }

    private List<File> getAllNonTestGoFiles(File dir) {
        return safeListFiles(dir).stream()
                .filter(file -> file.getName().endsWith(".go"))
                .filter(file -> !fileNameStartsWithDotOrUnderline(file))
                .filter(file -> !fileNameEndsWithAny(file, "_test.go"))
                .filter(File::isFile)
                .collect(toList());
    }

    private String dirToImportPath(File dir) {
        Path relativeToProjectRoot = getProjectDir().toPath().relativize(dir.toPath());
        Path importPath = Paths.get(setting.getPackagePath()).resolve(relativeToProjectRoot);
        return toUnixString(importPath);
    }

    private void generateTestReport(List<TestClassResult> testResults) {
        GradleInternalAPI.renderTestReport(testResults, getReportDir());
    }

    private List<TestClassResult> doTest() {
        List<TestClassResult> ret = new ArrayList<>();

        Map<File, List<File>> parentDirToTestFiles = determineTestPattern();

        parentDirToTestFiles.forEach((parentDir, testFiles) -> {
            String packageImportPath = dirToImportPath(parentDir);
            PackageTestResult result = doSingleTest(packageImportPath, testFiles);

            List<TestClassResult> resultOfSinglePackage = extractor.extractTestResult(result);
            logResult(packageImportPath, resultOfSinglePackage);
            ret.addAll(resultOfSinglePackage);
        });
        return ret;
    }

    private Map<File, List<File>> determineTestPattern() {
        if (isEmpty(testNamePattern)) {
            // https://golang.org/cmd/go/#hdr-Description_of_package_lists
            Collection<File> allTestFiles = filterGoFiles(getProjectDir(), PROJECT_TEST_FILES_ONLY);
            return groupByParentDir(allTestFiles);
        } else {
            Collection<File> filesMatchingPatterns = filterTestsMatchingPattern(getProjectDir(), testNamePattern);

            if (filesMatchingPatterns.isEmpty()) {
                LOGGER.quiet("No tests matching " + testNamePattern.stream().collect(joining("/")) + ", skip.");
                return Collections.emptyMap();
            } else {
                LOGGER.quiet("Found " + filesMatchingPatterns.size() + " files to test.");

                Map<File, List<File>> parentDirToFiles = groupByParentDir(filesMatchingPatterns);

                parentDirToFiles.forEach((parentDir, tests) -> tests.addAll(getAllNonTestGoFiles(parentDir)));

                return parentDirToFiles;
            }
        }
    }

    private void reportErrorIfNecessary(List<TestClassResult> results, File reportDir) {
        int totalFailureCount = results.stream().mapToInt(TestClassResult::getFailuresCount).sum();
        String message = "There are " + totalFailureCount + " failed tests. Please see "
                + toUnixString(new File(reportDir, "index.html"))
                + " for more details.";
        if (continueOnFailure) {
            LOGGER.error(message);
        } else if (totalFailureCount > 0) {
            throw new IllegalStateException(message);
        }
    }

    private void prepareCoverageProfileDir() {
        File coverageDir = new File(getProjectDir(), COVERAGE_PROFILES_PATH);
        forceMkdir(coverageDir);
        clearDirectory(coverageDir);
    }

    private PackageTestResult doSingleTest(String importPath, List<File> testFiles) {
        LineCollector lineCollector = new LineCollector();

        List<String> args = isCommandLineArguments()
                ? asStringList(determineTestParams(), IOUtils.collectFileNames(testFiles))
                : asStringList(determineTestParams(), importPath);

        if (generateCoverageProfile) {
            File profilesPath = new File(getProjectDir(), COVERAGE_PROFILES_PATH + "/"
                    + encodeInternally(importPath) + ".out");
            args.add("-coverprofile=" + toUnixString(profilesPath.getAbsolutePath()));
        }

        Consumer<String> consumer = determineLineConsumer(lineCollector, importPath);

        int retCode = buildManager.go(args, environment, consumer, consumer, true);

        return PackageTestResult.builder()
                .withPackagePath(importPath)
                .withStdout(lineCollector.getLines())
                .withTestFiles(testFiles)
                .withCode(retCode)
                .build();
    }

    private List<String> determineTestParams() {
        if (goBinaryManager.supportTestJsonOutput()) {
            return Arrays.asList("test", "-v", "-json");
        } else {
            return Arrays.asList("test", "-v");
        }
    }

    private Consumer<String> determineLineConsumer(LineCollector lineCollector, String importPath) {
        if (!LOGGER.isInfoEnabled()) {
            return lineCollector;
        } else {
            if (isCommandLineArguments()) {
                LOGGER.info("Result:");
            } else {
                LOGGER.info("Result of package {}:", importPath);
            }
            return lineCollector.andThen(LOGGER::info);
        }
    }

    private boolean isCommandLineArguments() {
        return !isEmpty(testNamePattern);
    }

    private void logResult(String packagePath, List<TestClassResult> resultOfSinglePackage) {
        int failureCount = resultOfSinglePackage.stream().mapToInt(TestClassResult::getFailuresCount).sum();
        int skipCount = resultOfSinglePackage.stream().mapToInt(TestClassResult::getSkippedCount).sum();
        int totalCount = resultOfSinglePackage.stream().mapToInt(TestClassResult::getTestsCount).sum();

        if (skipCount > 0) {
            LOGGER.quiet("Test for {} finished, {} completed, {} failed, {} skipped.",
                    packagePath, totalCount, failureCount, skipCount);
        } else {
            LOGGER.quiet("Test for {} finished, {} completed, {} failed.", packagePath, totalCount, failureCount);
        }
    }

    private void rewritePackageName(File reportDir) {
        Collection<File> htmlFiles = filterFilesRecursively(
                reportDir,
                new SuffixFileFilter(".html"),
                TrueFileFilter.INSTANCE);
        String rewriteScript = IOUtils.toString(
                GoTest.class.getClassLoader().getResourceAsStream(REWRITE_SCRIPT_RESOURCE));
        htmlFiles.forEach(htmlFile -> {
            String content = IOUtils.toString(htmlFile);
            content = content.replace("", "" + rewriteScript);
            IOUtils.write(htmlFile, content);
        });
    }

}

redpajama_set_name: RedPajamaGithub


The EEOC released a fact sheet today on employment tests and selection procedures. It "provides technical assistance on some common issues relating to the federal anti-discrimination laws and the use of tests and other selection procedures in the employment process" and lists a number of "employer best practices" recommended by the EEOC. The fact sheet also sets out several cases filed by the EEOC as illustrative of their position on screening practices.
On a practical note, employers must be careful implementing and using employment tests and standardized selection procedures. It is extremely risky to use an off-the-shelf test that has not been analyzed and validated for use with a particular employer and job. The EEOC rightfully points out that "Employers should ensure that tests and selection procedures are not adopted casually by managers who know little about these processes." As the settlements noted in the fact sheet attest, it can be expensive to discover in litigation against the EEOC that a test you have been using has discriminatory adverse impact (i.e. $8.55 million settlement with Ford Motor Co. for using a cognitive ability test to screen apprentice applicants that resulted in a statistically significant number of African American applicants being screened out).


"I'm excited about this show and grateful to ABC for taking a chance on me in what is, admittedly, a crowded field," said Baldwin. "I've enjoyed doing my podcast for WNYC and look forward to the challenge of doing a show on camera."
(from ABC's press release, February 2018) ABC has picked up "Sundays with Alec Baldwin," a new one-hour talk show hosted by Oscar nominee and Emmy(R) and Golden Globe(R) Award-winning actor Alec Baldwin, featuring one-on-one conversations with some of the most interesting people from American pop culture. From ABC and Baldwin's El Dorado Pictures, a sneak peek will air SUNDAY, MARCH 4 (11:35 p.m. EST/10:00 p.m. PST), following the 90th Oscars, on The ABC Television Network. "I'm excited about this show and grateful to ABC for taking a chance on me in what is, admittedly, a crowded field," said Baldwin. "I've enjoyed doing my podcast for WNYC and look forward to the challenge of doing a show on camera." "Alec's intellect, wit and wealth of life experience afford him a voice and perspective we haven't seen before in this format," said Channing Dungey, president, ABC Entertainment. "When we shot the pilot, we knew immediately we had something special that we couldn't wait to share. We are excited to be working on a series that showcases Alec as one of today's most compelling conversationalists and highlights the type of intimate discussions that he has captured on his podcast for years."