text:
Eater Inside
Chicago Restaurant Openings
Taco Pub's Opening Brings Mezcal, Al Pastor & More to the Loop
Broken English Taco Pub showcases many Mexican flavors
by Ashok Selvam@Shokdiesel May 4, 2016, 2:45pm CDT
Photography by Marc Much | Via Michigan Avenue Getting Taco Pub From Adolfo Garcia & Phil Stefani [ECHI]
Share All sharing options for: Taco Pub's Opening Brings Mezcal, Al Pastor & More to the Loop
Cinco de Mayo will bring Adolfo Garcia's (Son of A Butcher Tavern, Pearl Tavern) tacos downtown. Garcia's described Broken English Taco Pub as a very personal project, one that could turn into a popular lunch hotspot or a post-work happy hour oasis. The name is a good-natured joke poking fun of the chef's mastery of the language.
The restaurant, a joint venture with Phil Stefani, opens at 5 p.m. on Thursday with an interior decorated with bright colors paying homage to Garcia's native Mexico. Fans of luchadores will find plenty of the Mexican-masked wrestlers on murals. There's also a mural reminiscent of Mexican artist Frida Kahlo, along with a long bar with plenty of libations including margaritas.
Tacos come two to an order and range from $6 to $10. There's also a smoked trout guacamole. Read the full menu below, which also includes breakfast tacos and tortas. Garcia said he wanted to represent a variety of Mexican regions.
The cocktails have aggressive and kitschy names like the Rattlesnake Piñata (herradura tequila blanco, prickly pear puree, maraschino liqueur, yellow chartreuse, lime, sweet-hot salt). Four out of the five drinks are $12. Pacifico is the only draft beer available, for now.
Take a look at the photos above and the menu below. Quick note: They'll be closed this Sunday due to Mother's Day.
Broken English Taco Pub, 75 E. Lake St., (312) 929-3601, open 11 a.m. to 1 a.m., Sunday through Monday.
Broken English Taco Pub Opening Menu by Ashok Selvam


text:
Q: Is timer instance can be reused in java? In the following code is it possible to reuse the same timer1 object again instead of timer2 for invoking timertask?
            Timer timer1 = new Timer();

        timer1.scheduleAtFixedRate(new TimerTask() {
        int counter = 0;
        @Override
        public void run() {
            PriorityQueueHandler.getQueueInstance().addToQueue(passengers.get(counter));
            counter++;
            if(counter == passengers.size()){
                counter = 0;
            }
        }
    }, DELAY, ARRIVAL_INTERVAL);

    PriorityQueueHandler.getQueueInstance().print();

    Timer timer2 = new Timer();

    timer2.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {
            PriorityQueueHandler.getQueueInstance().print();
        }
    }, DELAY, BOOKING_INTERVAL);

A: You can reuse a timer instance for several tasks. Notice that a timer executes all tasks in one single thread synchronous which means that if one task is stalled this will affect the other tasks scheduled on the same timer, i.e. the other task will not be executed.

A: Yes, that should be fine - if you're happy with the tasks running sequentially. From the docs:

Corresponding to each Timer object is a single background thread that is used to execute all of the timer's tasks, sequentially. Timer tasks should complete quickly. If a timer task takes excessive time to complete, it "hogs" the timer's task execution thread. This can, in turn, delay the execution of subsequent tasks, which may "bunch up" and execute in rapid succession when (and if) the offending task finally completes.

It's fine to have many scheduled tasks:

Implementation note: This class scales to large numbers of concurrently scheduled tasks (thousands should present no problem). Internally, it uses a binary heap to represent its task queue, so the cost to schedule a task is O(log n), where n is the number of concurrently scheduled tasks.

Personally I'd probably use a ScheduledExecutorService to give more control over the threads created and concurrency between tasks, but that's a slightly different matter.

redpajama_set_name: RedPajamaStackExchange


text:
https://www.ctpost.com/news/article/Malloy-warns-of-rough-and-tough-night-3991375.php
Malloy warns of 'rough and tough night'
Updated 9:41 pm EDT, Monday, October 29, 2012
FILE PHOTO — Tomiko Knapp watches storm waters from sea wall along Beach Drive, in the Lordship section of Stratford, Conn. Oct. 29th, 2012.
Photo: Ned Gerard / Ned Gerard
Image 1 of / 375
Gov. Dannel P. Malloy warned of a "rough and tough night" Monday as winds as high as 80 miles per hour ripped across the state, causing hundreds of thousands of power outages and threatening historic flood levels from Greenwich to Stonington.
During a news conference in the State Armory at 6 o'clock, Malloy said that the worst of the Hurricane Sandy's winds might dissipate by 10 p.m., but the ban will remain on trucks using state highways.
"The bad news is that the worst is still to come," Malloy said, noting that the storm accelerated when it hit land at Ocean City, Maryland.
United Illuminating Co. shut off power for about 52,000 residents and businesses in Bridgeport, Trumbull, Fairfield, Stratford and Shelton starting at about 6:30 p.m., when rising water was threatening three substations near the coast in downtown Bridgeport.
About 35,000 Bridgeport customers had their power shut off by 8 p.m. The substations would be closed overnight as utility crews waited for the flooding to subside.
Tony Marone, senior vice president for UI, said the substation closures, two at a Congress Street site and one on Pequonnock Street, would allow for a more-rapid recovery when the tide subsides in the morning.
If water gets into sophisticated controls, recovery would take longer, Marone told reporters. Malloy said that Bridgeport Mayor Bill Finch accepted an offer of state public safety personnel and other assets to assist the city during the night.
William Quinlan, senior vice president for Connecticut Light & Power Co., said that Stamford and Branford substations are still being monitored. A concrete barrier in Stamford's South End was almost complete by 6:30 p.m.
He predicted that both substations may avoid danger of flooding. In Stamford's South End, flooding was held at a mile and a half away during the morning high tide, he said.
After the news conference, Malloy signed four executive orders allowing out-of-state telecommunication workers to perform repairs; and extend three tax-filing deadlines until the middle of next month.
Malloy said he thought that the utilities were better prepared than they were during the storms of 2011, but the test will be in seeing how quickly electricity is restored to communities that lose power.
"I made it clear to the utility companies something that they already know," Malloy said. "Everyone is watching to see how they perform. They certainly seem to have been better prepared in advance of the storm. I've told them that I expect their after-storm performance to be a lot better than it was last year."
He said that two briefings were held for municipal officials, one for waterfront towns and cities.
Statewide, 270,000 outages were reported among CL&P customers, most of whom in the southeastern part of the state. About 65,000 UI customers were without power after UI shut off the three Bridgeport substations. Restoration crews can't begin to work until the wind drops to 40 miles per hour.

redpajama_set_name: RedPajamaCommonCrawl


text:
Studies show a connection: Poorer children are more likely to be infected with Corona
How much money a family has has an impact on the children's risk of corona infection.
How much money a family has has an impact on the children's risk of corona infection. According to the Federal Ministry of Health, this is the result of various studies.
The socioeconomic status of children and their families has an impact on their corona infection risk. According to the Federal Ministry of Health, this is the result of various studies. The left-wing faction had made a corresponding request to the federal government, and the editorial network Germany (RND) reported on their answer.
The probability of a corona infection in children and employees of schools and daycare centers is "generally greater in facilities with a higher proportion of children from socio-economically disadvantaged households," the ministry said. In addition, these facilities are "more often affected by infection-related closures and thus also by staff shortages".
The child and youth policy spokeswoman for the left-wing faction in the Bundestag, Heidi Reichinnek, criticized the lack of targeted support for children and young people from socially disadvantaged families. "The federal government recognizes a clear connection between poverty and the rate of infection and the severity of the courses. At the same time, however, nothing is being done to support families separately," she told RND.
According to information from the Ministry of Health, according to official data from the Robert Koch Institute, 7,234,503 children and adolescents aged up to 18 years have been infected with the corona virus in Germany since the beginning of the corona pandemic. Accordingly, the highest infection rate is in ten to 14-year-olds, and the fewest registered cases are in small children up to four years of age.
#COVID19,
#Kinder,
#SarsCov2
1 Thuringia: SPD party proceedings after coordination... 2 Thuringia: Spring fever when firecrackers: 17 degrees... 3 Loss at the Four Hills Tournament: German ski jumping... 4 North Rhine-Westphalia: Woman found dead during extinguishing... 5 Baden-Württemberg: horse throws off rider and runs... 6 North Rhine-Westphalia: Unknown hit man: Commission... 7 Mecklenburg-Western Pomerania: Schwesig: Crisis is... 8 Thuringia: Death of Benedict: Thuringia commemorates... 9 Jordanian royal family: William and Kate of the desert... 10 More and more attacks on the city: Ukraine: Bachmut...
Thuringia: SPD party proceedings after coordination...


text:
PRESSURE COOKER – "Burning Fence Instrumentals" CD – (JUMP058 – OUT OF PRINT)
Boston's Pressure Cooker formed in early 1997 to create and perform a unique blend of original ska, rock-steady and reggae music. The group draws its musical inspiration from traditional Jamaican movements spiced with Jazz, Calypso, and Latin arrangements – enticing both the listener and dancer alike.
Pressure Cooker's diverse group of artists have been involved with Boston's live music scene for many years, bringing a unique blend of talent and experience to the table. The band was nominated for Best Reggae Act 1999 and Best Ska Band 2000 by the Boston Music Awards. In June of 1999, Pressure Cooker released its debut self-titled CD to significant critical acclaim, and in January 2001 dropped its sophomore effort "I Want To Tell You" which won the award for "Best Ska Album of 2001" from About.Com. The band's word-of mouth following combined with significant ska/reggae press quickly brought the band to the attention of Jump Up Records. It was after witnessing the band's brilliance backing PRINCE BUSTER, DERRICK MORGAN, and MONTY MORRIS on a rainy night outside of Boston, that label head Chuck Wren set his sights to be the first label to work hand in hand with one of American's best bands!
Pressure Cooker rings in the new year with a brand new instrumental CD entitled "BURNING FENCE", featuring fifteen original songs plus two deejay versions. The album was conceived, written, and recorded over the course of only a few weeks at the tail end of 2003. The album was recorded live to 1/4″ analog tape during one main session t EchoBass studio in Newton, Mass. Inspired by the recording methods of early Jamaican recording artists, this album captures the old-style roots of the Pressure Cooker sound in a live one-take setting. Whether it's scorching Skatalites-style ska, crucial roots reggae, smooth lovers rock, or dub heavy rockers, Pressure Cooker's tremendous writting "sings" without words, dropping an unforgettable, infectious soundtrack in your head after just one listen.
Highlights include soloing from the powerful new Pressure Cooker horn trio: Brian Thomas (trombone), Robin Haynes (tenor sax), and Louisa Gelfuso (trumpet), joining Michael O'Connor (tenor sax) who composed the bulk of the new music. Veteran Cooker rhythm section Jeffrey Eckman (drums), Dan Hawkins (bass), Zack Brines (organ & piano) and Adam Dobkowski (guitar) lay down the foundation. Lead vocalist Craig Fujita makes a cameo appearance for two special deejay tracks at the end of the playlist.
"Pressure Cooker remains firmly and freshly rooted in the purity of original Jamaican ska and reggae. It's firm because of the expert musicianship throughout the band, from rhtyhm to melody. It's fresh because of the sweet vocal style of Craig Akira Fujita and the eager energy brought to every track by the band. During the days when ska fans are already waxing nostalgic for the glory days of 1996, Pressure Cooker is indeed a precious resource not to be missed." – Bob Timm, ABOUT.COM
For Fans of: The Slackers, Hepcat, Stubborn All Stars, Deal's Gone Bad, Dr Ring Ding
Buy Jump Up CDs on Amazon
JUMP058
Pressure Cooker "Burning Fence Instrumentals"
Previous post: SEE SPOT – "Who Got It?" CD – (JUMP057 – OUT OF PRINT)
Next post: OUT OF LINE – "Channel Surfing" CD – (JUMP059 – OUT OF PRINT)


