text:
Effects of urban form on wadi flow frequency analysis in the Wadi Aday watershed in Muscat, Oman
Ghazi A. Al-Rawas, Caterina Valeo*, Usman T. Khan, Omar H. Al-Hafeedh
Civil and Architectural Engineering
The effect of urban form on Curve Number (CN) use in rainfall-runoff modelling is explored in an arid wadi watershed in Oman. The standard hydrologic CN used in the Soil Conservation Service method may not be appropriate to use in urbanized arid wadi regions since the land-use characteristics are different than those for which the CN method was developed for. In this paper a new method is described to develop regional CN for arid wadi regions. The modified CN are then used to predict peak-flow and time-to-peak in a wadi watershed and are compared to results from the standard CN method. The regional values produce higher peak-flow (an increase of 19% or 7.4 m3/s, on average) with shorter time-to-peak (a decrease of 16% or 86 minutes, on average), mimicking the flash-floods seen in the region. In addition, the regional CN were used to model the change in hydrology caused by urbanization.
Urban Water Journal
https://doi.org/10.1080/1573062X.2013.857420
Curve Number
arid climates
flood forecasting
stormwater modelling
surface runoff
urban hydrology
Water Science and Technology
10.1080/1573062X.2013.857420
Dive into the research topics of 'Effects of urban form on wadi flow frequency analysis in the Wadi Aday watershed in Muscat, Oman'. Together they form a unique fingerprint.
Rainfall-Runoff Modeling Earth and Planetary Sciences 100%
Frequency Analysis Earth and Planetary Sciences 100%
Soil Conservation Earth and Planetary Sciences 100%
Al-Rawas, G. A., Valeo, C., Khan, U. T., & Al-Hafeedh, O. H. (2015). Effects of urban form on wadi flow frequency analysis in the Wadi Aday watershed in Muscat, Oman. Urban Water Journal, 12(4), 263-274. https://doi.org/10.1080/1573062X.2013.857420
Effects of urban form on wadi flow frequency analysis in the Wadi Aday watershed in Muscat, Oman. / Al-Rawas, Ghazi A.; Valeo, Caterina; Khan, Usman T. et al.
In: Urban Water Journal, Vol. 12, No. 4, 19.05.2015, p. 263-274.
Al-Rawas, GA, Valeo, C, Khan, UT & Al-Hafeedh, OH 2015, 'Effects of urban form on wadi flow frequency analysis in the Wadi Aday watershed in Muscat, Oman', Urban Water Journal, vol. 12, no. 4, pp. 263-274. https://doi.org/10.1080/1573062X.2013.857420
Al-Rawas GA, Valeo C, Khan UT, Al-Hafeedh OH. Effects of urban form on wadi flow frequency analysis in the Wadi Aday watershed in Muscat, Oman. Urban Water Journal. 2015 May 19;12(4):263-274. doi: 10.1080/1573062X.2013.857420
Al-Rawas, Ghazi A. ; Valeo, Caterina ; Khan, Usman T. et al. / Effects of urban form on wadi flow frequency analysis in the Wadi Aday watershed in Muscat, Oman. In: Urban Water Journal. 2015 ; Vol. 12, No. 4. pp. 263-274.
@article{411f5fde1ada4d73966b23376a9ccbb2,
title = "Effects of urban form on wadi flow frequency analysis in the Wadi Aday watershed in Muscat, Oman",
abstract = "The effect of urban form on Curve Number (CN) use in rainfall-runoff modelling is explored in an arid wadi watershed in Oman. The standard hydrologic CN used in the Soil Conservation Service method may not be appropriate to use in urbanized arid wadi regions since the land-use characteristics are different than those for which the CN method was developed for. In this paper a new method is described to develop regional CN for arid wadi regions. The modified CN are then used to predict peak-flow and time-to-peak in a wadi watershed and are compared to results from the standard CN method. The regional values produce higher peak-flow (an increase of 19% or 7.4 m3/s, on average) with shorter time-to-peak (a decrease of 16% or 86 minutes, on average), mimicking the flash-floods seen in the region. In addition, the regional CN were used to model the change in hydrology caused by urbanization.",
keywords = "Curve Number, arid climates, flood forecasting, stormwater modelling, surface runoff, urban hydrology",
author = "Al-Rawas, {Ghazi A.} and Caterina Valeo and Khan, {Usman T.} and Al-Hafeedh, {Omar H.}",
note = "Publisher Copyright: {\textcopyright} 2013, {\textcopyright} 2013 Taylor & Francis.",
doi = "10.1080/1573062X.2013.857420",
journal = "Urban Water Journal",
T1 - Effects of urban form on wadi flow frequency analysis in the Wadi Aday watershed in Muscat, Oman
AU - Al-Rawas, Ghazi A.
AU - Valeo, Caterina
AU - Khan, Usman T.
AU - Al-Hafeedh, Omar H.
N1 - Publisher Copyright: © 2013, © 2013 Taylor & Francis.
N2 - The effect of urban form on Curve Number (CN) use in rainfall-runoff modelling is explored in an arid wadi watershed in Oman. The standard hydrologic CN used in the Soil Conservation Service method may not be appropriate to use in urbanized arid wadi regions since the land-use characteristics are different than those for which the CN method was developed for. In this paper a new method is described to develop regional CN for arid wadi regions. The modified CN are then used to predict peak-flow and time-to-peak in a wadi watershed and are compared to results from the standard CN method. The regional values produce higher peak-flow (an increase of 19% or 7.4 m3/s, on average) with shorter time-to-peak (a decrease of 16% or 86 minutes, on average), mimicking the flash-floods seen in the region. In addition, the regional CN were used to model the change in hydrology caused by urbanization.
AB - The effect of urban form on Curve Number (CN) use in rainfall-runoff modelling is explored in an arid wadi watershed in Oman. The standard hydrologic CN used in the Soil Conservation Service method may not be appropriate to use in urbanized arid wadi regions since the land-use characteristics are different than those for which the CN method was developed for. In this paper a new method is described to develop regional CN for arid wadi regions. The modified CN are then used to predict peak-flow and time-to-peak in a wadi watershed and are compared to results from the standard CN method. The regional values produce higher peak-flow (an increase of 19% or 7.4 m3/s, on average) with shorter time-to-peak (a decrease of 16% or 86 minutes, on average), mimicking the flash-floods seen in the region. In addition, the regional CN were used to model the change in hydrology caused by urbanization.
KW - Curve Number
KW - arid climates
KW - flood forecasting
KW - stormwater modelling
KW - surface runoff
KW - urban hydrology
U2 - 10.1080/1573062X.2013.857420
DO - 10.1080/1573062X.2013.857420
JO - Urban Water Journal
JF - Urban Water Journal


I'm just going to say it: I did a terrible job of keeping up with my goal list last year. I can't cross off much but a lot of the reason is because life changed just enough to keep some of these on the tip of my fingertips.
1. Go to a sleepover or host a sleepover at my place. – I think Las Vegas in May 2013 can allow me to cross this off my list as there were about 4 girls to a hotel room :) It was one gigantic sleepover! A fun one at that!
2. Read 20 books. I was so stinking close. I read 14 books, and I can blame this on the fact that I had a slow start to the new year on this one last year. So, while I'm not saying I accomplished my goal I'm pretty stoked I got this close.
See? I told you my accomplishments last year from my goal list were terrible, but I accomplished a lot more that I didn't specifically write down. You can read all about that here in my post a few weeks ago. Life can't be planned entirely. Ever. I'm thankful for the changes, for the lessons I've learned, for how I've grown in my faith over the last year.
3. Spend time with God (the Bible) every morning.
11. Graduate to 10lb heavy weights at the gym (I'm consistently using 7.5lbs).
You'll notice some of these I carried over from last year, which means I really do want to accomplish them. Fingers crossed this year!
Cheers to a new year, new possibilities and new opportunities.
Previous Post Refresh. Recharge. Move Forward.


Robert L. Livingston was elected to the United States House of Representatives in a special election in 1977 – the first Republican to represent Louisiana's First Congressional District in 102 years. He was re-elected to eleven successive two-year terms. In 1998, he was chosen by his peers to serve as Speaker-designate for the 106th Congress, but resigned for personal reasons, calling on President Bill Clinton to do the same.
Following his departure from Congress in February 1999, Mr. Livingston established a successful lobbying firm known as The Livingston Group in both Washington, DC and in New Orleans, LA. His recently published memoir, The Windmill Chaser, is receiving enthusiastic acclaim.
The Khashoggi Matter — Was he really a "bad guy'?
British Journalist Melanie Phillips provides a different narrative of the final hours of Jamal Khashoggi in her Jewish News Service column (October 18, 2018).Far from being the liberal Washington Post opponent of revisionist Crown Prince Mohammed bin Salman (called MBS for short) because MBS' reforms are too little too late, Phillips asserts that he was in reality a double agent with ties to both the radical Muslim Brotherhood and the Saudi intelligence service.


Discussion in 'Georgia Tech Basketball' started by CLM, Feb 10, 2019.
It's time for a change. It just is. Haywood is 1-29. Jose, who I love has 5 points. We just have to get more talent and we don't have one good player coming in 2019. 10 years now. I am such a diehard fan but it's just not fun anymore and hasn't been for a while.
GTRock, SteamWhistle, Gtbowhunter90 and 5 others like this.
Seeing that we didn't even start a separate pregame thread I would like to start it here instead of continuing to add to the Clemson thread.
Well this has been gross. Okogie going hurt us but this is just straight ridiculous.
Yeah Pastner needs to get his act together. Hope we can keep Reveno. Frankly would mind seeing him get the job next season. He is the sole high light for me from this staff in 2018/2019.
The stats that jump out are that they took 10 more shots and shot 10 more free throws. The shot differential is due to TO and REB. That has been an issue all season.
Defense played well, all things considered.
Turnovers and rebounding continue to kill us.
Actually shot better than ND did for the game. But damn, ND had 11 more shots than we did. Only got this close due to the fouling/free throw parade. Heck, we even made more 3 pointers..
Thankfully we broke the 50 point barrier , sad that is even being brought up as a bright spot.
The stats that jump out are that they took 10 more shots and took 10 more free throws. The shot differential is due to TO and REB. That has been an issue all season.
I don't think we can give Josh two more years. Maybe one.
Fouling 3 point shooters should be an automatic taken out of the game. Alston has done that so many times I am tired of it.
Jose and Haywood have to score. We can't best mid majors if they don't and they continue to not score.
We don't have any recruits coming in? How is this going to get better?
My understanding is that we don't have enough money to buy out Josh after this year nor next. For all I know, we're still paying Hewitt and Brian Gregory.
Very surprised to be honest. At the end of our NIT Finals run season, I never imagined I'd have more hope for our football program than our basketball program 2 short years later.
GTRock and GT14 like this.
Will you be cutting a $5MM check after next season?
msargent1 and AUFC like this.
These funds have already been invested in football.
lauraee and msargent1 like this.
The things that stand out to me are poor shooting, too many turnovers, poor rebounding, fouling 3 point shooters, missed free throws, wrong players taking shots, throwing up prayers instead of kicking out and poor offensive strategy.
GTRock and Gtbowhunter90 like this.
Devoe seems to be progressing nicely. Probably our only well rounded basketball player.
The regression of Alvarado and Haywood is very concerning.
Alston looks like he doesn't want to be out there anymore, not sure what gives.
It doesn't, and I'm only 99% sure that banks enters the draft after this season.
So when is Pastner leaving and when are we cutting a bunch of these players?
Gregory is off the books and Hewitt comes off in 3 months. The issue is Pastner's contract makes it hard to get rid of him before year 5. Very disappointing recruiting results this year. My only hope is that the young guys develop. Alvarado and Haywood will be juniors, Devoe and Moore will be sophomores. Banks will be back (he just needs to figure out how to stay out of foul trouble) and Sjouland is mostly unknown but had a rep as a shooter. A fool's hope maybe, but right now it's all I got.
How many times have we seen stats like these this season? Its ridiculous to put up better stats like this but lose. Reminds me of the Tennessee football game where we had like 2x the offensive stats but lost. This happens way too often. In a sport that is decided by shooting, you shouldn't be able to outshoot so many teams but still lose.


text:
import os
from lxml import etree as ET
import time
import shortuuid
import uuid
import shutil
import sys
import traceback
import csv
import urllib
from subprocess import Popen, PIPE
from PIL import Image

from archives_tools import dacs

bagDir = os.path.dirname(os.path.realpath(__file__))
processingDir = os.path.dirname(os.path.realpath(__file__))
eadFile = os.path.join(processingDir, "ua395-frame.xml")

if os.name == "nt":
	templateFile = "\\\\romeo\\wwwroot\\eresources\\digital_objects\\ua395\\template.html"
	sipDir = "\\\\LINCOLN\\Masters\\Special Collections\\accessions\\SIP"
	dipDir = "\\\\romeo\\wwwroot\\eresources\\digital_objects\\ua395-2"
else:
	templateFile = "/media/bcadmin/wwwroot/eresources/digital_objects/ua395/template.html"
	sipDir = "/media/bcadmin/Lincoln/Special Collections/accessions/SIP"
	dipDir = "/media/bcadmin/wwwroot/eresources/digital_objects/ua395-2"

print sys.getfilesystemencoding()

startTime = time.time()
startTimeReadable = str(time.strftime("%Y-%m-%d %H:%M:%S"))
print "Start Time: " + startTimeReadable

#from http://stackoverflow.com/questions/1094841/reusable-library-to-get-human-readable-version-of-file-size
def sizeof_fmt(num, suffix='B'):
	for unit in ['','-K','-M','-G','-T','-P','-E','-Z']:
		if abs(num) < 1024.0:
			return "%3.1f%s%s" % (num, unit, suffix)
		num /= 1024.0
	return "%.1f%s%s" % (num, 'Yi', suffix)

def makeNewCmpnt(newSeries, folder):
	#print folder.attrib["name"]
	firstDate = "3000-12-25"
	lastDate = "1900-01-01"
	did = newSeries.find("did")
	unittitle = did.find("unittitle")
	if not folder.find("description/unittitle") is None and folder.find("description/unittitle").text:
		unittitle.text = folder.find("description/unittitle").text
		if not folder.find("description/scopecontent") is None and folder.find("description/scopecontent").text:
			scopecontent = ET.SubElement(newSeries, "scopecontent")
			scopecontent.text = folder.find("description/scopecontent").text
	elif not folder.find("description/scopecontent") is None and folder.find("description/scopecontent").text:
		unittitle.text = folder.find("description/scopecontent").text
	else:
		unittitle.text = folder.attrib["name"].replace("-", " ")
	if not folder.find("description/controlaccess") is None and folder.find("description/controlaccess").text:
		controlaccess = ET.SubElement(newSeries, "controlaccess")
		for subjectHead in folder.find("description/controlaccess").text.split(";"):
			newSubject = ET.SubElement(controlaccess, "subject")
			newSubject.text = subjectHead.strip()
	if not folder.find("file/curatorialEvents/event") is None:
		acqinfo = ET.SubElement(newSeries, "acqinfo")
		for event in folder.find("file/curatorialEvents"):
			pElement = ET.SubElement(acqinfo, "p")
			if "T" in event.attrib["humanTime"]:
				eventTime = event.attrib["humanTime"].split("T")[0]
			else:
				eventTime = event.attrib["humanTime"].split(" ")[0]
			dateElement = ET.SubElement(pElement, "date")
			dateElement.set("normal", eventTime)
			dateElement.text = dacs.iso2DACS(eventTime)
			dateElement.tail = event.text
	if len(folder.find("recordEvents").findall("timestamp")) > 0:
		for recordEvent in folder.find("recordEvents"):
			unitdate = ET.SubElement(did, "unitdate")
			if "T" in recordEvent.text:
				normalDate = recordEvent.text.split("T")[0]
			else:
				normalDate = recordEvent.text.split(" ")[0]
			unitdate.set("normal", normalDate)
			if recordEvent.attrib["parser"] == "SmugMug":
				unitdate.set("label", "SmugMug API last updated date")
			unitdate.text = dacs.iso2DACS(normalDate)
	else:
		dateCheck = False
		for timestamps in folder.xpath(".//timestamp"):
			if timestamps.text.startswith("0000"):
				pass
			else:
				dateCheck = True
				if "T" in timestamps.text:
					normalDate = timestamps.text.split("T")[0]
				else:
					normalDate = timestamps.text.split(" ")[0]
				normalDate = normalDate.replace(":", "-")
				if normalDate > lastDate:
					lastDate = normalDate
				if normalDate < firstDate:
					firstDate = normalDate
		if dateCheck == True:
			unitdate = ET.SubElement(did, "unitdate")
			unitdate.set("normal", firstDate + "/" + lastDate)
			unitdate.text = dacs.iso2DACS(firstDate + "/" + lastDate)
	fileCount = len(folder.findall("file"))
	if fileCount > 0:
		physdesc = ET.SubElement(did, "physdesc")
		dimensions = ET.SubElement(physdesc, "dimensions")
		dimensions.text = str(fileCount)
		dimensions.set("unit", "Digital Files")
	else:
		fileCount = len(folder.xpath(".//file"))
		if fileCount > 0:
			physdesc = ET.SubElement(did, "physdesc")
			dimensions = ET.SubElement(physdesc, "dimensions")
			dimensions.text = str(fileCount)
			dimensions.set("unit", "Digital Files")
	return newSeries

def getPath(folder, pathList):
	if folder.getparent().tag == "folder":
		if not folder.getparent().attrib["name"] == "ualbanyphotos":
			pathList.append(folder.getparent().attrib["name"].replace("-", " "))
		getPath(folder.getparent(), pathList)
	return pathList

def makeGallery(sipDir, dipDir, accessionNumber, metaRecord, unitId, cmpnt, templateFile, metaID):
	reload(sys)
	sys.setdefaultencoding('utf-8')

	parser = ET.XMLParser(remove_blank_text=True)
	templateInput = ET.parse(templateFile, parser)
	template = templateInput.getroot()

	for dir in os.listdir(sipDir):
		if dir == accessionNumber:
			sip = dir
	if os.name == "nt":
		path = metaRecord.find("path").text.replace("/", "\\").replace("-\\", "\\")
	else:
		path = metaRecord.find("path").text.split("/")[-1]
	if path.endswith("-"):
		path = path[:-1]
	pathSip = os.path.join(sipDir, sip, "data", "data")
	folderSip = os.path.join(pathSip, path)
	#thumbs no longer in sip
	#folderThumbs = os.path.join(folderSip, "thumbs")
	dipId = unitId.split("-")[1].split("_")[0]
	folderDip = os.path.join(dipDir, dipId)
	if not os.path.isdir(folderDip):
		os.mkdir(folderDip)

	"""
	#will create static access pages later in the process for easier maintenence
	div = template.find(".//div[@id='dynamicContent']")
	for button in div.getparent().find("div/div"):
		if button.tag == "a":
			if button.attrib["id"] == "cmpntLink":
				button[1].text = " " + cmpnt.getparent().find("did/unittitle").text + " "
				oldLink = button.attrib["href"]
				newLink = "nam_" + unitId.split("_")[1]
				button.set("href", oldLink + newLink)
	try:
		if newLink.count('.') > 1:
			newLink = newLink.split(".")[0] + "." + newLink.split(".")[1]
		newLink = oldLink + newLink.replace(".", "-")
		subLink = template.find(".//li/a[@href='" + newLink + "']").getparent()
		subLink.set("class", "list-group-item active")
		topLink = subLink.getparent().getprevious()
		topLink.set("class", "list-group-item active")
	except:
		pass

	#previousarrow
	if not cmpnt.getprevious() is None:
		if cmpnt.getprevious().tag == cmpnt.tag:
			a = ET.SubElement(div, "a")
			a.set("class", "leftRight pull-left")
			a.set("href", cmpnt.getprevious().attrib["id"] + ".html")
			span = ET.SubElement(a, "span")
			span.set("class", "glyphicon glyphicon-arrow-left")
	#next arrow
	a = ET.SubElement(div, "a")
	a.set("class", "leftRight pull-right")
	nextID = "nam_" + cmpnt.attrib["id"].split("_")[1] + "_" + str(int(cmpnt.attrib["id"].split("_")[2]) + 1)
	a.set("href", nextID + ".html")
	span = ET.SubElement(a, "span")
	span.set("class", "glyphicon glyphicon-arrow-right")
	pageHeader = ET.SubElement(div, "div")
	pageHeader.set("class", "page-header text-center")
	h2 = ET.SubElement(pageHeader, "h2")
	h2.set("itemprop", "name")
	h2.text = cmpnt.find("did/unittitle").text

	colMd = ET.SubElement(div, "div")
	colMd.set("class", "col-md-12")
	colMd2 = ET.SubElement(colMd, "div")
	colMd2.set("class", "col-md-10")
	if not cmpnt.find("scopecontent") is None:
		if not cmpnt.find("scopecontent") is None:
			pElement = ET.SubElement(colMd2, "p")
			pElement.set("itemprop", "description")
			pElement.text = cmpnt.find("scopecontent").text
	if not cmpnt.find("acqinfo/p") is None:
		panel = ET.SubElement(colMd2, "div")
		panel.set("class", "panel panel-default")
		panelHeading = ET.SubElement(panel, "div")
		panelHeading.set("class", "panel-heading")
		panelHeading.set("data-toggle", "collapse")
		panelHeading.set("href", "#collapse1")
		h4 = ET.SubElement(panelHeading, "h4")
		h4.set("class", "panel-title")
		h4A = ET.SubElement(h4, "a")
		plusMinus = ET.SubElement(h4A, "span")
		plusMinus.set("class", "glyphicon glyphicon-plus")
		plusMinus.tail = " Processing Details"
		panelCollapse = ET.SubElement(panel, "div")
		panelCollapse.set("id", "collapse1")
		panelCollapse.set("class", "panel-collapse collapse")
		panelBody = ET.SubElement(panelCollapse, "div")
		panelBody.set("class", "panel-body")
		for processInfo in cmpnt.find("acqinfo"):
			pPanel = ET.SubElement(panelBody, "p")
			pPanel.text = processInfo.find("date").text + " - " + processInfo.find("date").tail

	colMd10 = ET.SubElement(colMd, "div")
	colMd10.set("class", "col-md-2")
	for date in cmpnt.find("did"):
		if date.tag == "unitdate":
			pDate = ET.SubElement(colMd10, "p")
			pDate.set("itemprop", "dateCreated")
			pDate.set("content", date.attrib["normal"])
			pDate.text = date.text
			if "label" in date.attrib:
				spanDate = ET.Element("span")
				spanDate.set("class", "glyphicon glyphicon-info-sign")
				spanDate.set("title", date.attrib["label"])
				spanDate.set("data-toggle", "tooltip")
				spanDate.set("data-placement", "top")
				pDate.append(spanDate)

	links = ET.SubElement(div, "div")
	links.set("id", "links")
	sequence = ET.SubElement(links, "div")
	sequence.set("class", "col-md-12 sequence")
	"""
	"""
	for child in cmpnt:
		if child.tag.startswith("c0"):
			aThumb = ET.SubElement(sequence, "a")
			aThumb.set("class", "thumbnail")
			aThumb.set("href", dipId + "/" + newFilename + ext)
			imageTitle = child.find("did/unittitle").text
			childDateText = ""
			for childDate in child.find("did"):
				if childDate.tag == "unitdate":
					childDateText = childDateText + ", " + childDate.text
					if "label" in childDate.attrib:
						childDateText = childDateText + " (" + childDate.attrib["label"] + ") "
			aThumb.set("title", childDateText)
			aThumb.set("data-gallery", "True")
			img = ET.SubElement(aThumb, "img")
			img.set("src", dipId + "/" + newFilename + "T" + ext)
			img.set("alt", childDateText)
	"""
	folderSizeCount = 0
	#limit for testing:
	#if 5 == 1:
	if 5 > 1:
		imageCount = 0
		validExt = [".jpg", ".jpeg", ".png"]
		convertExt = [".tif", ".tiff"]
		allExt = [".jpg", ".jpeg", ".png", ".tif", ".tiff"]
		for root, dirs, files in os.walk(folderSip):
			for imageFile in files:
				if not imageFile.lower() == "thumbs.db":
					image = os.path.join(root, imageFile)
					if not os.path.isfile(image):
						print ("ERROR in folder " + path + ", not an image: " + image)
						exceptMsg = "\n********************************************************************************************"
						exceptMsg = exceptMsg + "\nDuplicate im image name at " + str(time.strftime("%Y-%m-%d %H:%M:%S"))
						exceptMsg = exceptMsg + "\nID: " + metaID
						exceptMsg = exceptMsg + "\nID: " + unitId
						exceptMsg = exceptMsg + str(traceback.format_exc())
						updateLog = open(os.path.join(processingDir, "imageErrorLog.txt"), "a")
						updateLog.write(exceptMsg)
						updateLog.close()
						eadString = ET.tostring(ead, pretty_print=True, xml_declaration=True, encoding="utf-8")
						eadWrite = open("ua395-test.xml", "w")
						eadWrite.write(eadString)
						eadWrite.close()
					else:
						imgExt = os.path.splitext(imageFile)[1].lower()
						if not imgExt in allExt:
							print ("ERROR in folder " + path + ", incorrect image extension: " + image)
							print ("--> " + imgExt)
							exceptMsg = "\n********************************************************************************************"
							exceptMsg = exceptMsg + "\nDuplicate im image name at " + str(time.strftime("%Y-%m-%d %H:%M:%S"))
							exceptMsg = exceptMsg + "\nID: " + metaID
							exceptMsg = exceptMsg + "\nID: " + unitId
							exceptMsg = exceptMsg + str(traceback.format_exc())
							updateLog = open(os.path.join(processingDir, "imageErrorLog.txt"), "a")
							updateLog.write(exceptMsg)
							updateLog.close()
							eadString = ET.tostring(ead, pretty_print=True, xml_declaration=True, encoding="utf-8")
							eadWrite = open("ua395-test.xml", "w")
							eadWrite.write(eadString)
							eadWrite.close()
						else:
							try:
								testImage = Image.open(image)
								fileSize = os.path.getsize(image)
								if fileSize == 0:
									exceptMsg = "\n********************************************************************************************"
									exceptMsg = exceptMsg + "\nNo Image Size - " + str(time.strftime("%Y-%m-%d %H:%M:%S"))
									exceptMsg = exceptMsg + "\nID: " + metaID
									exceptMsg = exceptMsg + "\nID: " + unitId
									exceptMsg = exceptMsg + str(traceback.format_exc())
									updateLog = open(os.path.join(processingDir, "imageErrorLog.txt"), "a")
									updateLog.write(exceptMsg)
									updateLog.close()
									eadString = ET.tostring(ead, pretty_print=True, xml_declaration=True, encoding="utf-8")
									eadWrite = open("ua395-test.xml", "w")
									eadWrite.write(eadString)
									eadWrite.close()
								else:
									imageCount = imageCount + 1

									fileName = os.path.splitext(image)[0]
									ext = os.path.splitext(image)[1]
									fileExt = ext

									newFilename = unitId + "." + str(imageCount)
									newFullPath = os.path.join(folderDip, newFilename + ext)
									if not os.path.isfile(newFullPath):
										if imgExt in convertExt:
											convertCmd = "convert \"" + image + "\"[0] \"" + newFullPath + "\""
											convert = Popen(convertCmd, shell=True, stdout=PIPE, stderr=PIPE)
											stdout, stderr = convert.communicate()
										else:
											shutil.copy2(image, newFullPath)

										#add to final folder size
										fileSize = os.path.getsize(newFullPath)
										folderSizeCount = folderSizeCount + fileSize

									else:
										exceptMsg = "\n********************************************************************************************"
										exceptMsg = exceptMsg + "\nDuplicate im image name at " + str(time.strftime("%Y-%m-%d %H:%M:%S"))
										exceptMsg = exceptMsg + "\nID: " + metaID
										exceptMsg = exceptMsg + "\nID: " + unitId
										exceptMsg = exceptMsg + str(traceback.format_exc())
										updateLog = open(os.path.join(processingDir, "imageErrorLog.txt"), "a")
										updateLog.write(exceptMsg)
										updateLog.close()
										eadString = ET.tostring(ead, pretty_print=True, xml_declaration=True, encoding="utf-8")
										eadWrite = open("ua395-test.xml", "w")
										eadWrite.write(eadString)
										eadWrite.close()

									newThumbnail = os.path.join(folderDip, newFilename + "T" + ext)
									if not os.path.isfile(os.path.join(folderDip, newThumbnail)):

										thumbCmd = "convert -resize 150x150 \"" + newFullPath + "\" \"" +  newThumbnail + "\""
										makeThumb = Popen(thumbCmd, shell=True, stdout=PIPE, stderr=PIPE)
										stdout, stderr = makeThumb.communicate()
										#if len(stderr) > 0:
											#print "thumbnail mogrify  error: " + stderr
									"""
									#Move HTML creation to other script
									for child in metaRecord:
										if child.tag == "file":
											if not child.attrib["name"].lower() == "thumbs.db":
												if child.attrib["name"] == imageFile:

													#fileExt = ".jpg"
													aThumb = ET.SubElement(sequence, "a")
													aThumb.set("itemscope", "True")
													aThumb.set("itemprop", "associatedMedia")
													aThumb.set("itemtype", "http://schema.org/ImageObject")
													aThumb.set("class", "thumbnail")
													if os.path.isfile(os.path.join(folderDip, unitId + "." + str(imageCount) + fileExt)):
														checkExt = fileExt
													elif os.path.isfile(os.path.join(folderDip, unitId + "." + str(imageCount) + ".jpg")):
														checkExt = ".jpg"
													elif os.path.isfile(os.path.join(folderDip, unitId + "." + str(imageCount) + ".JPG")):
														checkExt = ".JPG"
													elif os.path.isfile(os.path.join(folderDip, unitId + "." + str(imageCount) + ".jpeg")):
														checkExt = ".jpeg"
													elif os.path.isfile(os.path.join(folderDip, unitId + "." + str(imageCount) + ".JPEG")):
														checkExt = ".JPEG"
													elif os.path.isfile(os.path.join(folderDip, unitId + "." + str(imageCount) + ".png")):
														checkExt = ".png"
													elif os.path.isfile(os.path.join(folderDip, unitId + "." + str(imageCount) + ".PNG")):
														checkExt = ".PNG"
													else:
														checkExt = fileExt
													aThumb.set("href", dipId + "/" + unitId + "." + str(imageCount) + checkExt)
													imageTitle = ""
													if not child.find("description/unittitle") is None and child.find("description/unittitle").text:
														imageTitle = child.find("description/unittitle").text
													elif not child.find("description/scopecontent") is None and child.find("description/scopecontent").text:
														imageTitle = child.find("description/scopecontent").text
													elif child.find("description").text:
														imageTitle = child.find("description").text
													else:
														imageTitle = child.attrib["name"]
													for childDate in child.find("recordEvents"):
														if childDate.tag == "timestamp":
															if not childDate.text.startswith("0000"):
																if "T" in childDate.text:
																	normalDate = childDate.text.split("T")[0].replace(":", "-")
																else:
																	normalDate = childDate.text.split(" ")[0].replace(":", "-")
																dacsDate = dacs.iso2DACS(normalDate)
																try:
																	imageTitle = imageTitle + ", " + dacsDate
																except:
																	print child.find("id").text
																	imageTitle = imageTitle + ", " + dacsDate
																if "source" in childDate.attrib:
																	imageTitle = imageTitle + " (" + childDate.attrib["source"] + ") "
																elif "parser" in childDate.attrib:
																	imageTitle = imageTitle + " (" + childDate.attrib["parser"] + ") "
													aThumb.set("title", imageTitle)
													aThumb.set("data-gallery", "True")
													img = ET.SubElement(aThumb, "img")
													img.set("src", dipId + "/" + unitId + "." + str(imageCount) + "T" + checkExt)
													img.set("alt", imageTitle)
									"""

							except:
								exceptMsg = "\n********************************************************************************************"
								exceptMsg = exceptMsg + "\nImage failed at " + str(time.strftime("%Y-%m-%d %H:%M:%S"))
								exceptMsg = exceptMsg + "\nID: " + metaID
								exceptMsg = exceptMsg + "\nID: " + unitId
								exceptMsg = exceptMsg + str(traceback.format_exc())
								updateLog = open(os.path.join(processingDir, "imageErrorLog.txt"), "a")
								updateLog.write(exceptMsg)
								updateLog.close()
								eadString = ET.tostring(ead, pretty_print=True, xml_declaration=True, encoding="utf-8")
								eadWrite = open("ua395-test.xml", "w")
								eadWrite.write(eadString)
								eadWrite.close()

	folderSizeFinal = sizeof_fmt(folderSizeCount)
	extentFinal = newFolder.find("did/physdesc/extent")
	extentFinal.text = folderSizeFinal.split("-")[0]
	extentFinal.set("unit", folderSize.split("-")[1])

	"""
	#move writing html to other script
	htmlString = ET.tostring(template, pretty_print=True, method='html', xml_declaration=False, doctype="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">")
	htmlWrite = open(os.path.join(dipDir, cmpnt.attrib["id"] + ".html"), "w")
	htmlWrite.write(htmlString)
	htmlWrite.close()
	"""

reload(sys)
sys.setdefaultencoding('utf-8')
print sys.getdefaultencoding()

parser = ET.XMLParser(remove_blank_text=True)
eadInput = ET.parse(eadFile, parser)
ead = eadInput.getroot()

#csv.register_dialect('piper', delimiter='|', quoting=csv.QUOTE_NONE)
csvInput = os.path.join(processingDir, "arrangmentDraftFinal.csv")
csvFile = open(csvInput, "r")
csvList = csv.reader(csvFile, delimiter='|')

totalCount = 0
for albumRow in csvList:
	fileCount = albumRow[5]
	arrangement = albumRow[0]
	if len(arrangement) > 0 and not arrangement.lower() == "zero":
		if int(fileCount) > 0:
			totalCount = totalCount + 1
csvFile.close()

csvInput = os.path.join(processingDir, "arrangmentDraftFinal.csv")
csvFile = open(csvInput, "r")
csvList = csv.reader(csvFile, delimiter='|')

rowCount = 0
for albumRow in csvList:
	fileCount = albumRow[5]
	arrangement = albumRow[0]
	if len(arrangement) > 0 and not arrangement.lower() == "zero":
		if int(fileCount) > 0:
			startProcessTime = time.time()

			rowCount = rowCount + 1
			metadataFilename = albumRow[8]
			imagesPath = albumRow[6]
			metaID = albumRow[7]
			title = albumRow[2]
			scope = albumRow[3]
			name = albumRow[1]
			arrangement = albumRow[0]

			#track progress every 100
			#if str(rowCount).endswith("00"):
				#print rowCount

			for sip in os.listdir(sipDir):
				for sipFile in os.listdir(os.path.join(sipDir, sip)):
					if sipFile == metadataFilename:
						metadataFile = os.path.join(sipDir, sip, sipFile)
			metadataInput = ET.parse(metadataFile, parser)
			meta = metadataInput.getroot()
			accessionTime = meta.attrib["submitted"]
			for folder in meta.xpath(".//folder"):
				if folder.find("id").text == metaID:
					metaRecord = folder
			if metaRecord is None:
				print "META_ERROR: " + metaID
			arrangeList = arrangement.split("/")
			for series in ead.find("archdesc/dsc"):
				if series.tag == "c01":
					if series.find("did/unittitle").text == arrangeList[0]:
						seriesMatch = series
			if seriesMatch is None:
				print "ERROR: " + metaID
			for subseries in seriesMatch:
				if subseries.tag == "c02":
					if subseries.find("did/unittitle").text == arrangeList[1]:
						subseriesMatch = subseries
			if subseriesMatch is None:
				print "ERROR: " + metaID
			if not len(arrangeList) > 2:
				cmpntMatch = subseriesMatch
				cmpntTag = "c03"
			else:
				for subsubseries in subseriesMatch:
					if subsubseries.tag.startswith("c0"):
						if subsubseries.find("did/unittitle").text == arrangeList[1]:
							cmpntMatch = subsubseries
							cmpntTag ="c04"
				if cmpntMatch is None:
					print "ERROR: " + metaID
			if cmpntMatch is None:
				print "ERROR: " + metaID
			idCount = 1
			try:
				for existingFolder in cmpntMatch:
					if existingFolder.tag.startswith("c0"):
						idCount = idCount + 1
			except:
				print metaID
				for existingFolder in cmpntMatch:
					if existingFolder.tag.startswith("c0"):
						idCount = idCount + 1
			newId = cmpntMatch.attrib["id"] + "_" + str(idCount)
			newFolder = ET.SubElement(cmpntMatch, cmpntTag)
			newFolder.set("id", newId)
			did = ET.SubElement(newFolder, "did")
			unittitle = ET.SubElement(did, "unittitle")
			try:
				unittitle.text = title
			except:
				print metaID
				unittitle.text = title
			if len(scope) > 0:
				scopecontent = ET.SubElement(newFolder, "scopecontent")
				scopecontent.text = scopecontent
			for timestamp in metaRecord.find("recordEvents"):
				if "T" in timestamp.text:
					normalDate = timestamp.text.split("T")[0].replace(":", "-")
				else:
					normalDate = timestamp.text.split(" ")[0].replace(":", "-")
				unitdate = ET.SubElement(did, "unitdate")
				unitdate.set("normal", normalDate)
				unitdate.text = dacs.iso2DACS(normalDate)
				if "source" in timestamp.attrib:
					unitdate.set("label", timestamp.attrib["source"])
				elif "parser" in timestamp.attrib:
					unitdate.set("label", timestamp.attrib["parser"])
			if not metaRecord.find("curatorialEvents/event") is None:
				acqinfo = ET.SubElement(newFolder, "acqinfo")
				if not meta.find("profile/notes").text is None:
					pElement = ET.SubElement(acqinfo, "p")
					pElement.text = meta.find("profile/notes").text
				pElement = ET.SubElement(acqinfo, "p")
				dateElement = ET.SubElement(pElement, "date")
				dateElement.set("normal", accessionTime)
				dateElement.text = dacs.iso2DACS(accessionTime)
				dateElement.tail = "Accession: " + metadataFilename.split(".")[0]
				for event in metaRecord.find("curatorialEvents"):
					pElement = ET.SubElement(acqinfo, "p")
					if "timestampHuman" in event.attrib:
						human = "timestampHuman"
					elif "humanTime" in event.attrib:
						human = "humanTime"
					if "T" in event.attrib[human]:
						eventTime = event.attrib[human].split("T")[0]
					else:
						eventTime = event.attrib[human].split(" ")[0]
					dateElement = ET.SubElement(pElement, "date")
					dateElement.set("normal", eventTime)
					dateElement.text = dacs.iso2DACS(eventTime)
					dateElement.tail = event.text

			#image section
			if os.name == "nt":
				imageFolder = imagesPath.split("\\")[-1]
			else:
				imageFolder = imagesPath.split("/")[-1]
			for sip in os.listdir(sipDir):
				if sip == metadataFilename.split(".xml")[0]:
					for sipfolder in os.listdir(os.path.join(sipDir, sip)):
						if sipfolder == "data":
							for accessionFolder in os.listdir(os.path.join(sipDir, sip, sipfolder)):
								correctPath = os.path.join(sipDir, sip, sipfolder, accessionFolder)
								for albumFolder in os.listdir(correctPath):
									#print albumFolder
									if albumFolder == imageFolder:
										correctPathMatch = correctPath
										matchfolder = albumFolder
			validExt = [".jpg", ".jpeg", ".png"]
			convertExt = [".tif", ".tiff"]
			imageCount = 0
			sizeCount = 0
			imageDir = os.path.join(correctPathMatch, matchfolder)
			for root, dirs, files in os.walk(imageDir):
				for file in files:
					if not file.lower() == "thumbs.db":
						imageCount = imageCount + 1
						if os.path.splitext(file)[1].lower() in validExt or os.path.splitext(file)[1].lower() in convertExt:
							fileSize = os.path.getsize(os.path.join(root, file))
							if fileSize > 0:
								sizeCount = sizeCount + fileSize
						#elif os.path.splitext(file)[1].lower() in convertExt:

			physdesc = ET.SubElement(did, "physdesc")
			folderSize = sizeof_fmt(sizeCount)
			extent = ET.SubElement(physdesc, "extent")
			extent.text = folderSize.split("-")[0]
			extent.set("unit", folderSize.split("-")[1])
			dimensions = ET.SubElement(physdesc, "dimensions")
			dimensions.text = str(imageCount)
			dimensions.set("unit", "Digital Files")

			dao = ET.Element("dao")
			dao.set("actuate", "onrequest")
			dao.set("linktype", "simple")
			dao.set("show", "new")
			dao.set("href", "http://library.albany.edu/speccoll/findaids/eresources/digital_objects/ua395/" + newId + ".html")
			did.append(dao)
			makeGallery(sipDir, dipDir, metadataFilename.split(".xml")[0], metaRecord, newId, newFolder, templateFile, metaID)

			if str(rowCount).endswith("00"):
				eadString = ET.tostring(ead, pretty_print=True, xml_declaration=True, encoding="utf-8")
				eadWrite = open("ua395-test.xml", "w")
				eadWrite.write(eadString)
				eadWrite.close()

			processTime = time.time() - startProcessTime
			print "Process took " + str(round(processTime, 2)) + " seconds or " + str(round(processTime/60, 2)) + " minutes or " + str(round(processTime/3600, 2)) + " hours"

			totalTimeNow = time.time() - startTime
			avgTime = totalTimeNow/rowCount
			print "Average time is " + str(round(avgTime, 2)) + " seconds"
			remaining = totalCount-rowCount
			print str(remaining) + " remaining"
			estimateTime = avgTime*remaining
			print "Estimated time left: " + str(round(estimateTime, 2)) + " seconds or " + str(round(estimateTime/60, 2)) + " minutes or " + str(round(estimateTime/3600, 2)) + " hours"

print rowCount
csvFile.close()

eadString = ET.tostring(ead, pretty_print=True, xml_declaration=True, encoding="utf-8")
eadWrite = open("ua395-test.xml", "w")
eadWrite.write(eadString)
eadWrite.close()

redpajama_set_name: RedPajamaGithub


Your plans are made, your tickets purchased and your ultimate party outfit is picked out. Now there is only one thing left to figure out — how are you going to get home on New Year's Eve?
If you're planning on raging, it's best to have a plan to get yourself home, too. We gathered a few options to keep you safe and out of the driver's seat this December 31.
Capital Metro is offering free service on its MetroBus and MetroRapid lines on Wednesday beginning at 6 pm. Local MetroBus service will be operating on a normal weekday schedule on New Year's Eve, but will be running on a Sunday schedule on New Year's Day.
Also available on December 31 are five Night Owl routes that run to and from Sixth Street and Congress Avenue every 30 minutes from midnight until 3 am. (Night Owl routes run north to south. Maps and schedule can be found here.) E-Buses and UT Shuttles will not be in service.
Final downtown departures for MetroRapid buses will begin along Guadalupe and Lavaca streets at 2:30 am on Thursday. MetroRapid will operate on a Sunday schedule for New Year's Day.
In addition to being free for riders beginning at 6 pm on Wednesday, MetroRail will also be extending its hours. The last train will leave the Downtown Station at 2:30 am on Thursday morning. MetroRail will not be in service on New Year's Day.
MetroBus, MetroRapid and MetroRail service will resume regular weekday schedules on Friday, January 2, with the exception of UT Shuttle and E-Bus service, which will not be in service.
Yellow Cab — Download the Hail a Cap app here, book online here, or call 512-452-9999.
Lyft — Lyft is teaming up with Mothers Against Drunk Driving to promote safe roads this New Year's Eve. Lyft will donate $1 to MADD for anyone who takes the pledge to not drink and drive this holiday. Download the app here.
Uber — Like Lyft, Uber is also teaming up with MAAD. Uber will give $1 for every ride in Austin using the promo code "MADDNYE." In order to donate, Uber customers must book between 6 pm on New Year's Eve and 6 am the next morning. Download the app here.
Lest you feel the need to tempt fate on New Year's, the Austin Police Department has issued a no refusal day for New Year's Eve. In addition to putting more police officers on the streets, APD will begin issuing blood search warrants on DUI suspects who refuse to give a breath or blood specimen. The initiative begins at 9 pm on December 31 and ends at 5 am the following morning.


text:
About Premier
the premier foundation presents the
Premier Foundation, in association with Trump National Golf Club, presents the inaugural Premier Golf Classic to benefit the charitable programs of the Premier Foundation, a non-profit 501(c)(3) foundation committed to serving the world's impoverished. The event will feature a first-class Sunday evening VIP Dinner and Concert at Trump National Golf Club with a silent auction and special guest performances. Monday will be highlighted by the inaugural Premier Golf Classic. Sponsorships and playing spots are tax-deductible, as allowed by law.
VIP Dinner and Concert
5:00 PM Dinner
6:30 PM Concert
7:30 PM Auction
Premier Golf Classic
8:30 AM Breakfast / Check-In
10:00 AM Shot gun start
4:00 PM Awards party to follow
Trump National Golf Club, Charlotte | 120 Trump Square
Mooresville, North Carolina
– – Presenting – –
– – Premier – –
– – Platinum – –
Mac Powell
Jared Emerson
Mack Brock
Sunday evening concert
As the lead singer for Third Day for 25 years, Mac Powell helped transform Christian music and built a devoted fan base, selling 10 million albums, earning 4 Grammy awards, 1 American Music Award and 24 Dove Awards. Along the way, Mac has performed in front of millions of fans around the world and played music with some of the best musicians in the industry. Mac Powell and the Family Reunion officially started in 2018 as the next chapter in Mac's musical journey. The Family Reunion is a band that has developed over the past several years from the musical "brothers" that have been recording and playing live with Mac along the way. His live shows are a blend of Gospel, Country and American Rock songs, combined with some of Mac's favorite Third Day numbers.
Painting LIVE on the 18th green following Monday's round of golf
Jared Emerson, American artist, is world renown for his captivating performance art and studio originals. His art has raised over $1,000,000 for global charities seeking to do good for others.
Born in Michigan and now residing in Greenville, South Carolina, Jared's passion was the result of being raised in a loving Christian home as he incorporates his values into every aspect of his life and work. His personal mission has led him to perform and create art, in a vast array of media, for a large number of collectors, corporations, churches and charities, with his performance piece "Face of God" being the most requested.
Jared's credits include: The movie "ReviveUs 2" with Kirk Cameron, Winter Jam concert tour where he performed live for over 500,000 fans, CBS Sports PGA special "GEICO presents Golf's Best of 2013," Game Plan for Life, The 700 Club as well as having his renowned "Face of God" artwork featured on the hood of the #98 Michael McDowell Monster Energy Cup Series car at NASCAR's Talladega race.
Jared frequently performs at corporate functions in addition to creating one-of-a-kind commissioned pieces for clients. His clientele includes: Carrie Underwood and Mike Fisher, Guy Fieri, Joe Gibbs, Willie Mays, George Hincapie, Albert Pujols, Mark Richt, Jimmy John, Forrest Lucas, Jeff Foxworthy, Joe Greene, Detroit Pistons, Atlanta Falcons, Chick-Fil-A, Coca-Cola, Land Rover and countless others.
Performing LIVE on the 18th green following Monday's round of golf
Mack Brock has been a worship leader for over 15 years and landed three songs in the Top 50 of the CCLI Chart, co-writing "O Come To The Altar," "Resurrecting," "Here As In Heaven," and "Do It Again" – all songs which have had a significant impact on the church worldwide. "O Come To The Altar" was a multi-week Top 5 hit at both Billboard AC Monitored and National Christian Audience charts. Mack Brock's greatest passion is to lead people into a heightened awareness of the presence of God and to see individuals experience the breakthrough God has for them through worship.
FULL SPONSORSHIP PACKAGES HERE
Our vision is embodied in John 15:12, "My command is this: Love each other as I have loved you." By loving and serving our brothers and sisters, we strive to be the hands and feet of Christ.
the Premier foundation Mission
The Premier Foundation is an international Christian non-profit organization committed to being a voice for the disadvantaged. We exist to love and serve the impoverished by meeting their physical, spiritual, educational, social, and emotional needs; thus, empowering them to be agents of change in their own communities.
Adopt the Block (ATB) is the official charitable ministry of the Premier Foundation. ATB identifies communities where our current ministry partners make a significant impact such as Cozumel, Mexico; Belize City, Belize; New Orleans; Free Hill, Jamaica; Nassau, Bahamas; Detroit; Svay Pak, Cambodia; and Greenville, South Carolina. ATB allows the Foundation and its donors to take ownership of specific projects in those communities, feeling a sense of investment and seeing the fruits of its labor.
Instead of imposing what we "think" the community needs, we work to determine the needs of the "block" from those who live there. Projects include, supporting orphanages and elder care facilities, building playgrounds, healing and rescuing children from sex slavery, rebuilding churches, and, most recently, establishing the Premier Academy of Art and Music. By setting achievable goals and prioritizing the communities by need, cost of achieving the goals, and impact, ATB is able to change the face of the community with sustainable results.
PARTICIPATING SPONSORS
If you have any questions about the event, sponsorhips or general information, fill out the form below and we'll be glad to help!
Premier Foundation
gene@premierfoundation.com
© 2019 Premier Golf Classic|This Site Is A Good Omen

redpajama_set_name: RedPajamaCommonCrawl


""Did you ever see such a lamb, such a _lamb_ as he is when he's ill?""
"A little lamb, _lamb_, LAMB, and elaborating that point with anxious gravity, was to receive a practical demonstration of the eternal unfitness of things. ""
""I don't see much difference," retorted Miss Dabstreak, "except that you say it _is_ lamb, and I say it is _lamb_."


Infomir will unveil its new Android 4K set-top box MAG424A at IBC 2018.
The IPTV/OTT set-top manufacturer Infomir has unveiled a new box that brings together 4k and Android OS.
The IPTV/OTT set-top box manufacturer Infomir has entered into a partnership with United.Cloud, which is part of United Group.
The IPTV/OTT set-top box manufacturer Infomir has developed apps for popular mobile platforms that allow watching channels using multiscreen technology.
Infomir will demonstrate a new 4K set-top box at IBC2015.


Once you eliminate your distractions your focus becomes very clear. But it almost seems as if the moment a person makes a decision to place energy on something that is of vital importance, people or situations crop up to take attention away from it.
Have you ever had a crucial deadline at work and out of nowhere the entire office staff shows up in your space for random chit-chat? Pay attention. I noticed this with a tad bit of humor when I recently had a project that was due, now! I was super focused on what I was doing; smoke was coming out of my ears. But somehow, coworkers suddenly decided they wanted my ear on certain matters. I took the time to politely address one individual, only to have that person leave and for another to show up. After noticing the trend, I started to giggle. I promptly picked up my laptop, disappeared and located a vacant conference room so I could work in peace. I even placed my status as "Do not disturb" so that folks would get my drift.
I believe the best way to handle these instances is to be aware. Someone genuinely needing your help is understandable. As an empathetic person, I want to be there for others. However, people who have no direct correlation to your growth, create dysfunction or situations that can be easily resolved on their own, need to be sent in the proper direction.
It's the same with your life purpose. When you are focused on what you are here to do, you are placing dynamic energy in that direction. Hence, people who are not on the same vein of thought will appear in your life and waste your time. Those who are living On Purpose understand the time frame in which things need to be accomplished. Seriously, I have about a good forty years to do what it is I am here to accomplish and I am also on the back end of life. So time is of the essence. The further along one is on the path, the more evident it is that these situations will tend to crop up. The faster you address them and create boundaries the quicker you will move in the right direction.
People, who are aware of why they are here, do not have the time to sacrifice valuable energy on situations that are not contributing to the progression of their spiritual growth. Dynamic energy is accelerating and those who are wide awake can feel and sense it. We are in full action mode, focused and directed! We just don't have to play frivolous games or aimlessly shoot the breeze! Even when we are having fun, it's fun with a purpose! Ha!
But, I have come to realize that sometimes those who are not actively working out their soul's purpose see what we are doing as some mere 'thing' or hobby. I have had someone devalue what I am being directed to do. While I do not take it personally, I can fully understand why they would feel this way. If a person is spending time just going through the motions of life, how can they truly relate to the force that is pushing some of us into our highest selves?
This journey requires active participation. As I observe those who inspire me, who are on the same path I have heard similar stories. They have always been a great source of encouragement. They support my growing awareness by telling me what they see as the things that can easily derail my efforts. It is through them I have adopted the approach that if it's not going, growing or flowing with what I am doing, it needs to be outside of my frame of reference. The great part about this knowledge is that it creates clarity. So what IS supposed to be inside my sphere arrives with ease and flow. I have noticed what does come into my world adds to what I am doing. It also builds and supports my endeavors and adds more harmony to my overall efforts.
When people appear on my horizon, or they bring situations to me I internally ask myself if this will add or take away from my purpose. My intuition is a strong guiding force in my decision. I immediately get a response, due to training my spirit to follow its path. And I listen! The last thing anyone wants in the times we live in is to have something introduced to our space and not pay attention and then a few steps down the road find ourselves completely off course.
The task of raising awareness is a serious undertaking. It is especially so if you have offered yourself to be a part of the work of assisting in the unfolding of collective consciousness. You are being utilized for some important work and Spirit is serious when it comes to working with you. The more you accept of the assignment the more broadly the experience unfolds.
If this is your path, be aware and stay vigilant in your dedication. Not everything advantageous is good. Develop your knowingness so that you will see these distractions as they occur, so you can side step them with grace.
Till the next post…continue to live in love!


text:
The ultimate matchday experience!
Make your next matchday visit to Ewood Park a day to remember – with Blackburn Rovers Community Trust.
Junior teams, schools and youth group organisations can score a real winner by taking part in Rovers' matchday coaching clinic, before soaking up a live Championship clash inside the stadium.
The specially-tailored clinics offer boys and girls, aged 5-16, an unforgettable football experience, for unbelievable value.
As well as providing players of all abilities with the opportunity to develop their football skills and technique, the fun-filled sessions also help to develop communication, teamwork, self-confidence and self-esteem.
Delivered by the Trust's experienced and qualified coaches, the sessions take place in the Blackburn Rovers Indoor Centre three hours before kick-off.
The popular matchday package includes:
• Two hours of structured football coaching with the Trust's professional coaching staff
• Tickets to watch Blackburn Rovers in action at one of the home matches shown below
• The opportunity for progression to the BRFC Football Development Centres
All fixtures are to be played on Saturday at 3pm, but dates and times are subject to change:
Nottingham Forest 14th December 2013
Barnsley 11th January 2014
Bolton Wanderers 25th January 2014
Huddersfield Town 1st February 2014
Charlton Athletic 15th February 2014
Middlesbrough 22nd March 2014
Reading 5th April 2014
Leeds United 19th April 2014
To enquire further or to make a booking please contact Blackburn Rovers Community Trust on 01254 296256 or email sam.dixon@brfctrust.co.uk.
Two coaching roles on offer through the Community Trust
Blackburn Rovers Community Trust are expanding their coaching workforce once again, with two roles for community sports coaches now on offer.
Your junior team's chance to play at the STC!
Junior teams from all over the region have got a fantastic chance to set foot on the same quality pitches as their Rovers heroes when the Roverstars tournament hits the club's Senior Training Centre...
Community Trust Awards champions are crowned in style
The first ever Blackburn Rovers Community Trust Awards exceeded expectations as the first 11 winners of the official club charity's prized accolades were crowned.
Community Trust's commitment to Blackburn is rewarded
Blackburn Rovers Community Trust were back at The HIVE Awards on Thursday night, hoping for a repeat of the 2018 ceremony's success, and enjoyed exactly that.


text:
WORKERS' PARTY – NORTHERN IRELAND
LOOKLEFT MAGAZINE
Workers' Party condemn slaughter in Palestine
The Workers Party of Ireland condemns today's murderous attacks on Palestinian civilians by the Israeli state. At present, sources suggest that at least 55 Palestinians have been killed and 2,400 wounded by Israeli forces, on what has been described as the deadliest day of violence since the 2014 attacks on Gaza.
Today's events, which have taken place on the occasion of the hostile and provocative opening of the US Embassy in Jerusalem, are but a continuing demonstration of Israeli contempt for the lives of Palestinians, following a pattern of massacres from Deir Yassin in 1948, through Qibya, Nahalin and Kufr Kassem in the 1950s, Samu and other villages in the 1960s and 70s and Sabra and Shatila in 1982 together with a systematic campaign of terror against Gaza in recent years and the killing and injuring of Palestinians during and after the recent March 30th protests. These attacks reflect a desire to assert complete control over Palestinian people and territory and represent a brazen rebuff to any semblance of a peace process. However, despite repeated human rights violations against Palestinians, the Israeli state has gone unpunished.
Israel, assisted by the US and its allies, has repeatedly rejected all constructive efforts to secure a lasting settlement based on the legitimate rights of the Palestinian people, blocking any move towards the creation of an independent Palestinian state and devising a series of bogus schemes to deny Palestinians and their representatives a voice in their future.
The United Nations and its member states must insist on the implementation of UN General Assembly Resolutions on Palestine and take resolute action against Israel to protect Palestinian lives and property.
The Workers Party of Ireland calls on all its members to participate in demonstrations against this latest outrage, to contact public representatives demanding action and to increase their solidarity efforts and activities with the Palestinian people, including the campaign in support of the Boycott, Divestment, Sanctions movement.
As a minimum requirement, the Workers Party demands that the Irish and UK governments, which recently expelled Russian diplomats without any evidence of wrongdoing, must immediately expel the Israeli Ambassador from Ireland and the UK and impose sanctions against Israel to demonstrate that the people will no longer tolerate these murderous attacks.
We stand with the Palestinian people in their struggle for their legitimate rights, including the right to self-determination and the establishment of a free, independent and sovereign state of Palestine with Jerusalem as its capital.
Gerry Grainger
International Secretary
Workers Party of Ireland
admin2018-05-14T20:44:26+00:00May 14th, 2018|Comments Off on Workers' Party condemn slaughter in Palestine
Owen Keegan must put Dublin land sell-off proposals to a public referendum
Irish Water criticised for failure to act to prevent Leixlip plant contamination
US Iran attack leads to fresh calls for an end to US troops in Shannon
New Year's Message from the Party President
Campaigners deliver 3,826 postcards to Minister Eoghan Murphy
The Workers' Party of Ireland | info@workersparty.ie | Donate| 01 874 0716 | 8 New Cabra Road, Dublin 7, Ireland


Alert-3 is the latest version of X-on's Alert Notification product, which has gone development over a 25 year period, honed by the requirements of our customers.
Whether your notification is via Voice Call, SMS or Email, the recipient can always respond to the contact, letting you know that they have received it, or alternatively what action they are going to take.
Alert-3 from X-on can make voice calls and send SMS to virtually any country in the world and receive responses.
X-on's resilient and protected data centres are hosted in the UK, meeting stringent data protection requirements.
A voice noticeboard system allows callers to dial back in to receive updates, leaving you free for essential communications.
Voice Call Notifications to key individuals can enter them immediately into a phone conference to discuss the next steps in an incident.
Start, control and monitor the notification on the move.
Voice Calls are still the best way to get your message through to your intended audience. People still pick up the phone.
Text Messaging is still an effective way to spread your message quickly. Reports allow you to monitor who's seen your message.
If you wish to find out how SMS Alert can maximise your customer and public contact speak to one of our Sales Team on 0333 332 0000.


Monroe County in partnership with Monroe 1 BOCES will be presenting a NYS DEC approved 60 hour Basic Operations course one day a week from September 11 through December 11, 2013 from 8:00 am to 4:00 pm at their Training Center on 1574 Lake Shore Blvd, Rochester, NY 14617.
Cost is $975/person. Lunch is included.
Each year the Green Panel, consisting of more than a dozen environmental groups, identify bills of special significance known as "super bills". This year the Environmental Conservation Committee listed the "Fracking Moratorium and Health Impacts Assessment" as a super bill.
The bill would enact a moratorium on certain types of natural gas drilling until May 15, 2015, and require the completion of a comprehensive health impact assessment. This legislation (A.5424-A Sweeney) passed the Assembly, but the Senate has not yet taken action.


text:
export default (function() {

/**
 * Set validity state of form elements:
 */
const setValidityStatus = (element, valid) => {
  var el
  if ($.type(element) === 'string') {
    el = document.querySelector(element)
  } else if (element && element.nodeName) {
    el = element
  } else {
    el = element.array[0]
  }

  if (valid) {
    el.setAttribute('valid', true)
    el.setAttribute('invalid', false)
    el.classList.add('valid')
    el.classList.remove('invalid')
  } else {
    el.setAttribute('valid', false)
    el.setAttribute('invalid', true)
    el.classList.add('invalid')
    el.classList.remove('valid')
  }
}

/**
 * Used to check input validity:
 */
const checkValidity = (element, expression) => {
  if (expression) {
    setValidityStatus(element, true)
  } else {
    setValidityStatus(element, false)
  }
  return expression
}

$.fn.extend({
  isNotEmpty: function() {
    if (this[0].nodeName !== 'INPUT') return
    const value = this[0].nodeName === 'INPUT' && this[0].value
    return checkValidity(this, value)
  },

  validateAlphabetic: function() {
    if (this[0].nodeName !== 'INPUT') return
    const letters = /^[A-Za-z]+$/
    const value = this[0].nodeName === 'INPUT' && this[0].value
    checkValidity(this, value.match(letters))
    if (value) {
      return checkValidity(this, value.match(letters))
    }
  },

  validateText: function() {
    if (this[0].nodeName !== 'INPUT') return
    const letters = /^[A-Za-z\W]+$/
    const value = this[0].nodeName === 'INPUT' && this[0].value
    checkValidity(this, value.match(letters))
    if (value) {
      return checkValidity(this, value.match(letters))
    }
  },

  validateNumber: function() {
    if (this[0].nodeName !== 'INPUT') return
    const numbers = /^[+-]?\d+(\.\d+)?$/
    const value = this[0].nodeName === 'INPUT' && this[0].value
    checkValidity(this, value.match(numbers))
    if (value) {
      return checkValidity(this, value.match(numbers))
    }
  },

  validateAlphaNumeric: function() {
    if (this[0].nodeName !== 'INPUT') return
    const letters = /^[0-9a-zA-Z]+$/
    const value = this[0].nodeName === 'INPUT' && this[0].value
    checkValidity(this, value.match(letters))
    if (value) {
      return checkValidity(this, value.match(letters))
    }
  },

  validateUserName: function(minimum) {
    if (this[0].nodeName !== 'INPUT') return
    const letters = /^[a-zA-Z0-9]+$/
    const username = this[0].value
    if (!username) return checkValidity(this, username)
    if (minimum && username.match(letters)) {
      if (username.length >= minimum) {
        return checkValidity(this, username)
      } else {
        return checkValidity(this, false)
      }
    } else {
      return checkValidity(this, checkValidity(this, username.match(letters)))
    }
  },

  validateEmail: function() {
    if (this[0].nodeName !== 'INPUT') return
    const value = this[0].value
    const email = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/
    if (value) {
      return checkValidity(this, value.match(email))
    } else {
      return checkValidity(this, false)
    }
  },

  validatePhoneNumber: function(int) {
    if (this[0].nodeName !== 'INPUT') return
    let phone
    let phoneNumber
    const convertLettersToNumbers = value => {
      let phonenumber = ""
      value = value.toLowerCase()
      const len = value.length
      for (let i = 0; i < len; i++) {
        let character = value.charAt(i)
        switch (character) {
          case '0':
            phonenumber += "0"
            break
          case '1':
            phonenumber += "1"
            break
          case '2':
            phonenumber += "2"
            break
          case '3':
            phonenumber += "3"
            break
          case '4':
            phonenumber += "4"
            break
          case '5':
            phonenumber += "5"
            break
          case '6':
            phonenumber += "6"
            break
          case '7':
            phonenumber += "7"
            break
          case '8':
            phonenumber += "8"
            break
          case '9':
            phonenumber += "9"
            break
          case '-':
            phonenumber += "-"
            break
          case 'a':
          case 'b':
          case 'c':
            phonenumber += "2"
            break
          case 'd':
          case 'e':
          case 'f':
            phonenumber += "3"
            break
          case 'g':
          case 'h':
          case 'i':
            phonenumber += "4"
            break
          case 'j':
          case 'k':
          case 'l':
            phonenumber += "5"
            break
          case 'm':
          case 'n':
          case 'o':
            phonenumber += "6"
            break
          case 'p':
          case 'q':
          case 'r':
          case 's':
            phonenumber += "7"
            break
          case 't':
          case 'u':
          case 'v':
            phonenumber += "8"
            break
          case 'w':
          case 'x':
          case 'y':
          case 'z':
            phonenumber += "9"
            break
        }
      }
      return phonenumber
    }
    if (this[0].value) {

      /**
       * International Numbers:
       */
      if (int) {
        phoneNumber = this[0].value.replace(/[\(\)\.\-\ ]/g, '')
        return checkValidity(this, this.isNotEmpty() && !isNaN(phoneNumber))

        /**
         * North America (US and Canada):
         */
      } else {
        phoneNumber = this[0].value.replace(/[\(\)\.\-\ ]/g, '')
        phoneNumber = convertLettersToNumbers(phoneNumber)
        phone = /((\(\d{3}\)?)|(\d{3}))([\s-./]?)(\d{3})([\s-./]?)(\d{4})/
        return checkValidity(this, phoneNumber.match(phone))
      }
    } else {
      return checkValidity(this, false)
    }
  },

  validateUrl: function() {
    if (this[0].nodeName !== 'INPUT') return
    if (this[0].value) {
      const url = /^(ftp|http|https):\/\/([w]{3}\.)?(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/
      return checkValidity(this, this[0].value.match(url))
    } else {
      return checkValidity(this, false)
    }
  },

  validateAge: function(minimum) {
    if (this[0].nodeName !== 'INPUT') return
    const age = this[0].value
    if(!age) {
      return checkValidity(this, false)
    } else if (age && minimum) {
      return checkValidity(this, age >= minimum)
    } else if (age) {
      return checkValidity(this, true)
    } else {
      return checkValidity(this, false)
    }
  },

  validateCheckbox: function() {
    if (this[0].nodeName !== 'INPUT') return
    if (this[0].nodeName === 'INPUT' && this[0].type === 'checkbox') {
      return checkValidity(this, this[0].checked === true)
    }
  },

  validateRadioButtons: function() {
    if (this[0].nodeName !== 'INPUT') return
    let choice = false
    if (this[0].nodeName === 'INPUT' && this[0].type === 'radio') {
      $.each(this, function(idx, button) {
        if (button.checked === true) {
          choice = true
        }
      })
      return checkValidity(this, choice)
    }
  },

  validateSelectBox: function() {
    if (this[0].nodeName === 'SELECT') {
      return checkValidity(this, this[0].selectedIndex)
    } else {
      return false
    }
  },

  validateSwitch: function() {
    const checkbox = this.find('input[type=checkbox]')[0]
    if (checkbox.checked) {
      return true
    } else {
      return false
    }
  },

  validateSelectList: function() {
    const radio = this.find('input[type=radio]')
    let checked = false
    radio.forEach(function(item) {
      if (item.checked) {
        checked = true
      }
    })
    if (checked) {
      return true
    } else {
      return false
    }
  },
  validateMultiSelectList: function() {
    const checkboxes = this.find('input[type=checkbox]')
    let checked = false
    checkboxes.forEach(function(item) {
      if (item.checked) {
        checked = true
      }
    })
    if (checked) {
      return true
    } else {
      return false
    }
  }
})

$.extend({
  validatePassword: function(input1, input2, minimum) {
    const psswd1 = $(input1)[0]
    const psswd2 = $(input2)[0]
    if (minimum && psswd1.value < minimum || psswd2.value < minimum) {
      psswd1.classList.add('invalid')
      psswd1.classList.remove('valid')
      psswd2.classList.add('invalid')
      psswd2.classList.remove('valid')
      return false
    } else {
      const letters = /^(?=.*[a-zA-Z])(?=.*[0-9]).+$/
      if (!letters.test(psswd1.value) && !letters.test(psswd2.value)) return false
      if (psswd1.value === psswd2.value) {
        psswd1.classList.remove('invalid')
        psswd1.classList.add('valid')
        psswd2.classList.remove('invalid')
        psswd2.classList.add('valid')
      } else {
        psswd1.classList.add('invalid')
        psswd1.classList.remove('valid')
        psswd2.classList.add('invalid')
        psswd2.classList.remove('valid')
      }
      return psswd1.value === psswd2.value
    }
  },

  validateWithRegex: function(input, regex) {
    if (!input || !regex) {
      console.error('This method requires a regular expression.')
      return
    }
    const value = $(input).array[0].value
    if (value) {
      return checkValidity(input, value.match(regex))
    }
  },

  customValidators: [],

  registerCustomValidator: function(name, regex) {
    this.customValidators.push({name: name, regex: regex})
  }
})

})()


Comments: The current La Porte Ford *NO GIMMICKS EVERYONE QUALIFIES* price is $22,495. With an original MSRP of $25,495 this 2018 Ford EcoSport SE 4WD has an immediate savings of $3,000! La Porte Ford New Ford SUV Super center sits just west of South Bend. We stock and special order the new Ford SUV models La Porte, IN, Michigan City, South Bend, Valparaiso, Plymouth, IN and Three Oaks, MI SUV shoppers prefer, like this 2018 Ford EcoSport SE 4WD Stock# L8045.
This 2018 Ford EcoSport SE 4WD features a Shadow Black exterior with a Ebony Black interior. Factory equipped with an impressive 4cyl, 2.0l, 166.0hp, and an automatic with four wheel drive.
DESIRABLE FEATURES: 4WD, VOICE COMMANDS, a BACK-UP CAMERA, FORD SYNC, HEATED SEATS, BLUETOOTH, SIRIUS XM, HID HEADLAMPS, and KEYLESS ENTRY. Your 2018 Ford EcoSport SE 4WD is one of 9 other SUVs like this in stock Valparaiso drivers will find available to test drive at our new SUV showroom in La Porte, IN. This Ford EcoSport is perfect for any ones SUV needs in our neighboring communities of La Porte, IN, Michigan City, South Bend, Valparaiso, Plymouth, IN and Three Oaks, MI.
TECHNOLOGY FEATURES: This Ford EcoSport for sale near Michigan City includes a USB Interface, Keyless Start, Steering Wheel Audio Controls, an Anti Theft System, a Multi-Information Display, Android Auto Compatible, Apple CarPlay Compatible, Steering Wheel Cruise Control, an Auxiliary Audio Input, a Electronic Messaging Assistance, Steering Wheel Controls, an AM/FM Stereo, an Outside Temperature Gauge, an Auxiliary Power Outlet, Rear Auxiliary Power Outlet, an MP3 Compatible Radio, a Sync 3, Digital Instruments, and a Digital Clock.


Aero Porto Dal Lago Airport is located in Mato Grosso do Sul, Brazil. It is classed as a small airport and as such only available to approved aircraft.
Aeroclube de Aquidauana Airport is located in Mato Grosso do Sul, Brazil. It is classed as a small airport and as such only available to approved aircraft.
Alcoolvare Airport is located in Mato Grosso do Sul, Brazil. It is classed as a small airport and as such only available to approved aircraft.
Amambai Airport is located in Mato Grosso do Sul, Brazil. It is classed as a small airport and as such only available to approved aircraft.
Antonio Joao Airport is located in Mato Grosso do Sul, Brazil. It is classed as a small airport and as such only available to approved aircraft.
Arrozeira Airport is located in Mato Grosso do Sul, Brazil. It is classed as a small airport and as such only available to approved aircraft.
Bela Vista Airport is located in Mato Grosso do Sul, Brazil. It is classed as a small airport and as such only available to approved aircraft.
Bonito Airport is located in Mato Grosso do Sul, Brazil. It is classed as a small airport and as such only available to approved aircraft.
Bonito Airport is located in Mato Grosso do Sul, Brazil. It is classed as a closed and as such only available to approved aircraft.
Camapua Airport is located in Mato Grosso do Sul, Brazil. It is classed as a small airport and as such only available to approved aircraft.


Best Foods To Reduce High Blood Pressure.
Not only are they delicious, bananas also help reduce your risk of stroke and heart disease. They have the highest rate of potassium to sodium. Potassium is often recommended to people taking diuretics. So eating one to two bananas a day can help restore blood sugar levels as well.
Sunflower seeds are also a great source of magnesium. A quarter cup of these makes a nutritious snack — but be sure to buy them unsalted, since salted sunflower seeds are high in sodium, which you want to avoid.
A study published in the July 2007 issue of the Journal of the American Medical Association (JAMA) suggests that eating small amounts of dark chocolate daily helps lower blood pressure. Flavanols, which are present in dark chocolates are known to improve several important cardiovascular risk factors and also reduce the risk of cardiovascular diseases.
Try adding ground flaxseed to almost anything you eat. They are high in fibre and can help those who are trying to maintain a strict and healthy diet. They also help lower cholesterol and are rich in omega-3 fatty acids, which fight inflammation and infections.
A green leafy delight, spinach is low in calories, high in fibre, and packed with heart-healthy nutrients like potassium, foliate, and magnesium, they key ingredient for lowering and maintaining healthy blood pressure levels.
They are rich in lycopene and other important antioxidants that helps reduce blood pressure. Tomatoes are a very good source of potassium. Diets rich in potassium have been shown to lower high blood pressure and reduce the risk of heart disease.
It truly does a body good! Drinking heart-healthy skim milk or 1 percent milk will provides calcium, potassium and vitamin D, three nutrients that work as a team to help reduce blood pressure levels by about 3 to 10 percent.
These provide ample potassium. When potassium is low, the body retains sodium and too much sodium raises blood pressure. When potassium is high, the body gets rid of sodium, keeping the BP low. Soybeans also contain isoflavones, which help lower blood pressure levels.
Whole grain foods are excellent sources of fibre, magnesium and other essential nutrients needed to maintain a healthy and balanced diet. Eating foods rich in fibre also keeps you feeling full for a longer period of time. Wiseman suggests whole grains that are high in potassium such as buckwheat and millet.