Sameer Linkages Private Limited has a product range that offers the linkage requirements of the Electrical, Mechanical, Hydraulic & Pneumatic Engineering Industry under one manufacturing facility. The Company is in the Business to offer Complete Linkage Solutions which may also require and by way of extensive customization in its product range. The Company is located at Baroda in the State of Gujarat and is about 45 minutes of flying time north of Mumbai, India's Business Capital. Baroda is extensively linked by Air, Rail and Road for Outbound Cargo to India's Major Airports and Seaports.


Charlie Gracie, one of America's first rock 'n' roll stars, with hits like Fabulous, Butterfly and I Love You So Much It Hurts, is heading to the Isle of Wight for 2 appearances at the Camphill Community Club in Newport.
Charlie, who loves visiting Britain, first came in 1957 for a nationwide tour. He also was seen on TV's 'Sunday Night At The London Palladium' and the Six-Five Special. His early British fans included Paul McCartney, John Lennon, Cliff Richard and Van Morrison.
On Thursday (6th December), Charlie will be featured in an informal evening at Camphill Community Club. The event will be hosted by the Island's showbiz journalist and broadcaster John Hannam. He will interview Charlie live on stage and there will opportunities to ask questions and to meet Charlie in person. There will also be 2 DJs, Vinyl Woll and Max playing music of the era.
On the following night, Friday 7th December, Charlie will be in concert playing some of the most popular music from his long career. Today he's one of only a few original American rock 'n' roll stars still playing live dates. He will be supported by Graham Fenton, the lead singer of Matchbox, plus The Valley Boys and Annie May.
For more details visit www.rockinaroundtheisland.co.uk.


text:
Norristown Bud Aims for Derby Glory
Published on Tuesday, July 15th, 2014 at 11:00 am
Jackie Madigan Boylesports makes the presentation to the connections of Norristown Bud and Anton Butler (Trainer). Also included are Carl Pallas (Events Manager) and Jimmy Maguire Chairman (KPGS).
Kilcohan Park Greyhound Stadium's representative Norristown Bud is now destined for a shot at the Boylesports.com Irish Greyhound Derby after winning the 2014 Derby Trial Stakes at Kilcohan Park Greyhound Stadium on Saturday last.
The BoyleSports.com Irish Greyhound Derby is the most prestigious race in the Irish Greyhound Calendar and boasts a prize-fund of €240,000.
The Kilcohan Park Greyhound Stadium representative will now progress to the first round heats of the BoyleSports.com Irish Greyhound Derby, which begin on Thursday, August 7th in Shelbourne Park Greyhound Stadium in Dublin.
The final of this highly anticipated event will take place on Saturday 13th September 2014 and is broadcast live on RTE 2.
For the most up-to-date information on the progress through the rounds, daily updates can be read on www.igb.ie.
Other articles in 'Sports'
Stamford Bridge delight for Taylor and Adam
Blues continue to build for season opener
Waterford Ladies Football celebrate 25 years.
Hart Woe for De La Salle
Ballygunner Hurling Club –'The Chaser '
Ballinroad win the big Western Derby
Waterford FC Signings
Philip Mahony retires from inter-county hurling
Gunners Drive On
Peter Moloney is Park Hotel Supreme Sports Star 2019


GrandCentral, GoogleVoice and their new best friend, Ooma – MacCog. grease your digital wheels.
UPDATE: Google is accepting (and granting) invite applications as we speak… so if you're interested at all, click on this link to sign up to receive an invitation.
Google's as yet-unreleased "GoogleVoice" service isn't so new. I've been using it's predecessor, GrandCentral as my primary business and personal phone number for 2 years. This is a retrospective on the service and a review of the significant new features. Feel free to ask questions in the comment section and to retweet the post so more can discover this revolutionary new service.
I learned about Grand Central from David Pogue's first column about it. It was still in invite-beta so I had to scrounge an invite and quickly fell in love. The amount of groundbreaking features it had was astounding… and on April 16th, 2007 I integrated it into my business and began to give it out as my only phone number… just like they suggested.
A few times since then I've doubted the wisdom of my early adoption tendencies, especially when it comes to basic business functions like phones. I've had many problems with Grand Central over the last few years including some chronic ones recently that were so frustrating for my clients that I'm afraid I might have lost some phone calls and therefore some business from it. Several people (though not all) reported that when trying to leave a message a lady's voice cut in and asked "Are you still there?" even though they were clearly talking. It would force them to stop mid-message and either re-record or start over after pressing 4. Most people left annoyed messages at that point and suggested I fix my "machine". Well, my machine wasn't fixable because as soon as Google bought Grand Central they stopped taking suggestions or feedback and removed any sort of support options from the site… and it was free so could I complain about?
I began to worry and look into other options. Google seemed to be dropping the product, a victim of its financial belt tightening. I even went to the Google booth at Macworld and asked for someone working on Grand Central… but I'd apparently just missed them. They'd been there the day before! I did talk to a guy who was sympathetic and assured me that the 2 founders worked across the hall from him and that they were hard at work at… something. So, because nothing offered the power and simplicity of Grand Central, I continued my heavy use of the service in spite of the uncertainty and problems.
Well, on March 12th, I awoke to a happy surprise… Grand Central had been upgraded to Google Voice and was sporting all the old features and some crucial new ones. I immediately transferred over my account and began testing the new Google interface and features. Since I use my GrandCentral, er… Google Voice number for everyone, friends and family and business alike, I've tried out every feature they have and can answer questions on Twitter or in the comments section about them… but I'm going to focus on the features that have been the most interesting and/or useful for me.
First, the new SMS feature is awesome. I'm realizing now how many texts I must have missed when GrandCentral didn't support SMS because people thought they had my cell number. Oh well. Now if someone texts my GV number, I get a text from a strange number and it says their full name at the beginning of it. There seems to be one number for each person (so I attach the number to that person for future incoming reference), though I have no idea how google could be using so many numbers for just texting. The chat thread is online next to my (transcribed) voicemails, and best of all, I can reply to a text from the browser (or iPhone) if I want, saving on SMS charges.
The next great addition is transcription. Google has integrated their Goog-411 technology to my voicemails, and I love it. I can't say that the transcriptions are very accurate yet. I hope they improve a lot and quickly… but I can get the gist of a voicemail through a variety of means without having to listen to it.
Via email or SMS: GrandCentral could always send you an email or SMS when you've received a message, but now it's more than a link to the website. They don't yet include an mp3 or wav file as an attachment like Vonage or Ooma, but the transcription therein more than makes up for it.
Via google.com/voice: This is of course the most full featured option. From here I can do all kinds of fun things like review the transcript and tell Google how mildly useful it is, listen to it, download the mp3 version for posterity, add a note for my assistant, email or embed the message, or even call back the person with whichever phone I choose. The email similarities continue, though: I can delete the message, report it as spam, flag (or "star") it, etc. Never again do I have to delete that awesome drunk message from my friend or the important stuff from my clients. Now I'll have a searchable archive for voicemail just like email!
With my iPhone. Hallelujah, I can finally check my voicemail without dialing into the service like an old school VM system. Call me spoiled, but once I had Visual Voicemail on the iPhone, it seemed rather quaint and stupid to be forced to dial my own number and listen to messages one by one to get to the one I wanted, just like the old days. That was necessary because Grand Central's website was flash, their mobile site used some encoding method that wouldn't work with the iPhone, and they hadn't bothered to create an app! Well, Google still hasn't created an app (see wishlist below) but the Google Voice mobile site will thankfully play my messages via the web.
The last dynamite new addition is the Google Contact integration. One of my biggest problems with Grand Central was the fact that its address list, which allowed me to keep track of who has called me and what numbers they call from, was a one-way street. I could import my contacts from Apple's Address Book once but it became a different universe. For someone who prides himself in his clean Address Book, this was tough. Now, Google has a contact API and promising integration tools with my Macintosh Address Book that will complete this loop.
iPhone app – this is a no brainer and I imagine only a matter of time before it comes out (official public release date maybe?) but it's a barrier to usage right now. The excellent mobile site still doesn't do everything that an app could and should do… like using the built in iPhone Address Book and outgoing GV caller ID… like adding outgoing messages… like making the voicemail experience and UI as good or better than what the iPhone has built in! At least they could give the mobile site an icon… this icon is all I see.
The next step for SMS would be for google to integrate this into Google Chat somehow…. finally making SMS and IM seamless and cost effective! It would bring the multi-input power of something like Twitter to private text messaging too! Send an IM to a friend who is offline and get the option of sending it as an SMS to his grand central number instead. Receive SMS messages in your IM client and respond as normal… the possibilities are exciting.
And now… the marriage of two services that would flip my lid: Ooma meets Google Voice! If you've never heard of it, Ooma is a Vonage-like voice-over-internet (VOIP) service that is revolutionizing home phones. Instead of a monthly service like Vonage that's only marginally cheaper than traditional land lines, Ooma eliminates the monthly phone bill entirely! Yes, that's right… you get unlimited calling, cheap international rates, good voice quality, online voicemails delivered to your email and available on the web and more… for free! I've been using Ooma for a few months now and have already recommended it to some friends and family.
The biggest downside of GV is that when you call someone normally from your phone, they will see your home or cell phone as the caller ID… not your GV number. If you're truly trying to have one number to rule your life, this is a problem. You can place every call from the GV website, but that becomes too cumbersome and when you don't do it, inevitably someone calls you back on your home number or direct cell number. With Ooma, you should be able to have your GV number show up on Caller ID instead. In fact, I was excited to learn yesterday that the Ooma blog already has responded to this idea and promised to offer a GV plug-in! Good job, guys! (It requires the $99/year Ooma Premium, but that's worth it to me).
In its efforts to piggyback on Google Voice, ooma has been well served by its own long reliance on technology from Grand Central, a service Google acquired in July 2007 and the driving force behind Google Voice.
"A number of our engineers have been using Grand Central for over a year as part of our own beta test, so when Google finally released its information on Google Voice, we could see there some of the things we had already been doing with its precursor, Grand Central," Buchanan said.
I want any messages left on my home or business lines (both of which are currently managed by Ooma) to be instead in my Google Voice box and basically do away with Ooma's voicemail system entirely.
If these new features work out as well as they seem like they're going to, I will have reached phone-management nirvana… and for almost no money! Thank you, Internet!


text:
package org.conqat.lib.commons.test;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

import junit.framework.TestCase;

import org.conqat.lib.commons.filesystem.CanonicalFile;
import org.conqat.lib.commons.filesystem.FileSystemUtils;

/**
 * Base class for test cases that access test data files. This class provides a
 * simple mechanism for accessing test data files in a specified directory and
 * provides statistics on test file usage and non-usage.
 *

 * The test files a test case accesses must reside in the following location:
 *
 *

 *        test-data/<Name of the package the test case resides in>
 *

 *
 * For example if a test case is defined in package demo.test the
 * test files it accesses must be located in directory
 * test-data/demo.test.
 *
 * @author Florian Deissenboeck
 * @author $Author: kinnen $
 * @version $Rev: 41751 $
 * @ConQAT.Rating GREEN Hash: 8B0FE0996D65D7655B3253ABD9D3DD51
 */
public abstract class CCSMTestCaseBase extends TestCase {

	/** Test data directory. */
	private final static File TEST_DATA_ROOT_DIRECTORY = new File("test-data");

	/** Tmp directory. */
	private final static File TEST_TMP_ROOT_DIRECTORY = new File("test-tmp");

	/** Test data manager for this test case. */
	private final TestDataManager testDataManager = TestDataManager
			.getInstance(new File(TEST_DATA_ROOT_DIRECTORY, getClass()
					.getPackage().getName()));

	/** Tmp directory. */
	private final File tmpDirectory = new File(TEST_TMP_ROOT_DIRECTORY,
			getClass().getPackage().getName());

	/** Default constructor */
	public CCSMTestCaseBase() {
		super();
	}

	/**
	 * Constructs a test case with the given name.
	 *
	 * @param name
	 *            Name of the test method that gets called
	 */
	public CCSMTestCaseBase(String name) {
		super(name);
	}

	/**
	 * Use test file. This method does not actually access the file, so no IO
	 * exception can be raised. This method uses a {@link TestDataManager} to
	 * log access to test data files.
	 *
	 * @param filename
	 *            Name of the file
	 * @return the file.
	 */
	protected File useTestFile(String filename) {
		return testDataManager.getTestFile(filename, this);
	}

	/**
	 * Create a temporary file in a subdirectory of the test temp directory.
	 * Directories are created as needed.
	 *
	 * @param filename
	 *            name of the file
	 * @param content
	 *            content
	 * @return the file
	 * @throws IOException
	 *             if an IO exception occurrs
	 */
	protected File createTmpFile(String filename, String content)
			throws IOException {
		File file = new File(tmpDirectory, filename);
		FileSystemUtils.writeFile(file, content);
		return file;
	}

	/** Get temporary directory. */
	protected File getTmpDirectory() {
		return tmpDirectory;
	}

	/** Delete temporary directory. */
	protected void deleteTmpDirectory() {
		if (tmpDirectory.isDirectory()) {
			FileSystemUtils.deleteRecursively(tmpDirectory);
		}
	}

	/**
	 * Print report about used test files.
	 */
	protected void printUsedFiles() {
		testDataManager.printUsedFiles(new PrintWriter(System.out));
	}

	/**
	 * Print report about unused test files.
	 */
	protected void printUnusedFiles() {
		testDataManager.printUnusedFiles(new PrintWriter(System.out));
	}

	/**
	 * Print report about used and unused test files.
	 */
	protected void printStatistics() {
		printUsedFiles();
		printUnusedFiles();
	}

	/**
	 * Same as {@link #useTestFile(String)} but returns a {@link CanonicalFile}.
	 * If canonization fails, this makes the current test fail.
	 */
	protected CanonicalFile useCanonicalTestFile(String filename) {
		try {
			return new CanonicalFile(useTestFile(filename));
		} catch (IOException e) {
			fail("Problem canonizing file: " + filename + ": " + e.getMessage());
			return null;
		}
	}

	/**
	 * Same as {@link #createTmpFile(String, String)} but returns a
	 * {@link CanonicalFile}. If canonization fails, this makes the current test
	 * fail.
	 */
	protected CanonicalFile createCanonicalTmpFile(String filename,
			String content) throws IOException {
		return canonize(createTmpFile(filename, content));
	}

	/**
	 * Canonize file. If canonization fails, this makes the current test fail.
	 */
	protected CanonicalFile canonize(File file) {
		try {
			return new CanonicalFile(file);
		} catch (IOException e) {
			fail("Problem canonizing file: " + file + ": " + e.getMessage());
			return null;
		}
	}

	/** Checks if we run on a 64 bit VM */
	public static boolean is64BitVM() {
		return System.getProperty("os.arch").contains("64");
	}
}

redpajama_set_name: RedPajamaGithub


San Lorenzo Creek Watershed Map — A highly detailed map of the creeks in the watershed, available for purchase from the Oakland Museum.
San Lorenzo Shoreline — The special world of the mouth of San Lorenzo Creek.
Stream Flow — Current stream flow conditions are transmitted every few hours via satellite into U.S. Geological Survey computer systems and from there onto the Internet.
History of Land Use in San Lorenzo Creek Watershed (file is PDF).
1954 report to Congress — See the historic document that set the stage for the concrete lining of San Lorenzo Creek below Foothill Boulevard. The report has a wealth of historical detail about the creek and discussion of flooding problems.
Roberts Landing — An important 19th-century terminus for local shipping in the Bay Area, at the mouth of San Lorenzo Creek.
Mapping Lost Waters — How scientists are mapping the Bay Area's past environment.
Mapping Urban Creeks — From Coast and Ocean Magazine, spring 1997.


CM Flatbeds Have TexArmor - But What Is It?
Since last December, every truck bed produced by CM Truck Beds has been coated with the best in class primer powder and durable yet high gloss powdercoat top coat by TexArmor. Why do this? Not only does your truck bed look cleaner, sleeker, and better looking with the high gloss finish, the TexArmor coating is known for its durability and longevity. This means your truck will be more resistant to corrosion and damage from the elements than ever before. Kahn beds, Knapheide beds, PJ Trailers, Kahntec, and similar brands simply cannot compete with CM Truck beds rugged durability, value, and craftsmanship. But the craftsmanship doesnt stop when a CM Flatbed leaves the factory. When we install a CM Truck bed at Midwest Motors, we don't weld our beds on. Some other dealers and distributors do this because it saves them time. However, we bolt our beds on for a superior and longer lasting bond between the truck and your bed. Think of it this way, would you rather glue two pieces of wood together (weld) or screw them together with a power drill (bolt)? The answer should be obvious - the wood screwed together will stay put for much longer - if not indefinitely! Our powder coated CM Truck Beds not only look great with UV resistant powder coating - but will last you a long time when you choose Midwest Motors as your preferred CM Flatbed installer!


In general terms, audiovisual media are those that can be heard and seen. That is, devices that rely on images and sounds to transmit information, such as television and movies.
From its appearance in the 30's to the beginning of the 21st century, television has been the medium with the highest ratings of audiences or audiences worldwide. This is due to its characteristics as an informative tool: its immediacy in the coverage of events, the resources it uses (images, sound, presenters, recording sets) and, above all, the possibility it offers to see the facts -and its protagonists-in real time and miles away.
Even today, with the arrival of new media, television maintains its level of influence over most sectors of society, because its devices are cheap and easily accessible.
At a formal level, television proposes the use of a wide variety of formats when transmitting information. They include news, soap operas, documentaries, reports, and interviews, cultural, pedagogical and scientific programs, among others. Thanks to the accelerated technological development of the last decades of the twentieth century and the first of the 21st century, each format combines images, texts and sounds, and also raises constant contact and interaction with the audience. For all these reasons, television is currently a means of communication that, it is considered, raises a reflection on the democratic character of our societies.
The cinema has not been considered as a means of informative communication, despite having been used in this way on several occasions. It is true that its audiovisual characteristics allow it to function as a powerful message transmission platform, but the dimensions of its production and the interests of its producers have made it, until today, considered as a cultural entertainment, dedicated to the creation of stories, fiction and documentaries, of high impact and with emotional or historical significance.
Eldon Mascoll Toronto is one of best media ventures. Freedom Park's development by Eldon Mascoll slate comprises a content for corporate clients, film and television production.
However, from its appearance, at the end of the 19th century, the cinema functioned as a transmitter of informative messages. For example, in the 30s and 40s, in Nazi Germany and Fascist Italy, cinema was used as a means of propaganda: the rulers of both countries understood it as a fundamental platform to transmit to their peoples the scope of their governments. ultra-right. This generates a reflection on the possibilities of the mass media to generate imaginaries and to influence the decisions of our societies.
Radio is the only medium that is part of the media that transmit information through sound formats. Its importance lies in the fact that it is the medium that obtains information more easily and has a much simpler production process than that of television. In addition to the few requirements involved in its production, the radio does not need images to communicate, nor a large team of workers; radio journalists need only be in the scene, in addition to having a microphone and a sound booth with which the emission of the information on the air is achieved.


text:
Libya competed at the 2020 Summer Paralympics in Tokyo, Japan, from 24 August to 5 September 2021.

Taekwondo

Libya qualified one athlete to compete at the Paralympics competition. Mohamed Alsanousi Abidzar qualified by winning the gold medal at the 2020 African Qualification Tournament in Rabat, Morocco.

See also
Libya at the Paralympics
Libya at the 2020 Summer Olympics

References

Nations at the 2020 Summer Paralympics
2020
2021 in Libyan sport

redpajama_set_name: RedPajamaWikipedia


text:
Q: attaching angular dynamic component to tippy js content i am using fullcalendar(v3) event render in angular with tippy js, so how can i attach angular dynamic component to tippy js content in fullcalendar(v3) event render.
    const eventRender = function (event: IEvent, view) {
        if (event.info) {
            const factory = this._resolver.resolveComponentFactory(EventViewComponent);
            let ref;
            if (event.rendering === 'background') {
                ref = factory.create(this._injector, [], view.get(0));
            } else {
                ref = factory.create(this._injector, [], view.children('.fc-content').get(0));
            }
            ref.instance.eventInfo = event.info;
            this.dynamicComponent.push(ref);
            this._app.attachView(ref.hostView);
        }

and also i just create dynamic component and attach to event render to fullcalendar

A: html:

Caption

Some content

ts:
@ViewChild("tippyTemplate", { read: ElementRef, static: false }) tippyTemplate: ElementRef;
...
const template = this.tippyTemplate.nativeElement;

tippy(info.el, {
   content: template,
   allowHTML: true,
   hideOnClick: "toggle",
   placement: "top",
   trigger: "click",
});


text:
Tragic skyscraper plunge: Daredevil climber was planning to propose to his girlfriend the next day
By James Rogers , | Fox News
"Rooftopper" Wu Yongning. (Courtesy of Weibo)
Daredevil climber and social media star Wu Yongning, who recently plunged to his death when scaling a 62-story skyscraper, was reportedly planning to propose to his girlfriend the following day.
Citing Wu's step-uncle Feng Shengliang, The South China Morning Post reports that the 26-year-old was about to propose. "He planned to propose to his girlfriend [the day after the challenge]," Feng said. "He needed the money for the wedding, and for medical treatment for his ailing mother."
Wu, a so-called "rooftopper," had earned a huge following on social media by climbing tall buildings without safety equipment and posting vertigo-inducing selfies and videos online. Millions have watched his tragic fall from a skyscraper in the Chinese city of Changsha.
TRAGEDY AS FAMOUS DAREDEVIL CLIMBER PLUNGES TO HIS DEATH FROM WELL-KNOWN SKYSCRAPER
The climber had apparently set up a camera phone to record his doomed stunt. Graphic video has appeared online purportedly showing the 26-year-old lowering himself over the side of the Huayuan Hua Centre in Changsha. In the horrific video, Wu can be seen hanging from the top of the building before attempting to hoist himself up and apparently struggling to gain a foothold. Tragically, he soon loses his grip and falls out of the shot. The camera, which was trained on the top of the building, did not record the moment of impact.
The Sun reports that Wu fell about 45 feet onto a terrace and subsequently died.
The climber had reportedly taken an elevator up 40 floors and climbed another 20 floors to set up the stunt.
FIREFIGHTERS SLAM YOUTUBE PRANKSTER WHO 'CEMENTED' A MICROWAVE OVEN TO HIS HEAD
Artist's illustration of Huayuan Hua Centre (Wong Tong Group)
AsiaOne reports that video of the horrific incident surfaced online Dec. 10. The accident occurred Nov. 8, it said, citing a post by Wu's girlfriend on Chinese social media site Weibo.
Citing the Xiaoxiang Morning Herald, the New York Post reports that Yongning would have received about $15,000 for the stunt, although it is unclear who was offering the prize.
Wu, a former movie stuntman, had more than one million followers on Weibo, according to The Independent.
Follow James Rogers on Twitter @jamesjrogers


text:
import urllib.parse
import collections
import os
import sys
import redis

from beaker.middleware import SessionMiddleware
from JumpScale.portal.portal.MacroExecutor import MacroExecutorPage, MacroExecutorWiki, MacroExecutorPreprocess, MacroexecutorMarkDown
from JumpScale.portal.portal.RequestContext import RequestContext
from JumpScale.portal.portal.PortalRest import PortalRest
from JumpScale.portal.portal.MongoEngineBeaker import MongoEngineBeaker
from JumpScale.portal.portal.MinimalBeaker import MinimalBeaker
from JumpScale.portal.portal import exceptions
from JumpScale.portal.portal.auth import AuditMiddleWare

from JumpScale.portal.portalloaders.SpaceWatcher import SpaceWatcher
from JumpScale.portal.html import multipart

from JumpScale import j
from gevent.pywsgi import WSGIServer
import gevent
import time

import urllib.request
import urllib.parse
import urllib.error
import cgi
from JumpScale.portal.portal.PortalAuthenticatorGitlab import PortalAuthenticatorGitlab
from JumpScale.portal.portal.PortalAuthenticatorMinimal import PortalAuthenticatorMinimal
from JumpScale.portal.portal.PortalAuthenticatorMongoEngine import PortalAuthenticatorMongoEngine
from JumpScale.portal.portal.PortalTemplate import PortalTemplate
from JumpScale.portal.portal.PageProcessor import PageProcessor

from flask.ext.bootstrap import Bootstrap
from werkzeug.wsgi import DispatcherMiddleware
from flask import render_template

def exhaustgenerator(func):
    def wrapper(self, env, start_response):
        try:
            result = func(self, env, start_response)
        except exceptions.BaseError as e:
            start_response("%s %s" % (e.code, e.status), e.headers)
            return [e.msg.encode('utf-8')]
        if isinstance(result, str):
            return [j.data.text.toStr(result).encode('utf-8')]
        elif isinstance(result, collections.Iterable):
            def exhaust():
                for value in result:
                    if not isinstance(value, bytes):
                        value = value.encode('utf-8')
                    yield value
            return exhaust()
        elif not result:
            return [''.encode('utf-8')]
        else:
            return result.encode('utf-8')
    return wrapper

class PortalServer:

    # INIT
    def __init__(self):

        self.hrd = j.application.instanceconfig

        self.contentdirs = list()
        self.libpath = j.portal.tools.html.getHtmllibDir()
        self.started = False
        self.epoch = time.time()
        self.force_oauth_url = None
        self.cfg = self.hrd.getDictFromPrefix('param.cfg')
        self.force_oauth_instance = self.cfg.get('force_oauth_instance', "")
        j.application.debug = self.hrd.getBool("debug", False)
        j.portal.server.active = self

        self.watchedspaces = []
        self.pageKey2doc = {}
        self.routes = {}
        self.proxies = {}

        self.authentication_method = self.cfg.get("authentication.method")
        session_opts = {
            'session.cookie_expires': False,
            'session.data_dir': '%s' % j.sal.fs.joinPaths(j.dirs.varDir, "beakercache")
        }

        # TODO change that to work with ays instance config instead of connection string
        connection = self.hrd.getDict('param.mongoengine.connection')
        self.port = connection.get('port', None)

        if not self.authentication_method:
            minimalsession = {
                'session.type': 'MinimalBeaker',
                'session.namespace_class': MinimalBeaker,
                'session.namespace_args': {'client': None}
            }
            session_opts.update(minimalsession)
            self.auth = PortalAuthenticatorMinimal()
        else:
            if self.authentication_method == 'gitlab':
                self.auth = PortalAuthenticatorGitlab(instance=self.gitlabinstance)
            else:
                j.data.models.system.connect2mongo(connection['host'], port=int(connection['port']))

                mongoenginesession = {
                    'session.type': 'MongoEngineBeaker',
                    'session.namespace_class': MongoEngineBeaker,
                    'session.namespace_args': {}
                }
                session_opts.update(mongoenginesession)
                self.auth = PortalAuthenticatorMongoEngine()

        self.pageprocessor = PageProcessor()

        self.loadConfig()

        macroPathsPreprocessor = ["macros/preprocess"]
        macroPathsWiki = ["macros/wiki"]
        macroPathsPage = ["macros/page"]
        macroPathsMarkDown = ["macros/markdown"]

        self.macroexecutorPreprocessor = MacroExecutorPreprocess(macroPathsPreprocessor)
        self.macroexecutorPage = MacroExecutorPage(macroPathsPage)
        self.macroexecutorMarkDown = MacroexecutorMarkDown(macroPathsMarkDown)
        self.macroexecutorWiki = MacroExecutorWiki(macroPathsWiki)
        templatedirs = [self.portaldir.joinpath('templates'), self.appdir.joinpath('templates')]
        self.templates = PortalTemplate(templatedirs)
        self.bootstrap()

        self._router = SessionMiddleware(AuditMiddleWare(self.router), session_opts)

        # self._megarouter = DispatcherMiddleware(self._router, {'/eve': eve_app})
        self._megarouter = DispatcherMiddleware(self._router)

        self._webserver = WSGIServer((self.listenip, self.port), self._megarouter)

        self.confluence2htmlconvertor = j.portal.tools.docgenerator.getConfluence2htmlConvertor()
        self.activejobs = list()
        self.jobids2greenlets = dict()

        self.schedule1min = {}
        self.schedule15min = {}
        self.schedule60min = {}

        self.rediscache = redis.StrictRedis(host='localhost', port=9999, db=0)
        self.redisprod = redis.StrictRedis(host='localhost', port=9999, db=0)

        self.jslibroot = j.sal.fs.joinPaths(j.dirs.appDir, "portals", "jslib")

        #  Load local spaces
        self.rest = PortalRest(self)
        self.spacesloader = j.portalloader.getSpacesLoader()
        self.loadSpaces()
        # let's roll

    def loadConfig(self):

        def replaceVar(txt):
            # txt = txt.replace("$base", j.dirs.base).replace("\\", "/")
            txt = txt.replace("$appdir", j.sal.fs.getcwd()).replace("\\", "/")
            txt = txt.replace("$vardir", j.dirs.varDir).replace("\\", "/")
            txt = txt.replace("$htmllibdir", j.portal.tools.html.getHtmllibDir()).replace("\\", "/")
            txt = txt.replace("\\", "/")
            return txt

        # INIT FILE
        self.portaldir = j.tools.path.get('.').getcwd()

        self.appdir = replaceVar(self.cfg.get("appdir", self.portaldir))
        self.appdir = j.tools.path.get(self.appdir.replace("$base", j.dirs.base))

        self.getContentDirs()  # contentdirs need to be loaded before we go to other dir of base server
        self.appdir.chdir()

        self.listenip = self.cfg.get('listenip', '0.0.0.0')
        self.port = int(self.cfg.get("port", 82))
        self.addr = self.cfg.get("pubipaddr", '127.0.0.1')
        self.secret = self.cfg.get("secret")
        self.admingroups = self.cfg.get("admingroups", [])

        self.filesroot = j.tools.path.get(replaceVar(self.cfg.get("filesroot")))
        self.filesroot.makedirs_p()
        self.pageprocessor.defaultspace = self.cfg.get('defaultspace', 'welcome')
        self.pageprocessor.defaultpage = self.cfg.get('defaultpage', '')

        self.gitlabinstance = self.cfg.get("gitlab.connection")

        self.getContentDirs()

        # load proxies
        for _, proxy in self.hrd.getDictFromPrefix('param.cfg.proxy').items():
            print('loading proxy', proxy)
            self.proxies[proxy['path']] = proxy

    def reset(self):
        self.routes = {}
        self.loadConfig()
        self.bootstrap()
        j.core.codegenerator.resetMemNonSystem()
        j.core.specparser.resetMemNonSystem()
        # self.actorsloader.scan(path=self.contentdirs,reset=True) #do we need to load them all
        self.bucketsloader = j.portalloader.getBucketsLoader()
        self.loadSpaces()

    def bootstrap(self):
        self.actors = {}  # key is the applicationName_actorname (lowercase)
        self.actorsloader = j.portalloader.getActorsLoader()
        self.app_actor_dict = {}
        self.taskletengines = {}
        self.actorsloader.reset()
        # self.actorsloader._generateLoadActor("system", "contentmanager", actorpath="%s/apps/portalbase/system/system__contentmanager/"%j.dirs.base)
        # self.actorsloader._generateLoadActor("system", "master", actorpath="system/system__master/")
        # self.actorsloader._generateLoadActor("system", "usermanager", actorpath="system/system__usermanager/")
        self.actorsloader.scan(self.contentdirs)

        if self.authentication_method:
            self.actorsloader.getActor("system", "contentmanager")
            self.actorsloader.getActor("system", "usermanager")

    def deleteSpace(self, spacename):
        self.loadSpaces()
        spacename = spacename.lower()
        if spacename in self.spacesloader.spaces:
            space = self.spacesloader.spaces.pop(spacename)
            space.deleteOnDisk()
        else:
            raise RuntimeError("Could not find space %s to delete" % spacename)

    def loadSpaces(self):

        self.bucketsloader = j.portalloader.getBucketsLoader()
        self.spacesloader = j.portalloader.getSpacesLoader()
        self.bucketsloader.scan(self.contentdirs)

        self.spacesloader.scan(self.contentdirs)

        if self.authentication_method:
            if "system" not in self.spacesloader.spaces:
                raise RuntimeError("could not find system space")

    def getContentDirs(self):
        """
        walk over known content dirs & execute loader on it
        """
        contentdirs = self.cfg.get('contentdirs', '')

        def append(path):
            path = j.tools.path.get(path).normpath()
            if path not in self.contentdirs:
                self.contentdirs.append(path)

        paths = contentdirs.split(",")

        # add own base path
        self.basepath = j.tools.path.get(self.portaldir.joinpath("base"))
        self.basepath.makedirs_p()
        append(self.basepath)

        paths.append(self.basepath)
        paths = list(set(paths))
        for path in paths:
            path = path.strip()
            if path == "" or path[0] == "#":
                continue
            path = path.replace("\\", "/")
            if path.find(":") == -1:
                if path not in self.watchedspaces:
                    SpaceWatcher(path)
            append(path)

        # add base path of parent portal
        if self.authentication_method:
            appdir = self.appdir
            append(appdir.joinpath("wiki"))
            append(appdir.joinpath("system"))

    def unloadActorFromRoutes(self, appname, actorname):
        for key in list(self.routes.keys()):
            appn, actorn, remaining = key.split("_", 2)
            # print appn+" "+appname+" "+actorn+" "+actorname
            if appn == appname and actorn == actorname:
                self.routes.pop(key)

# USER RIGHTS

    def getAccessibleLocalSpacesForGitlabUser(self, gitlabspaces):
        """
        Return Local Spaces (Non Gitlab Spaces) with guest permissions set to READ or higher
        """
        spaces = {}
        localspaces = [x.model.id.lower() for x in list(self.spacesloader.spaces.values()) if x not in gitlabspaces]
        for space in localspaces:
            rights = ''
            spaceobject = self.spacesloader.spaces.get(space)
            for groupuser in ["guest", "guests"]:
                if groupuser in spaceobject.model.acl:
                    r = spaceobject.model.acl[groupuser]
                    if r == "*":
                        rights = "rwa"
                    else:
                        rights = r
            if 'r' in rights or '*' in rights:
                spaces[space] = rights
        return spaces

    def getUserSpaces(self, ctx):
        if not hasattr(ctx, 'env') or "user" not in ctx.env['beaker.session']:
            return []
        username = ctx.env['beaker.session']["user"]
        spaces = self.auth.getUserSpaces(username, spaceloader=self.spacesloader)

        # In case of gitlab, we want to get the local spaces tha user has access to
        if self.authentication_method == 'gitlab':
            spaces += list(self.getAccessibleLocalSpacesForGitlabUser(spaces).keys())

        else:
            result = []
            for s in spaces:
                rights = self.getUserSpaceRights(ctx, s)
                if 'r' in rights[1] or '*' in rights:
                    result.append(s)
            spaces = result
        return list(set(spaces))

    def getUserSpacesObjects(self, ctx):
        """
        Only used in gitlab
        """
        if hasattr(ctx, 'env') and "user" in ctx.env['beaker.session']:
            username = ctx.env['beaker.session']["user"]
            if self.authentication_method == 'gitlab':
                gitlabobjects = self.auth.getUserSpacesObjects(username)
                keys = [x['name'] for x in gitlabobjects]
                for name in self.getAccessibleLocalSpacesForGitlabUser(keys):
                    if username in name and name.replace("%s_" % username, '') in keys:
                        continue
                    gitlabobjects.append({'name': name, 'namespace': {'name': ''}})
                return gitlabobjects

    def getSpaceLinks(self, ctx):
        if self.authentication_method == 'gitlab':
            spaces = {}
            for s in self.getUserSpacesObjects(ctx):
                if s['namespace']['name']:
                    spaces[s['name']] = "%s_%s" % (s['namespace']['name'], s['name'])
                else:
                    spaces[s['name']] = "/%s" % s['name']
        else:
            spaces = {}
            for spaceid in self.getUserSpaces(ctx):
                space = self.getSpace(spaceid, ignore_doc_processor=True)
                if space.model.hidden:
                    continue
                spaces[space.model.name] = "/%s" % spaceid
        return spaces

    def getNonClonedGitlabSpaces(self, ctx):
        """
        Return Gitlab spaces that are not (YET) cloned into local filesystem
        This is helpful to identify non-existing spaces, so that system can disable
        access to them until cloning is finished.

        @param ctx: Context
        """
        if not self.authentication_method == 'gitlab':
            raise RuntimeError("This function only works with gitlab authentication")

        if not hasattr(ctx, 'env') and "user" in ctx.env['beaker.session']:
            return []
        username = ctx.env['beaker.session']["user"]

        clonedspaces = set([s.model.id[s.model.id.index('portal_'):]
                            for s in list(self.spacesloader.spaces.values()) if 'portal_' in s.model.id])
        gitlabspaces = set([s[s.index('portal_'):]
                            for s in self.auth.getUserSpaces(username, spaceloader=self.spacesloader)])
        return gitlabspaces.difference(clonedspaces)

    def getUserSpaceRights(self, ctx, space):
        spaceobject = self.spacesloader.spaces.get(space)

        if hasattr(ctx, 'env') and "user" in ctx.env['beaker.session']:
            username = ctx.env['beaker.session']["user"]
        else:
            return "", ""

        if self.isAdminFromCTX(ctx):
            return username, 'rwa'

        if self.authentication_method == 'gitlab':
            gitlabspaces = self.auth.getUserSpaces(username, spaceloader=self.spacesloader)
            localspaceswithguestaccess = self.getAccessibleLocalSpacesForGitlabUser(gitlabspaces)
            if space in localspaceswithguestaccess:
                return username, localspaceswithguestaccess[space]

        username, rights = self.auth.getUserSpaceRights(username, space, spaceobject=spaceobject)

        return username, rights

    def getUserFromCTX(self, ctx):
        user = ctx.env["beaker.session"].get('user')
        return user or "guest"

    def getGroupsFromCTX(self, ctx):
        user = self.getUserFromCTX(ctx)
        if user:
            groups = self.auth.getGroups(user)
            return [str(item.lower()) for item in groups]
        else:
            return []

    def isAdminFromCTX(self, ctx):
        usergroups = set(self.getGroupsFromCTX(ctx))
        admingroups = set(self.admingroups)
        return bool(admingroups.intersection(usergroups))

    def isLoggedInFromCTX(self, ctx):
        user = self.getUserFromCTX(ctx)
        if user != "" and user != "guest":
            return True
        return False

# router

    def startSession(self, ctx, path):
        session = ctx.env['beaker.session']
        if 'user_login_' in ctx.params and ctx.params.get('user_login_') == 'guest' and self.force_oauth_instance:
            location = '%s?%s' % ('/restmachine/system/oauth/authenticate',
                                  urllib.parse.urlencode({'type': self.force_oauth_instance}))
            raise exceptions.Redirect(location)

        # Already logged in user can't access login page again
        if 'user_logoff_' not in ctx.params and path.endswith(
                'system/login') and 'user' in session and session['user'] != 'guest':
            ctx.start_response('204', [])
            return False, []

        if "authkey" in ctx.params:
            # user is authenticated by a special key
            key = ctx.params["authkey"]

            # check if authkey is a session
            newsession = session.get_by_id(key)
            if newsession:
                session = newsession
                ctx.env['beaker.session'] = session
            elif key == self.secret:
                session['user'] = 'admin'
                session.save()
            else:
                username = self.auth.getUserFromKey(key)
                if username != "guest":
                    session['user'] = username
                    session.save()
                else:
                    ctx.start_response('419 Authentication Timeout', [])
                    return False, [self.pageprocessor.returnDoc(
                        ctx, ctx.start_response, "system", "accessdenied", extraParams={"path": path})]

        oauth_logout_url = ''
        if "user_logoff_" in ctx.params and not "user_login_" in ctx.params:
            if session.get('user', '') not in ['guest', '']:
                # If user session is oauth session and logout url is provided, redirect user to that URL
                # after deleting session which will invalidate the oauth server session
                # then redirects user back to where he was in portal
                oauth = session.get('oauth')
                oauth_logout_url = ''
                if oauth:
                    oauth_logout_url = oauth.get('logout_url')
                session.delete()
                session = ctx.env['beaker.get_session']()
                ctx.env['beaker.session'] = session
            session['user'] = 'guest'
            session.save()
            if oauth_logout_url:
                backurl = urllib.parse.urljoin(ctx.env['HTTP_REFERER'], ctx.env['PATH_INFO'])
                ctx.start_response('302 Found', [('Location', '%s?%s' % (
                    str(oauth_logout_url), str(urllib.parse.urlencode({'redirect_uri': backurl}))))])
                return False, session
            return True, session

        if "user_login_" in ctx.params:
            # user has filled in his login details, this is response on posted info
            name = ctx.params['user_login_']
            if 'passwd' not in ctx.params:
                secret = ""
            else:
                secret = ctx.params['passwd']
            if self.auth.authenticate(name, secret):
                session['user'] = name
                session['auth_method'] = self.authentication_method

                session.save()
                # user is loging in from login page redirect him to home
                if path.endswith('system/login'):
                    status = '302'
                    headers = [
                        ('Location', "/"),
                    ]
                    ctx.start_response(status, headers)
                    return False, [""]
            else:
                session['user'] = ""
                session.save()
                return False, [self.pageprocessor.returnDoc(
                    ctx, ctx.start_response, "system", "login", extraParams={"path": path})]

        if "user" not in session or session["user"] == "":
            session['user'] = "guest"
            session.save()

        return True, session

    def _getParamsFromEnv(self, env, ctx):
        params = urllib.parse.parse_qs(env["QUERY_STRING"], 1)

        def simpleParams(params):
            # HTTP parameters can be repeated multiple times, i.e. in case of using <select multiple>
            # Example: a=1&b=2&a=3
            #
            # urlparse.parse_qs returns a dictionary of names & list of values. Then it's simplified
            # for lists with only a single element, e.g.
            #
            #   {'a': ['1', '3'], 'b': ['2']}
            #
            # simplified to be
            #
            #   {'a': ['1', '3'], 'b': '2'}
            return dict(((j.data.text.toStr(k), [j.data.text.toStr(vi) for vi in v]) if len(v) > 1 else (
                j.data.text.toStr(k), j.data.text.toStr(v[0]))) for k, v in list(params.items()))

        def hasSupportedContentType(contenttype, supportedcontenttypes):
            for supportedcontenttype in supportedcontenttypes:
                if contenttype.find(supportedcontenttype) != -1:
                    return True

        params = simpleParams(params)

        contentype = env.get('CONTENT_TYPE', '')
        pragma = env.get('HTTP_PRAGMA', '')
        if 'stream' not in pragma and env["REQUEST_METHOD"] in ("POST", "PUT") and hasSupportedContentType(
                contentype, ('application/json', 'www-form-urlencoded', 'multipart/form-data', '')):
            if contentype.find("application/json") != -1:
                postData = env["wsgi.input"].read()
                if postData.strip() == "":
                    return params
                postParams = j.data.serializer.serializers.getSerializerType('j').loads(postData)
                if postParams:
                    params.update(postParams)
                return params
            elif contentype.find("www-form-urlencoded") != -1:
                postData = env["wsgi.input"].read()
                if postData.strip() == "":
                    return params
                params.update(dict(urllib.parse.parse_qs(postData, 1)))
                for key, val in params.items():
                    if isinstance(key, str) and isinstance(val, str):
                        continue
                    else:
                        params.pop(key)
                        params.update(simpleParams({key: val}))
                return params
            elif contentype.find("multipart/form-data") != -1 and env.get('HTTP_TRANSFER_ENCODING') != 'chunked':
                forms, files = multipart.parse_form_data(ctx.env)
                params.update(forms)
                for key, value in list(files.items()):
                    params.setdefault(key, dict())[value.filename] = value.file
            elif env.get('HTTP_TRANSFER_ENCODING') == 'chunked':
                from JumpScale.portal.html.multipart2.multipart import parse_options_header
                content_type, parameters = parse_options_header(env.get('CONTENT_TYPE'))
                boundary = parameters.get(b'boundary')
                inp = env.get('wsgi.input')
                params.update({'FILES': {'data': inp, 'boundary': boundary}})
        return params

    @exhaustgenerator
    def router(self, environ, start_response):
        path = environ["PATH_INFO"].lstrip("/")
        print(("path:%s" % path))
        pathparts = path.split('/')
        if pathparts[0] == 'wiki':
            pathparts = pathparts[1:]

        if path.find("favicon.ico") != -1:
            return self.pageprocessor.processor_page(environ, start_response, self.filesroot, "favicon.ico", prefix="")

        ctx = RequestContext(application="", actor="", method="", env=environ,
                             start_response=start_response, path=path, params=None)
        ctx.params = self._getParamsFromEnv(environ, ctx)
        ctx.env['JS_CTX'] = ctx

        for proxypath, proxy in self.proxies.items():
            if path.startswith(proxypath.lstrip('/')):
                return self.pageprocessor.process_proxy(ctx, proxy)

        if path.find("jslib/") == 0:
            path = path[6:]
            user = "None"
            # self.pageprocessor.log(ctx, user, path)
            return self.pageprocessor.processor_page(environ, start_response, self.jslibroot, path, prefix="jslib/")

        if path.find("images/") == 0:
            space, image = pathparts[1:3]
            spaceObject = self.getSpace(space)
            image = image.lower()

            if image in spaceObject.docprocessor.images:
                path2 = j.tools.path.get(spaceObject.docprocessor.images[image])

                return self.pageprocessor.processor_page(
                    environ, start_response, path2.dirname(), path2.basename(), prefix="images")
            ctx.start_response('404', [])

        if path.find("files/specs/") == 0:
            path = path[6:]
            user = "None"
            self.pageprocessor.log(ctx, user, path)
            return self.pageprocessor.processor_page(environ, start_response, self.filesroot, path, prefix="files/")

        if path.find(".files") != -1:
            user = "None"
            self.pageprocessor.log(ctx, user, path)
            space = pathparts[0].lower()
            path = "/".join(pathparts[2:])
            sploader = self.spacesloader.getSpaceFromId(space)
            filesroot = j.tools.path.get(sploader.model.path).joinpath(".files")
            return self.pageprocessor.processor_page(environ, start_response, filesroot, path, prefix="")

        if path.find(".static") != -1:
            user = "None"
            self.pageprocessor.log(ctx, user, path)
            space, pagename = self.pageprocessor.path2spacePagename(path)
            space = pathparts[0].lower()
            path = "/".join(pathparts[2:])
            sploader = self.spacesloader.getSpaceFromId(space)
            filesroot = j.tools.path.get(sploader.model.path).joinpath(".static")

            return self.pageprocessor.processor_page(
                environ, start_response, filesroot, path, prefix="", includedocs=True, ctx=ctx, space=space)

        # user is logged in now
        is_session, session = self.startSession(ctx, path)
        if not is_session:
            return session
        user = session['user']
        match = pathparts[0]
        path = ""
        if len(pathparts) > 1:
            path = "/".join(pathparts[1:])

        if match == "restmachine":
            return self.rest.processor_rest(environ, start_response, path, human=False, ctx=ctx)

        elif match == "elfinder":
            return self.pageprocessor.process_elfinder(path, ctx)

        elif match == "restextmachine":
            if not self.authentication_method:
                try:
                    j.clients.osis.getByInstance(self.hrd.get('instance', 'main'))
                except Exception as e:
                    self.pageprocessor.raiseError(
                        ctx,
                        msg="You have a minimal portal with no OSIS configured",
                        msginfo="",
                        errorObject=None,
                        httpcode="500 Internal Server Error")
            return self.rest.processor_restext(environ, start_response, path, human=False, ctx=ctx)

        elif match == "rest":
            space, pagename = self.pageprocessor.path2spacePagename(path.strip("/"))
            self.pageprocessor.log(ctx, user, path, space, pagename)
            return self.rest.processor_rest(environ, start_response, path, ctx=ctx)

        elif match == "restext":
            space, pagename = self.pageprocessor.path2spacePagename(path.strip("/"))
            self.pageprocessor.log(ctx, user, path, space, pagename)
            return self.rest.processor_restext(environ, start_response, path,
                                               ctx=ctx)
        elif match == "ping":
            status = '200 OK'
            headers = [
                ('Content-Type', "text/html"),
            ]
            start_response(status, headers)
            return ["pong"]

        elif match == "files":
            self.pageprocessor.log(ctx, user, path)
            return self.pageprocessor.processor_page(environ, start_response, self.filesroot, path, prefix="files")

        elif match == "specs":
            return self.pageprocessor.processor_page(environ, start_response, "specs", path, prefix="specs")

        elif match == "appservercode":
            return self.pageprocessor.processor_page(
                environ, start_response, "code", path, prefix="code", webprefix="appservercode")

        elif match == "lib":
            # print self.libpath
            return self.pageprocessor.processor_page(environ, start_response, self.libpath, path, prefix="lib")

        elif match == 'render':
            return self.render(environ, start_response)

        else:
            path = '/'.join(pathparts)
            ctx.params["path"] = '/'.join(pathparts)
            space, pagename = self.pageprocessor.path2spacePagename(path)
            self.pageprocessor.log(ctx, user, path, space, pagename)
            pagestring = str(self.pageprocessor.returnDoc(ctx, start_response, space, pagename, {}))
            return [pagestring]

    def render(self, environ, start_response):
        path = environ["PATH_INFO"].lstrip("/")
        query_string = environ["QUERY_STRING"].lstrip("/")
        params = cgi.parse_qs(query_string)
        content = params.get('content', [''])[0]
        space = params.get('render_space', None)
        if space:
            space = space[0]
        else:
            start_response('200 OK', [('Content-Type', "text/html")])
            return 'Parameter "space" not supplied'

        doc = params.get('render_doc', None)
        if doc:
            doc = doc[0]
        else:
            start_response('200 OK', [('Content-Type', "text/html")])
            return 'Parameter "doc" not supplied'

        ctx = RequestContext(application="", actor="", method="", env=environ,
                             start_response=start_response, path=path, params=None)
        ctx.params = self._getParamsFromEnv(environ, ctx)

        doc, _ = self.pageprocessor.getDoc(space, doc, ctx)

        doc = doc.copy()
        doc.source = content
        doc.loadFromSource()
        doc.preprocess()

        content, doc = doc.executeMacrosDynamicWiki(ctx=ctx)

        page = self.confluence2htmlconvertor.convert(
            content,
            doc=doc,
            requestContext=ctx,
            page=self.pageprocessor.getpage(),
            paramsExtra=ctx.params)

        if not 'postprocess' in page.processparameters or page.processparameters['postprocess']:
            page.body = page.body.replace("$$space", space)
            page.body = page.body.replace("$$page", doc.original_name)
            page.body = page.body.replace("$$path", doc.path)
            page.body = page.body.replace("$$querystr", ctx.env['QUERY_STRING'])

        page.body = page.body.replace("$$$menuright", "")

        if "todestruct" in doc.__dict__:
            doc.destructed = True

        start_response('200 OK', [('Content-Type', "text/html")])
        return str(page)

    def addRoute(self, function, appname, actor, method, params, description="", auth=True, returnformat=None):
        """
        @param function is the function which will be called as follows: function(webserver,path,params):
            function can also be a string, then only the string will be returned
            if str=='taskletengine' will directly call the taskletengine e.g. for std method calls from actors
        @appname e.g. system is 1e part of url which is routed http://localhost/appname/actor/method/
        @actor e.g. system is 2nd part of url which is routed http://localhost/appname/actor/method/
        @method e.g. "test" is part of url which is routed e.g. http://localhost/appname/actor/method/
        @auth is for authentication if false then there will be no auth key checked

        example function called

            def test(self,webserver,path,params):
                return 'hello world!!'

            or without the self in the functioncall (when no class method)

            what you return is being send to the browser

        example call: http://localhost:9999/test?key=1234&color=dd&name=dd

        """

        appname = appname.replace("_", ".")
        actor = actor.replace("_", ".")
        method = method.replace("_", ".")
        self.app_actor_dict["%s_%s" % (appname, actor)] = 1

        methoddict = {'get': 'GET', 'set': 'PUT', 'new': 'POST', 'delete': 'DELETE',
                      'find': 'GET', 'list': 'GET', 'datatables': 'GET', 'create': 'POST'}
        route = {
            'func': function,
            'params': params,
            'description': description,
            'auth': auth,
            'returnformat': returnformat}
        self.routes["%s_%s_%s_%s" % ('GET', appname, actor, method)] = route

# SCHEDULING

    def _timer(self):
        """
        will remember time every 0.5 sec
        """
        lfmid = 0
        while True:
            self.epoch = int(time.time())
            if lfmid < self.epoch - 200:
                lfmid = self.epoch
                self.fiveMinuteId = j.data.time.get5MinuteId(self.epoch)
                self.hourId = j.data.time.getHourId(self.epoch)
                self.dayId = j.data.time.getDayId(self.epoch)
            gevent.sleep(0.5)

    def _minRepeat(self):
        while True:
            gevent.sleep(5)
            for key in list(self.schedule1min.keys()):
                item, args, kwargs = self.schedule1min[key]
                item(*args, **kwargs)

    def _15minRepeat(self):
        while True:
            gevent.sleep(60 * 15)
            for key in list(self.schedule15min.keys()):
                item, args, kwargs = self.schedule15min[key]
                item(*args, **kwargs)

    def _60minRepeat(self):
        while True:
            gevent.sleep(60 * 60)
            for key in list(self.schedule60min.keys()):
                item, args, kwargs = self.schedule60min[key]
                item(*args, **kwargs)

    def getNow(self):
        return self.epoch

    def addSchedule1MinPeriod(self, name, method, *args, **kwargs):
        self.schedule1min[name] = (method, args, kwargs)

    def addSchedule15MinPeriod(self, name, method, *args, **kwargs):
        self.schedule15min[name] = (method, args, kwargs)

    def addSchedule60MinPeriod(self, name, method, *args, **kwargs):
        self.schedule60min[name] = (method, args, kwargs)

# START-STOP / get spaces/actors/buckets / addgreenlet

    def start(self):
        """
        Start the web server, serving the `routes`. When no `routes` dict is passed, serve a single 'test' route.

        This method will block until an exception stops the server.

        @param routes: routes to serve, will be merged with the already added routes
        @type routes: dict(string, list(callable, dict(string, string), dict(string, string)))
        """

        TIMER = gevent.greenlet.Greenlet(self._timer)
        TIMER.start()

        S1 = gevent.greenlet.Greenlet(self._minRepeat)
        S1.start()

        S2 = gevent.greenlet.Greenlet(self._15minRepeat)
        S2.start()

        S3 = gevent.greenlet.Greenlet(self._60minRepeat)
        S3.start()

        j.tools.console.echo("webserver started on port %s" % self.port)
        self._webserver.serve_forever()

    def stop(self):
        self._webserver.stop()

    def getSpaces(self):
        return list(self.spacesloader.id2object.keys())

    def getBuckets(self):
        return list(self.bucketsloader.id2object.keys())

    def getActors(self):
        return list(self.actorsloader.id2object.keys())

    def getSpace(self, name, ignore_doc_processor=False):

        name = name.lower()
        if name not in self.spacesloader.spaces:
            raise RuntimeError("Could not find space %s" % name)
        space = self.spacesloader.spaces[name]
        return space

    def getBucket(self, name):
        if name not in self.bucketsloader.buckets:
            raise RuntimeError("Could not find bucket %s" % name)
        bucket = self.bucketsloader.buckets(name)
        return bucket

    def addGreenlet(self, appName, greenlet):
        """
        """
        greenletObject = greenlet()
        if greenletObject.method == "":
            raise RuntimeError("greenlet class needs to have a method")
        if greenletObject.actor == "":
            raise RuntimeError("greenlet class needs to have a actor")

        greenletObject.server = self
        self.addRoute(function=greenletObject.wscall,
                      appname=appName,
                      actor=greenletObject.actor,
                      method=greenletObject.method,
                      paramvalidation=greenletObject.paramvalidation,
                      paramdescription=greenletObject.paramdescription,
                      paramoptional=greenletObject.paramoptional,
                      description=greenletObject.description, auth=greenletObject.auth)

    def restartInProcess(self, app):
        import fcntl
        args = sys.argv[:]
        args.insert(0, sys.executable)
        apppath = j.sal.fs.joinPaths(j.dirs.appDir, app)
        max_fd = 1024
        for fd in range(3, max_fd):
            try:
                flags = fcntl.fcntl(fd, fcntl.F_GETFD)
            except IOError:
                continue
            fcntl.fcntl(fd, fcntl.F_SETFD, flags | fcntl.FD_CLOEXEC)
        os.chdir(apppath)
        os.execv(sys.executable, args)

    def __str__(self):
        out = ""
        for key, val in list(self.__dict__.items()):
            if key[0] != "_" and key not in ["routes"]:
                out += "%-35s :  %s\n" % (key, val)
        routes = ",".join(list(self.routes.keys()))
        out += "%-35s :  %s\n" % ("routes", routes)
        items = sorted(out.split("\n"))
        out = "portalserver:" + "\n".join(items)
        return out

    __repr__ = __str__


Perth and Kinross Council have recently given approval to a planning application for a 40 cover restaurant in the Old Post Office building.
All plant or equipment shall be so enclosed, attenuated and/or maintained such that any noise therefrom shall not exceed Noise Rating 35 between 0700 and 2300 hours daily, or Noise Rating 20 between 2300 and 0700 hours daily, within any neighbouring residential property, with all windows slightly open, when measured and/ or calculated and plotted on a rating curve chart.
Servicing of and deliveries to the premises shall be carried out between 0700 and 1900 Monday to Saturday only, with no servicing or deliveries permitted on Sundays.
The applicant is Milano Glasgow who currently operate a steak/pizza/pasta restaurant in Cumbernauld.


A European court has handed down a landmark decision that would expand the privacy rights of individuals while making life a lot more difficult for Internet giants such as Google.
The Court of Justice of the European Union ruled in the "right to be forgotten" case that people are entitled to have certain information about them removed from search engine results and websites. Companies such as Google, Facebook and Wikipedia would have to adjust their operations in Europe to comply with the decision.
Executives at the Internet giants were shocked by the ruling, which could mean having to deal with thousands of requests from those wanting information deleted.
"If you really dig into it, it doesn't make a lot of sense. They're asking Google... you can complain about something and just say it's irrelevant, and Google has to make some kind of a determination about that," he told BBC Radio 5.
Wales proclaimed the ruling "isn't going to stand for very long." However, the ruling is final and can't be appealed, according to the Los Angeles Times. Others praised the court for putting privacy rights above the freedom-of-speech arguments put forth by Google, which was the defendant in the case.
The ruling does not apply outside the European Union. But both sides said it could lead to major changes in privacy policies elsewhere, including the U.S.
The case originated with Costeja González of Spain, who wanted an old auction notice from the 1990s showing his repossessed home removed from search results. He said he had repaid the debt and didn't want the embarrassing episode to haunt him online for the rest of his life.
If Google or others fail to comply with the requests, individuals can take their case to "competent authorities," which the court did not spell out.
Internet companies will have to quickly create mechanisms for dealing with those who request that their information be removed. Google already performs this service, but the burden of proof is on the person wanting the information taken down.


text:
Castles Board Game
Combine THREE
Shop List Pro
All Capitals of the World
107 Park Street, Manchester, M27 4UN, UK
info@bartsappstore.com
None of our apps have any connection to the games "Carcassonne" or "SET". Neither Klaus-Jürgen Wrede nor Hans im Glück Verlag GmbH have issued any licence or approval of the use of the game "Carcassonne". SET Enterprises have not issued any licence or approval of the use of the game "SET". Parties stated above are not related nor responsible for the contents of any of our apps.
Our all-time best seller!
Castles Board Game is a very addictive tile based board game. In the game players try to build castles, roads and churches to earn points. But the resources are limited! You need your peasants to make sure you score points. When the tiles run out, the player with the highest score wins the game.
Are you unsure about how one of our apps works, or would you like to read the game rules again?
A challenging card game where you combine three cards, based on the color, shape, shading and number of shapes. A combination is valid if each of these four features are all the same or all different.
A simple game where you fill a 12x12 square with blocks of different shapes and sizes. Have fun, score points and beat the scores of your friends in Game Center!.
All our apps are available on the iTunes App Store. We support all iOS8 devices.
Bart's App Store


when traveling to a new location, i always make an effort to explore the city or town centre. one of the best features of the city centre in cairns, is the amazing boardwalk off the esplanade. it's only five minutes from our accommodation and ten minutes from the main road. it makes a fantastic leisure walk along the coast.
the weather in cairns is extremely hot and humid. i'm not a big fan of the heat so heading to the large air-conditioned cairns city mall was the best choice during the hottest time of the day. the mall was huge with a variety of stores and restaurants. made some purchases on the way too!
the city center is full of dining choices. you can have luxury seafood at the pier while admiring the sea view, ethnic cuisine at the food courts, or a variety of pub or fast food on the streets.
cairns also has a night market that opens daily and it house a variety of shops that sells nick nacks. you can find hand made jewellery made from corals, shells, and wood, as well as clothes, leather goods and even stalls that does body massage and lash extensions. it's a lovely place to buy souvenirs.
the charming city centre has something for everyone and you can easier spend the entire day walking around town. it is tourist friendly, easy to navigate, and a must-do activity for anyone that is new to the area.


only necessary weapon a dragoon carries"
Welcome to the Internet home of the Third Continental Light Dragoons, Captain William Parsons Troop, a progressive American Revolutionary War enacting group founded in 2004. The modern "3d CLD" recruits outside of geographic boundaries and the unit boasts members from North and South Carolina as well as affiliations with individuals and units from Virginia and Tennessee.
To learn more about us and what we do, visit our Mission page or try to visit us in camp by attending an event listed in our Event Schedule. You can also Contact Us for more information. You will find us always willing to talk, teach, and learn more about our hobby!
We also portray Colonel James McCall's (South Carolina) State Troops and, to a increasingly greater extent, the British Legion cavalry.


text:
Home › Photos
It's Money: Floyd Mayweather Vs. Logan Paul Mostly Got Thumbs Down From Fans
D.L. Chandler
Source: Cliff Hawkins / Getty
The exhibition match between future hall of fame boxer Floyd Mayweather and YouTube personality Logan Paul concluded over the weekend and, shockingly, went the distance. Fans on social media have been largely critical of the fight in the days leading up to the event, and for many, the results were lackluster at best.
Mayweather, who at 44 remains undefeated, has long moved away from prizefighting as a means of income as he has several business ventures and holdings, spoils of his stellar career no doubt. Paul, 26, was the bigger fighter but of course, lacks the pedigree of his older opponent.
However, most who paid for the Showtime event were expecting that Mayweather, who barely looked like he was trying hard, would physically dominate Paul despite the size difference. The reality of it all is Paul was outclassed but definitely game, and there was some speculation that Mayweather knocked Paul out accidentally.
According to reports, fans booed the fighters as the fight went all eight rounds without much in the way of a dominant performance from either man. In the post-fight conference, Mayweather seemed to admit that Father Time has robbed him of his legendary speed but did declare he had "fun" taking on Paul.
Mayweather last fought as a professional in 2017 when he took on Irish Mixed Martial Arts star Conor McGregor, making easy work of the long and active brawler. Mayweather fought in another exhibition prior to this past event on Sunday when he fought champion kickboxer Tenshin Nasukawa and defeated him by TKO in the first round of their 2018 fight.
On Twitter, we've gathered some reactions to Floyd Mayweather and Logan Paul's fight. Please read those tweets below.
It's Money: Floyd Mayweather Vs. Logan Paul Mostly Got Thumbs Down From Fans was originally published on hiphopwired.com
Floyd Mayweather Logan Paul


text:
We May Not Have Taught Afghans Democracy, But We Taught Them Budgets
A Taliban budget is almost as trustworthy as the mafia's books or Hollywood accounting. The Taliban's regime is a Potemkin village run for the
May 15, 2022 by Daniel Greenfield Leave a Comment
A Taliban budget is almost as trustworthy as the mafia's books or Hollywood accounting.
The Taliban's regime is a Potemkin village run for the benefit of foreign donors. It has little to no connection to reality. So the only thing this tells us is that the Qatari's Potemkin regime in Kabul is really hoping for more international sympathy.
Afghanistan faces a budget deficit of 44 billion Afghanis ($501 million) this financial year, the country's Taliban authorities said on Saturday without clarifying how the gap between expected revenues and planned spending will be met.
Clearly, we taught them well.
They may not have picked up democracy, but they certainly learned a lot from us about budgets. The trouble though is that you can do things like this when you have a world reserve currency and a ton of resources sitting around.
It doesn't work as well when your reserve currency is opium and child sex slaves.
Announcing the first annual national budget since the Taliban took over the war-torn country in August last year, Deputy Prime Minister Abdul Salam Hanafi said the government foresaw spending of 231.4 billion Afghanis and domestic revenue of 186.7 billion.
The revenues are collections from departments related to customs, ministries and mines, spokesman for the Finance Ministry Ahmad Wali Haqmal said.
Customs means shakedowns of Pakistani truck drivers, ministries means shakedowns of opium growers, and mines means asking the Chinese for money.
Hanafi said the budget for the current financial year, that runs to next February, had been approved by the council of ministries and confirmed by the Taliban's supreme leader Haibatullah Akhunzada, and would use local funds only.
Development works would take up 27.9 billion Afghanis, he said, but did not provide a breakdown of spending on areas such as defence.
We have paid attention to education, technical education, and higher education and our all focus is on how to pave the way education for everyone, Hanafi said.
Except you know, women. And anyone looking for a degree in something other than Beheading 101, Advanced Opium Sorting, Reselling Used Infidel Weapons Components, and Bacha Bazi Dance Theory.


You can find grains in the clay on the earthy, rough body. The beige glaze (called Hagi) coats the whole inside, and the outside is adorned with a wave design. This Hagiglaze is glossy and has floating color contrasts. A light brown hue appears around the glaze. It accentuates the wave design and creates the unique character. This cup can be a principal item in your tea setting with its distinctive presence.
Note: To create Japanese potter ware taste, this cup uses clay and glaze that encourage uneven development. Therefore, the one you purchase is unique, and the hue and pattern are not exactly the same as shown in the pictures.


text:
Q: IRC Bot Android Studio using PircbotX I am coding an IRC Bot using PircbotX library and without android studio it works perfectly.
When I run my application, I got this error in my console:
2020-01-07 13:25:20.050 19323-19323/? W/ordwalrus.alit: Unexpected CPU variant for X86 using defaults: x86
2020-01-07 13:25:21.352 19323-19323/dev.lordwalrus.alita W/ordwalrus.alit: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (light greylist, reflection)
2020-01-07 13:25:21.353 19323-19323/dev.lordwalrus.alita W/ordwalrus.alit: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (light greylist, reflection)
2020-01-07 13:25:21.451 19323-19323/dev.lordwalrus.alita D/ALITA-DEBUG: Configure new Bot
2020-01-07 13:25:21.552 19323-19323/dev.lordwalrus.alita W/System.err: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
2020-01-07 13:25:21.553 19323-19323/dev.lordwalrus.alita W/System.err: SLF4J: Defaulting to no-operation (NOP) logger implementation
2020-01-07 13:25:21.553 19323-19323/dev.lordwalrus.alita W/System.err: SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2020-01-07 13:25:21.819 19323-19323/dev.lordwalrus.alita D/ALITA-DEBUG: Starting bot
2020-01-07 13:25:21.827 19323-19323/dev.lordwalrus.alita W/System.err: SLF4J: Failed to load class "org.slf4j.impl.StaticMDCBinder".
2020-01-07 13:25:21.827 19323-19323/dev.lordwalrus.alita W/System.err: SLF4J: Defaulting to no-operation MDCAdapter implementation.
2020-01-07 13:25:21.827 19323-19323/dev.lordwalrus.alita W/System.err: SLF4J: See http://www.slf4j.org/codes.html#no_static_mdc_binder for further details.
2020-01-07 13:25:21.900 19323-19323/dev.lordwalrus.alita W/System.err: android.os.NetworkOnMainThreadException
2020-01-07 13:25:21.901 19323-19323/dev.lordwalrus.alita W/System.err:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513)
2020-01-07 13:25:21.901 19323-19323/dev.lordwalrus.alita W/System.err:     at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:117)
2020-01-07 13:25:21.901 19323-19323/dev.lordwalrus.alita W/System.err:     at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:105)
2020-01-07 13:25:21.901 19323-19323/dev.lordwalrus.alita W/System.err:     at java.net.InetAddress.getByName(InetAddress.java:1108)
2020-01-07 13:25:21.901 19323-19323/dev.lordwalrus.alita W/System.err:     at java.net.InetSocketAddress.<init>(InetSocketAddress.java:235)
2020-01-07 13:25:21.901 19323-19323/dev.lordwalrus.alita W/System.err:     at org.pircbotx.PircBotX.startBot(PircBotX.java:181)
2020-01-07 13:25:21.901 19323-19323/dev.lordwalrus.alita W/System.err:     at dev.lordwalrus.alita.MainActivity.onCreate(MainActivity.java:33)
2020-01-07 13:25:21.901 19323-19323/dev.lordwalrus.alita W/System.err:     at android.app.Activity.performCreate(Activity.java:7136)
2020-01-07 13:25:21.902 19323-19323/dev.lordwalrus.alita W/System.err:     at android.app.Activity.performCreate(Activity.java:7127)
2020-01-07 13:25:21.902 19323-19323/dev.lordwalrus.alita W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
2020-01-07 13:25:21.902 19323-19323/dev.lordwalrus.alita W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
2020-01-07 13:25:21.902 19323-19323/dev.lordwalrus.alita W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
2020-01-07 13:25:21.902 19323-19323/dev.lordwalrus.alita W/System.err:     at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
2020-01-07 13:25:21.902 19323-19323/dev.lordwalrus.alita W/System.err:     at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
2020-01-07 13:25:21.902 19323-19323/dev.lordwalrus.alita W/System.err:     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
2020-01-07 13:25:21.903 19323-19323/dev.lordwalrus.alita W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
2020-01-07 13:25:21.903 19323-19323/dev.lordwalrus.alita W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:106)
2020-01-07 13:25:21.903 19323-19323/dev.lordwalrus.alita W/System.err:     at android.os.Looper.loop(Looper.java:193)
2020-01-07 13:25:21.903 19323-19323/dev.lordwalrus.alita W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6669)
2020-01-07 13:25:21.903 19323-19323/dev.lordwalrus.alita W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2020-01-07 13:25:21.903 19323-19323/dev.lordwalrus.alita W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
2020-01-07 13:25:21.903 19323-19323/dev.lordwalrus.alita W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

In my Project Structure, in All Modules section, I have slf4k-api→1.7.13 but I do not understand if this dependency is installed on my workspace or not because in app module section I don't find it.
My All Modules Section
My app module section
This is my code in main Activity:
package dev.lordwalrus.alita;

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import org.pircbotx.Configuration;
import org.pircbotx.PircBotX;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d("ALITA-DEBUG", "Configure new Bot");
        Configuration configuration = new Configuration.Builder()
                // Set nick of bot
                .setName("alita")
                // Set real name
                .setRealName("alita")
                // IRC server works perfectly without android application
                .addServer("irc.servername.org")
                // Join in IRC channel
                .addAutoJoinChannel("#channel-name")
                // Add listener that will be called on Events
                .addListener(new MyPircBotX())
                // Build configuration
                .buildConfiguration();

        // Create bot with my configuration
        PircBotX bot = new PircBotX(configuration);
        // Connect to the server
        try {
            Log.d("ALITA-DEBUG", "Starting bot");
            bot.startBot();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

}

I got this error when I call bot.startBot() method.
Thank you a lot! Hope you could help me to fix this problem!


text:
La villa Vauvenargues est une voie du  de Paris, en France.

Situation et accès
La rue Villa Vauvenargues est une voie publique située dans le  de Paris. Elle débute au 82, rue Leibniz et se termine en impasse.

La Rue Villa Vauvenargues comporte également La Villa Vauvenargues, un concept innovant de la Fondation Œuvre de la Croix Saint-Simon qui, sur un même lieu, accueille, prend en charge et accompagne les familles dans le principe de bientraitance et sur les bases de la laïcité et de la mixité sociale.

Ce lieu réunit plusieurs dispositifs de suivi à la fois sanitaire et médico-social. Il privilégie également l'interdisciplinarité et le travail en réseau avec tous les partenaires hospitaliers, médecine de ville, de l'action sociale en tant que lieu ressource.

Origine du nom

Cette voie porte le nom de l'écrivain français, moraliste et aphoriste Luc de Clapiers, marquis de Vauvenargues, en raison de sa proximité avec la rue éponyme.

Historique
Initialement dénommée « impasse des Menuisiers », elle prend son nom actuel en 1934 et est classée dans la voirie parisienne par un arrêté municipal du .

Annexes

Articles connexes
 Liste des voies du 18e arrondissement de Paris

Liens externes
 Villa Vauvenargues (mairie de Paris)

Références

Vauvenargues
Impasse dans le 18e arrondissement de Paris
Vauvenargues