text:
package com.bytegriffin.get4j;

import java.lang.annotation.Annotation;
import java.util.List;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.bytegriffin.get4j.annotation.Cascade;
import com.bytegriffin.get4j.annotation.Config;
import com.bytegriffin.get4j.annotation.Field;
import com.bytegriffin.get4j.annotation.ListDetail;
import com.bytegriffin.get4j.annotation.Single;
import com.bytegriffin.get4j.annotation.Site;
import com.bytegriffin.get4j.annotation.Sync;
import com.bytegriffin.get4j.conf.AbstractConfig;
import com.bytegriffin.get4j.conf.ClusterNode;
import com.bytegriffin.get4j.conf.Configuration;
import com.bytegriffin.get4j.conf.ConfigurationXmlHandler;
import com.bytegriffin.get4j.conf.Context;
import com.bytegriffin.get4j.conf.CoreSeedsXmlHandler;
import com.bytegriffin.get4j.conf.DefaultConfig;
import com.bytegriffin.get4j.conf.DynamicField;
import com.bytegriffin.get4j.conf.DynamicFieldXmlHandler;
import com.bytegriffin.get4j.conf.ResourceSync;
import com.bytegriffin.get4j.conf.ResourceSyncYamlHandler;
import com.bytegriffin.get4j.conf.Seed;
import com.bytegriffin.get4j.core.PageMode;
import com.bytegriffin.get4j.core.SpiderEngine;
import com.bytegriffin.get4j.net.http.HttpProxy;
import com.bytegriffin.get4j.parse.PageParser;
import com.bytegriffin.get4j.util.FileUtil;
import com.bytegriffin.get4j.util.MD5Util;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

/**
 * 爬虫入口类兼API

 * 主要负责对内配置文件加载运行 和 对外的API调用
 */
public class Spider {

	private static final Logger logger = LogManager.getLogger(Spider.class);

	private static Spider me;

	private static Seed seed;

	private static ResourceSync resourceSync;

	private static Configuration configuration;

	private static DynamicField dynamicField;

	private Map<String, String> dynamicFieldMap;

	private Spider() {
		dynamicFieldMap = Maps.newHashMap();
		seed = new Seed();
		resourceSync = new ResourceSync();
		configuration = new Configuration();
		dynamicField = new DynamicField();
	}

	private Spider(PageMode pageMode) {
		dynamicFieldMap = Maps.newHashMap();
		seed = new Seed();
		resourceSync = new ResourceSync();
		configuration = new Configuration();
		dynamicField = new DynamicField();
		pageMode(pageMode);
	}

	/**
	 * 设置种子名称

	 * 每个种子名称要唯一

	 *
	 * @param seedName 种子名称
	 * @return Spider
	 */
	public Spider seedName(String seedName) {
		seed.setSeedName(seedName);
		return this;
	}

	/**
	 * 抓取的页面模型

	 * 必填项。list_detail(列表-详情页面)、single(单个页面)、site(单个站点)、cascade(单页面上的所有链接)
	 * 默认值是single。
	 *
	 * @param pageMode 页面模型
	 * @return Spider
	 */
	private Spider pageMode(PageMode pageMode) {
		seed.setPageMode(pageMode);
		return this;
	}

	/**
	 * 设置抓取url

	 * 必填项。表示要抓取的Url,如果抓取模式pageMode为list_detail,该值为列表Url, 其中可变的页数PageNum需要用大括号{}括起来
	 *
	 * @param fetchUrl 抓取url
	 * @return Spider
	 */
	public Spider fetchUrl(String fetchUrl) {
		seed.setFetchUrl(fetchUrl);
		return this;
	}

	/**
	 * http请求方法

	 * 非必填项。抓取时Http的请求方法,默认值是get,可以配置为post,暂且只支持这两种。
	 *
	 * @return Spider
	 */
	public Spider post() {
		return method("post");
	}

	private Spider method(String method) {
		seed.setFetchHttpMethod(method);
		return this;
	}

	/**
	 * 设置页面变化探测器,用于探测抓取页面的变化,如果有变化就立刻抓取,没有变化则继续探测。 默认是探测整个页面是否发生改变。
	 *
	 * @return Spider
	 */
	public Spider defaultProbe() {
		seed.setFetchProbeSelector(DefaultConfig.default_value);
		seed.setFetchProbeSleep(DefaultConfig.default_value);
		return this;
	}

	/**
	 * 设置页面变化探测器,用于探测抓取页面的变化,如果有变化就立刻抓取,没有变化则继续探测。
	 * 此项值的格式支持Jsoup(针对html或xml)或者Jsonpath(针对json)文件
	 *
	 * @param selector     页面selector选择器
	 * @param sleepSeconds 监控频率,单位:秒
	 * @return Spider
	 */
	public Spider probe(String selector, int sleepSeconds) {
		seed.setFetchProbeSelector(selector);
		seed.setFetchProbeSleep(sleepSeconds + "");
		return this;
	}

	/**
	 * 爬虫工作线程数量,非必填项。默认值是1。
	 *
	 * @param count 爬虫线程数
	 * @return Spider
	 */
	public Spider thread(int count) {
		seed.setThreadCount(count);
		return this;
	}

	/**
	 * 抓取的详情页面链接选择器

	 * 非必填项,当抓取的页面格式属于【列表-详情】页时使用,支持Jsoup原生的选择器(html内容)或Jsonpath(json内容)。

	 * 当此内容为JsonPath字符串的时候,如果list页面的json中提供的detail的链接是相对路径,那么此时这个值的格式为:链接前缀+jsonpath,
	 * 例如:http://www.aaa.com/bbb$.data.url;当此内容为空时,说明抓取的页面格式是普通页面,不存在详情页面。

	 * 注意:有种特殊情况,当Json属性中的内容是Html格式,并且Html里包含着详情页的链接时候,此时需要先写Jsonpath
	 * 再写Jsoup选择器字符串,中间用竖杠隔开,例如: $.data.*|a.class[href]。
	 *
	 * @param detailLinkSelector 详情页面选择器
	 * @return Spider
	 */
	public Spider detailLinkSelector(String detailLinkSelector) {
		seed.setFetchDetailLinkSelector(detailLinkSelector);
		return this;
	}

	/**
	 * 抓取的列表总页数

	 * 非必填项,当抓取的页面格式属于【列表-详情】页时使用,动态获取页面中显示的总页数。
	 * 支持Jsoup原生的选择器(html内容)或Jsonpath(json内容),默认值是1。
	 *
	 * @param totalPageSelector 总页数选择器
	 * @return Spider
	 */
	public Spider totalPages(String totalPageSelector) {
		seed.setFetchTotalPages(totalPageSelector);
		return this;
	}

	/**
	 * 抓取的列表总页数

	 * 非必填项,当抓取的页面格式属于【列表-详情】页时使用,直接定义抓取页数,默认值是1。
	 *
	 * @param totalPageNum 总页数
	 * @return Spider
	 */
	public Spider totalPages(int totalPageNum) {
		seed.setFetchTotalPages(String.valueOf(totalPageNum));
		return this;
	}

	/**
	 * 抓取延迟策略

	 * 非必填项。每两次http请求之间的间隔时间(单位:秒),以防止频繁访问站点抓取不到内容,默认值为0
	 *
	 * @param seconds 每次请求延迟,单位秒
	 * @return Spider
	 */
	public Spider sleep(int seconds) {
		seed.setFetchSleep(seconds);
		return this;
	}

	/**
	 * 抓取随机延迟策略

	 * 非必填项。格式:2-7 表示2秒到7秒直接随机延迟,其中范围中间用横杠连接时间的上下限

	 * 每两次http请求之间的间隔时间(单位:秒)范围,每次请求时间间隔都是这个范围内的随机值,
	 * 主要用于某些网站防爬策略检测出固定时间间隔访问网站的请求,默认值为0
	 *
	 * @param lower 时间波动下限
	 * @param upper 时间波动上限
	 * @return Spider
	 */
	public Spider sleepRange(int lower, int upper) {
		seed.setFetchSleepRange(lower + "-" + upper);
		return this;
	}

	/**
	 * 抓取随机延迟策略

	 *
	 * @param timerange 格式:2-7
	 * @return Spider
	 */
	private Spider sleepRange(String timerange) {
		seed.setFetchSleepRange(timerange);
		return this;
	}

	/**
	 * 抓取启动器

	 * startTime表示爬虫抓取的开始时间,格式为:2001-10-10 23:29:02,如果startTime已经过时,爬虫会立刻执行
	 *
	 * @param startTime 抓取的开始时间
	 * @return Spider
	 */
	public Spider timer(String startTime) {
		seed.setFetchStart(startTime);
		return this;
	}

	/**
	 * 抓取启动器

	 * firstTime表示爬虫第一次的抓取时间,格式为:2001-10-10 23:29:02,如果firstTime已经过时,爬虫会立刻执行

	 * interval表示爬虫重复抓取的时间间隔,单位是秒
	 *
	 * @param firstTime 第一次的抓取时间
	 * @param interval  下次抓取的时间间隔,单位是秒
	 * @return Spider
	 */
	public Spider timer(String firstTime, int interval) {
		seed.setFetchStart(firstTime);
		seed.setFetchInterval(String.valueOf(interval));
		return this;
	}

	/**
	 * 资源选择器,配置时必须要包含在detail_link与avatar资源的外部资源选择器。

	 * 支持Jsoup原生的选择器(html内容)或Jsonpath(json内容)

	 * 当此内容为JsonPath字符串的时候,如果json中提供的detail的链接是相对路径,那么此时这个值

	 * 的格式为:链接前缀+jsonpath。如果需要抓取多种资源可以用逗号","隔开,默认不填是全抓取。

	 * 注意:当启用list_detail模式时,资源特指的是avatar资源,即:与Detail_Link一一对应的资源,

	 * 当启用非list_detail模式时,可抓取多种资源,每个选择器中间用逗号隔开。
	 *
	 * @param resourceSelector Jsoup选择器支持的字符串
	 * @return Spider
	 */
	public Spider resourceSelector(String resourceSelector) {
		seed.setFetchResourceSelectors(resourceSelector);
		return this;
	}

	/**
	 * 是否支持Javascript,有些网站需要等待javascript来生成结果,此时可以将此属性设为true, 默认值是false,慎用:抓取效率会变慢
	 *
	 * @param ifSupport 是否支持
	 * @return Spider
	 */
	public Spider javascriptSupport(boolean ifSupport) {
		seed.setFetchJavascriptSupport(ifSupport);
		return this;
	}

	/**
	 * 设置代理

	 * 爬虫会自动检测,如果代理不能用,会立刻停止
	 *
	 * @param ip   代理ip
	 * @param port 代理端口
	 * @return Spider
	 */
	public Spider proxy(String ip, Integer port) {
		HttpProxy hp = new HttpProxy(ip, port);
		seed.setFetchHttpProxy(Lists.newArrayList(hp));
		return this;
	}

	/**
	 * 设置一组代理

	 * 爬虫会自动检测,如果代理不能用,会立刻停止
	 *
	 * @param list 代理列表
	 * @return Spider
	 */
	public Spider proxys(List<HttpProxy> list) {
		seed.setFetchHttpProxy(list);
		return this;
	}

	/**
	 * 加载系统自带的http_proxy文件 注意:调用此方法之前请确保conf/http_proxy文件中有可用代理
	 *
	 * @return Spider
	 */
	public Spider defaultProxy() {
		seed.setFetchHttpProxyFile(DefaultConfig.http_proxy);
		return this;
	}

	/**
	 * 伪造一个UserAgent
	 *
	 * @param userAgent 自定义useragent字符串
	 * @return Spider
	 */
	public Spider userAgent(String userAgent) {
		seed.setFetchUserAgent(Lists.newArrayList(userAgent));
		return this;
	}

	/**
	 * 伪造一个列表的UserAgent
	 *
	 * @param userAgents 自定义useragent字符串
	 * @return Spider
	 */
	public Spider userAgents(List<String> userAgents) {
		seed.setFetchUserAgent(userAgents);
		return this;
	}

	/**
	 * 默认加载系统自带的UserAgent
	 *
	 * @return Spider
	 */
	public Spider defaultUserAgent() {
		seed.setFetchUserAgentFile(DefaultConfig.user_agent);
		return this;
	}

	/**
	 * 下载本地根路径,默认地址为$path/data/download/ 子目录是${seedName},用来表示每个seed对应不同的下载子目录
	 *
	 * @param disk 磁盘路径
	 * @return Spider
	 */
	public Spider downloadDisk(String disk) {
		seed.setDownloadDisk(disk);
		return this;
	}

	/**
	 * 默认的下载本地路径 默认地址:$path/data/download/${seedname}
	 *
	 * @return Spider
	 */
	public Spider defaultDownloadDisk() {
		seed.setDownloadDisk(DefaultConfig.default_value);
		return this;
	}

	/**
	 * 下载到hdfs路径
	 *
	 * @param hdfs hdfs地址
	 * @return Spider
	 */
	public Spider downloadHdfs(String hdfs) {
		seed.setDownloadHdfs(hdfs);
		return this;
	}

	/**
	 * 自定义页面解析类
	 *
	 * @param parser 自定义解析类
	 * @return Spider
	 */
	public Spider parser(Class<? extends PageParser> parser) {
		seed.setParseClassImpl(parser.getName());
		return this;
	}

	/**
	 * 自定义页面解析接口,用于Lambda表达式
	 *
	 * @param parser Lambda表达式或PageParser实现类
	 * @return Spider
	 */
	public Spider parser(PageParser parser) {
		seed.setPageParser(parser);
		return this;
	}

	/**
	 * 单个页面元素解析内部类,设置了此项就不能设置自定义的解析类了
	 *
	 * @param elementSelector Jsoup支持的选择器字符串
	 * @return Spider
	 */
	public Spider elementSelectParser(String elementSelector) {
		seed.setParseElementSelector(elementSelector);
		return this;
	}

	/**
	 * 将解析的结果保存到Mysql中

	 * jdbc格式:jdbc:mysql://localhost:3306/spider?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8&user=root&password=root
	 *
	 * @param jdbc 需要把用户名与密码也写到url的参数中
	 * @return Spider
	 */
	public Spider jdbc(String jdbc) {
		seed.setStoreJdbc(jdbc);
		return this;
	}

	/**
	 * 将解析的结果保存到MongoDB中

	 * mongodb://localhost:27017 或者加密
	 * mongodb://user1:pwd1@host1/?authSource=db1&ssl=true
	 * 或者多个mongodb://host1:27017,host2:27017
	 *
	 * @param mongodburl String
	 * @return Spider
	 */
	public Spider mongodb(String mongodburl) {
		seed.setStoreMongodb(mongodburl);
		return this;
	}

	/**
	 * 将解析结果进行Lucene索引并且保存 子目录是${seedName},用来表示每个seed对应不同的下载子目录
	 *
	 * @param indexPath Lucene索引存储的磁盘根路径
	 * @return Spider
	 */
	public Spider lucene(String indexPath) {
		seed.setStoreLuceneIndex(indexPath);
		return this;
	}

	/**
	 * 将解析结果索引保存到本系统/data/index目录下
	 *
	 * @return Spider
	 */
	public Spider defaultLucene() {
		seed.setStoreLuceneIndex(DefaultConfig.default_value);
		return this;
	}

	/**
	 * 将解析结构保存到hbase数据库中
	 *
	 * @param address hbase地址
	 * @return Spider
	 */
	public Spider hbase(String address) {
		seed.setStoreHBase(address);
		return this;
	}

	/**
	 * 下载文件命名规则,一般为default或url两种类型 url表示文件名中包含url,default表示不包含
	 *
	 * @param isContainUrl boolean
	 * @return Spider
	 */
	public Spider downloadFilenameRule(boolean isContainUrl) {
		if (isContainUrl) {
			configuration.setDownloadFileNameRule("url");
		} else {
			configuration.setDownloadFileNameRule(DefaultConfig.default_value);
		}
		return this;
	}

	/**
	 * 当系统发生异常,可将相关信息发送给指定接收人
	 *
	 * @param recipient 一个或多个指定人
	 * @return Spider
	 */
	public Spider email(String... recipient) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < recipient.length; i++) {
			sb.append(recipient[i]);
			if (i < recipient.length - 1) {
				sb.append(DefaultConfig.email_recipient_split);
			}
		}
		configuration.setEmailRecipient(sb.toString());
		return this;
	}

	/**
	 * 设置一个动态字段
	 *
	 * @param name     自定义字段名称
	 * @param selector 对应字段的页面选择器
	 * @return Spider
	 */
	public Spider field(String name, String selector) {
		dynamicField.setSeedName(seed.getSeedName());
		dynamicFieldMap.put(name, selector);
		dynamicField.setFields(dynamicFieldMap);
		return this;
	}

	/**
	 * 设置多个动态字段

	 *
	 * @param fields 动态字段[字段名称,字段值]
	 * @return Spider
	 */
	public Spider fields(Map<String, String> fields) {
		dynamicField.setSeedName(seed.getSeedName());
		dynamicField.setFields(fields);
		return this;
	}

	/**
	 * 设置ftp为资源同步方式
	 *
	 * @param host     服务器地址
	 * @param port     端口号,默认为21
	 * @param username 用户名(可以为空)
	 * @param password 密码(可以为空)
	 * @return Spider
	 */
	public Spider ftp(String host, int port, String username, String password) {
		Map<String, String> ftp = Maps.newHashMap();
		ftp.put(AbstractConfig.host_node, host);
		ftp.put(AbstractConfig.port_node, String.valueOf(port));
		ftp.put(AbstractConfig.username_node, username);
		ftp.put(AbstractConfig.password_node, password);
		resourceSync.setFtp(ftp);
		Map<String, String> sync = Maps.newHashMap();
		sync.put(AbstractConfig.open_node, "true");
		sync.put(AbstractConfig.batch_count_node, DefaultConfig.sync_batch_count + "");
		sync.put(AbstractConfig.batch_time_node, DefaultConfig.sync_batch_time + "");
		sync.put(AbstractConfig.protocal_node, AbstractConfig.ftp_node);
		resourceSync.setSync(sync);
		return this;
	}

	/**
	 * 设置rsync为资源同步方式

	 * 注意:暂时不支持windows
	 *
	 * @param host        服务器地址
	 * @param username    用户名
	 * @param isModule    是否为module模式,是为true,不是则代表远程目录为false
	 * @param moduleOrDir module模式或者远程dir目录,如果是module模式,密码需
	 *                    要在服务器端配置;如果是远程dir,需要ssh-keygen配置无密码登陆
	 * @return Spider
	 */
	public Spider rsync(String host, String username, boolean isModule, String moduleOrDir) {
		Map<String, String> rsync = Maps.newHashMap();
		rsync.put(AbstractConfig.host_node, host);
		rsync.put(AbstractConfig.username_node, username);
		if (isModule) {
			rsync.put(AbstractConfig.module_node, moduleOrDir);
		} else {
			rsync.put(AbstractConfig.dir_node, moduleOrDir);
		}
		resourceSync.setRsync(rsync);
		Map<String, String> sync = Maps.newHashMap();
		sync.put(AbstractConfig.open_node, "true");
		sync.put(AbstractConfig.batch_count_node, DefaultConfig.sync_batch_count + "");
		sync.put(AbstractConfig.batch_time_node, DefaultConfig.sync_batch_time + "");
		sync.put(AbstractConfig.protocal_node, AbstractConfig.rsync_node);
		resourceSync.setSync(sync);
		return this;
	}

	/**
	 * 设置scp为资源同步方式

	 * 需要ssh-keygen配置无密码登陆
	 *
	 * @param host     服务器地址
	 * @param username 登陆的用户名
	 * @param dir      服务器端目录
	 * @param port     scp端口号,默认为22
	 * @return Spider
	 */
	public Spider scp(String host, String username, String dir, Integer port) {
		Map<String, String> scp = Maps.newHashMap();
		scp.put(AbstractConfig.host_node, host);
		scp.put(AbstractConfig.username_node, username);
		scp.put(AbstractConfig.dir_node, dir);
		port = port == null ? 22 : port;
		scp.put(AbstractConfig.port_node, String.valueOf(port));
		resourceSync.setScp(scp);
		Map<String, String> sync = Maps.newHashMap();
		sync.put(AbstractConfig.open_node, "true");
		sync.put(AbstractConfig.batch_count_node, DefaultConfig.sync_batch_count + "");
		sync.put(AbstractConfig.batch_time_node, DefaultConfig.sync_batch_time + "");
		sync.put(AbstractConfig.protocal_node, AbstractConfig.scp_node);
		resourceSync.setSync(sync);
		return this;
	}

	/**
	 * 通过反射的方式设置一个类的多个动态字段
	 *
	 * @param clazz 类
	 * @return Spider
	 */
	private void setDynamicField(Class<? extends PageParser> clazz) {
		java.lang.reflect.Field[] fields = clazz.getDeclaredFields();
		if (fields == null || fields.length == 0) {
			return;
		}
		for (java.lang.reflect.Field field : fields) {
			String name = field.getName();
			Field column = field.getAnnotation(Field.class);
			String selector = column.value();
			this.field(name, selector);
		}
	}

	/**
	 * annotation入口,如果不想一项一项设置Api,也可以写一个annotation
	 * annotation类:ListDetail(列表-详情页面)、Single(单个页面,不抓取页面上链接)、Cascade(单个页面,包括所有链接)、Site(单个站点)
	 *
	 * @param clazz 自定义Annotation类
	 * @return Spider
	 * @throws Exception 异常
	 */
	public static Spider annotation(Class<? extends PageParser> clazz) throws Exception {
		me = new Spider();
		return me.getAnnotation(clazz);
	}

	/**
	 * 动态判断Annotation
	 *
	 * @param clazz clazz
	 * @return Spider
	 */
	private Spider getAnnotation(Class<? extends PageParser> clazz) {
		Annotation[] ans = clazz.getDeclaredAnnotations();
		if (ans == null || ans.length == 0) {
			logger.error("类[{}]没有配置任何Annotation。", clazz.getName());
			System.exit(1);
		}
		for (Annotation an : ans) {
			String type = an.annotationType().getSimpleName();
			if ("ListDetail".equalsIgnoreCase(type) && clazz.isAnnotationPresent(ListDetail.class)) {
				ListDetail seed = (ListDetail) clazz.getAnnotation(ListDetail.class);
				this.pageMode(PageMode.list_detail);
				this.fetchUrl(seed.url());
				this.method(seed.method());
				this.probe(seed.probeSelector(), seed.probeSleep());
				this.detailLinkSelector(seed.detailSelector());
				this.totalPages(seed.totolPages());
				this.thread(seed.thread());
				this.timer(seed.startTime(), seed.interval());
				this.sleep(seed.sleep());
				this.sleepRange(seed.sleepRange());
				HttpProxy hp = FileUtil.formatProxy(seed.proxy());
				if (hp != null) {
					this.proxy(hp.getIp(), Integer.valueOf(hp.getPort()));
				}
				this.userAgent(seed.userAgent());
				this.resourceSelector(seed.resourceSelector());
				this.downloadDisk(seed.downloadDisk());
				this.downloadHdfs(seed.downloadHdfs());
				this.javascriptSupport(seed.javascriptSupport());
				this.jdbc(seed.jdbc());
				this.lucene(seed.lucene());
				this.hbase(seed.hbase());
				this.parser(clazz);
				setDynamicField(clazz);
			} else if ("Site".equalsIgnoreCase(type) && clazz.isAnnotationPresent(Site.class)) {
				Site seed = (Site) clazz.getAnnotation(Site.class);
				this.pageMode(PageMode.site);
				this.fetchUrl(seed.url());
				this.method(seed.method());
				this.probe(seed.probeSelector(), seed.probeSleep());
				this.thread(seed.thread());
				this.timer(seed.startTime(), seed.interval());
				this.sleep(seed.sleep());
				this.sleepRange(seed.sleepRange());
				HttpProxy hp = FileUtil.formatProxy(seed.proxy());
				if (hp != null) {
					this.proxy(hp.getIp(), Integer.valueOf(hp.getPort()));
				}
				this.userAgent(seed.userAgent());
				this.resourceSelector(seed.resourceSelector());
				this.downloadDisk(seed.downloadDisk());
				this.downloadHdfs(seed.downloadHdfs());
				this.javascriptSupport(seed.javascriptSupport());
				this.jdbc(seed.jdbc());
				this.lucene(seed.lucene());
				this.hbase(seed.hbase());
				this.parser(clazz);
				setDynamicField(clazz);
			} else if ("Single".equalsIgnoreCase(type) && clazz.isAnnotationPresent(Single.class)) {
				Single seed = (Single) clazz.getAnnotation(Single.class);
				this.pageMode(PageMode.single);
				this.fetchUrl(seed.url());
				this.method(seed.method());
				this.probe(seed.probeSelector(), seed.probeSleep());
				this.thread(seed.thread());
				this.timer(seed.startTime(), seed.interval());
				this.sleep(seed.sleep());
				this.sleepRange(seed.sleepRange());
				HttpProxy hp = FileUtil.formatProxy(seed.proxy());
				if (hp != null) {
					this.proxy(hp.getIp(), Integer.valueOf(hp.getPort()));
				}
				this.userAgent(seed.userAgent());
				this.resourceSelector(seed.resourceSelector());
				this.downloadDisk(seed.downloadDisk());
				this.downloadHdfs(seed.downloadHdfs());
				this.javascriptSupport(seed.javascriptSupport());
				this.jdbc(seed.jdbc());
				this.lucene(seed.lucene());
				this.hbase(seed.hbase());
				this.parser(clazz);
				setDynamicField(clazz);
			} else if ("Cascade".equalsIgnoreCase(type) && clazz.isAnnotationPresent(Cascade.class)) {
				Cascade seed = (Cascade) clazz.getAnnotation(Cascade.class);
				this.pageMode(PageMode.cascade);
				this.fetchUrl(seed.url());
				this.method(seed.method());
				this.probe(seed.probeSelector(), seed.probeSleep());
				this.thread(seed.thread());
				this.timer(seed.startTime(), seed.interval());
				this.sleep(seed.sleep());
				this.sleepRange(seed.sleepRange());
				HttpProxy hp = FileUtil.formatProxy(seed.proxy());
				if (hp != null) {
					this.proxy(hp.getIp(), Integer.valueOf(hp.getPort()));
				}
				this.userAgent(seed.userAgent());
				this.resourceSelector(seed.resourceSelector());
				this.downloadDisk(seed.downloadDisk());
				this.downloadHdfs(seed.downloadHdfs());
				this.javascriptSupport(seed.javascriptSupport());
				this.jdbc(seed.jdbc());
				this.lucene(seed.lucene());
				this.hbase(seed.hbase());
				this.parser(clazz);
				setDynamicField(clazz);
			} else if ("Sync".equalsIgnoreCase(type) && clazz.isAnnotationPresent(Sync.class)) {
				Sync sync = (Sync) clazz.getAnnotation(Sync.class);
				if (AbstractConfig.ftp_node.equals(sync.protocal())) {
					this.ftp(sync.host(), sync.port(), sync.username(), sync.password());
				} else if (AbstractConfig.rsync_node.equals(sync.protocal())) {
					this.rsync(sync.host(), sync.username(), sync.isModule(), sync.module());
				} else if (AbstractConfig.scp_node.equals(sync.protocal())) {
					this.scp(sync.host(), sync.username(), sync.dir(), sync.port());
				}
			} else if ("Config".equalsIgnoreCase(type) && clazz.isAnnotationPresent(Sync.class)) {
				Config config = (Config) clazz.getAnnotation(Config.class);
				if ("url".equalsIgnoreCase(config.downloadFilenameRule())) {
					this.downloadFilenameRule(true);
				} else {
					this.downloadFilenameRule(false);
				}
				this.email(config.email());
			}
		}
		return this;
	}

	/**
	 * 创建针对列表-详情页面格式的爬虫

	 *
	 * @return Spider
	 */
	public static Spider list_detail() {
		return new Spider(PageMode.list_detail);
	}

	/**
	 * 创建针对单个页面(不抓取页面上的链接)的爬虫

	 *
	 * @return Spider
	 */
	public static Spider single() {
		return new Spider(PageMode.single);
	}

	/**
	 * 创建针对单页面上(包括所有链接)格式的爬虫

	 *
	 * @return Spider
	 */
	public static Spider cascade() {
		return new Spider(PageMode.cascade);
	}

	/**
	 * 创建针对整站(不包括外链)格式的爬虫

	 *
	 * @return Spider
	 */
	public static Spider site() {
		return new Spider(PageMode.site);
	}

	private ClusterNode clusterNode;

	public Spider cluster(ClusterNode node) {
		this.clusterNode = node;
		return this;
	}

	/**
	 * 爬虫开启运行 检查Api设置是否设置正确,否则启动失败
	 */
	public void start() {
		if (Strings.isNullOrEmpty(seed.getFetchUrl())) {
			logger.error("种子[" + seed.getSeedName() + "]没有配置要抓取的url。");
			System.exit(1);
		}
		// 自动生成seed name
		if (Strings.isNullOrEmpty(seed.getSeedName())) {
			seed.setSeedName(MD5Util.generateSeedName(seed.getFetchUrl()));
		}
		if (dynamicField.getFields() != null && !dynamicField.getFields().isEmpty()) {
			dynamicField.setSeedName(seed.getSeedName());
		}
		SpiderEngine.create().setClusterNode(clusterNode).setSeed(seed).setResourceSync(resourceSync)
				.setConfiguration(configuration).setDynamicField(dynamicField).build();
	}

	/**
	 * 获取互联网上免费代理

	 * 并自动将可用的代理保存到本地http_proxy文件中

	 * 此方法一般在启动爬虫之前使用,下次在启动爬虫需要代理时,

	 * 可以直接调用defaultProxy方法即可
	 */
	public static void initFreeProxy() {
		Seed xicidaili = new Seed("xicidaili");
		xicidaili.setPageMode(PageMode.list_detail);
		xicidaili.setFetchUrl("http://www.xicidaili.com/nn/{1}");
		xicidaili.setThreadCount(1);
		xicidaili.setFetchTotalPages("5");
		xicidaili.setParseClassImpl("com.bytegriffin.get4j.parse.FreeProxyPageParser");
		xicidaili.setStoreFreeProxy(DefaultConfig.http_proxy);
		xicidaili.setFetchUserAgentFile(DefaultConfig.user_agent);
		SpiderEngine.create().setSeeds(Lists.newArrayList(xicidaili)).build();
	}

	/**
	 * 通过配置文件启动爬虫的入口方法
	 *
	 * @param args 命令行参数
	 */
	public static void main(String... args) {
		Context context = new Context(new CoreSeedsXmlHandler());
		List<Seed> seeds = context.load();

		context = new Context(new ResourceSyncYamlHandler());
		ResourceSync synchronizer = context.load();

		context = new Context(new ConfigurationXmlHandler());
		Configuration configuration = context.load();

		context = new Context(new DynamicFieldXmlHandler());
		List<DynamicField> dynamicFields = context.load();

		SpiderEngine.create().setSeeds(seeds).setResourceSync(synchronizer).setConfiguration(configuration)
				.setDynamicFields(dynamicFields).build();
		logger.info("爬虫开始启动...");
	}

}

redpajama_set_name: RedPajamaGithub


SGD Security Ltd is a maintenance and service provider specialising in all types of electronic security systems. Operating using the most advanced management software and communication technologies we strive to be as streamlined and resilient as possible. Using our quality management system (QMS) as the foundation of our business activity we also provide the highest level of service and customer support whilst still remaining financially competitive.
the leading security companies. Specialising in the most current technology and optimising on the synergy and knowledge within our group provided by our specialist I.T division, Proficient Systems Ltd, we have been able to structure our business and training program to or our clients the most accurate advice available.
We are a specialist service and maintenance company utilising the latest in management software platforms, vehicle tracking, and mobile hand held computers to operate as efficiently as possible. We are National Security Inspectorate Gold standard accredited and operated to the highest level of quality using our ISO9001:2008 accredited QMS. We believe in stability through diversity.


This career management tool has been designed as a practical guide to ways in which you may manage your career: whatever your field of research, whether you are an independent researcher or a member of a research group, whether you are an early-career researcher or already have an extensive research career, and whatever your career aspirations.
The tool has been structured using yes/no questions that will help you to think about how you are managing your career - in terms of both your current research project and your next career steps. To help you answer these questions and/or to take any actions you identify as necessary, you will find signposts to the relevant University resources to the right of this page.
The tool begins with questions and resources which are pertinent to researchers at any stage in a contract or funded period. These are followed by questions and resources which address particular stages in a contract or funded period, from induction through to steps to take towards the end of your current funding. There are some additional questions for researchers who are on their second contract and beyond.
You are encouraged to look through all of this career management tool, in order to get a sense of where you are now and what you may want to begin thinking about for the future. You may download a version of this tool from this page. You may also find it helpful to be aware of guidance for principal investigators/supervisors of researchers, and for heads of department and departmental administrators. This guidance may be accessed from the links on this page.
We hope very much that you will find this career management tool valuable and that it will help you to make the most of your experience as a researcher at Cambridge.


text:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_no_data"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">
    <ImageView
        android:id="@+id/iv_no_data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_default_image_square_light"/>
    <TextView
        android:layout_marginTop="20dp"
        android:id="@+id/tv_no_data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="@string/likes_no_data"/>
</LinearLayout>


text:
What does Set Fire to the Rain mean?
Adele: Set Fire to the Rain Meaning
Tagged: Bad Relationships | Fire and Smoke | Moving On | Rain | Betrayal and Double Crossing [suggest]
Get "Set Fire to the Rain" on MP3:
Set Fire to the Rain Lyrics
Play "Set Fire to the Rain"
I let it fall, my heart,
And as it fell, you rose to claim it,
It was dark and I was over,
Until you kissed my lips and you saved me,
My hands, they were strong, but my knees were far too weak,
To stand in your...
Sad_Monkey
The opening verse sets the stage, with the singer being heartbroken from a previous relationship. She was helpless ("I let it fall"), but a new lover stepped in ("you saved me").
She was strong ("my hands .. were strong"), but she was not strong enough to protect herself from this new lover ("too weak … [fell] to your feet"). She lost herself (again "falling"), and the lover took advantage.
The new lover was manipulative ("the games you'd play … you would always win") and deceitful ("the things you'd say .. were never true"), and as the relationship progressed, this darker side of her lover became clear ("there's a side to you that I never knew").
At this point she revolts against her situation. She can't manage it, so she lets her anger out to protect herself – "let it burn" expresses the destructive response of desperation.
Burning the rain is impossible, of course. Her tears are the rain ("it burned while I cried"). The rain drops are a metaphor for her tears, just like burning water is a metaphor for the impossibility of burning away heartache, as well as a metaphor for pain and injury.
At this point the relationship is still going, but it's stormy. It's a dramatic rollercoaster. In the second part of the chorus, she sets "fire to the rain", but in the next verse they are back together. In moments in this dysfunctional relationship, there's eternal peace ("I could stay there … forever", "nothing gets better").
But the dark side of her lover is still there, the first part of the chorus repeats, as she is again, and again, reminded and confronted with the dark side of her lover.
Finally she throws more "fire" at the relationship. Now everything burns, without a hope of being repaired. She knows she has to "burn the rain" until the relationship is destroyed. She has to. But it's painful ("as I touched your face … it burned while I cried … screaming out your name").
So, the second part of the chorus is extended, but with a crucial twist. There's no going back ("I threw us into the flames … something died"). That's it, it's over ("that was the last time").
In the next and final new verse, the relationship is over, but not her love. Her dark lover still owns her heart ("that heart you caught must be waiting for ya"). It's over, she's burned everything to the ground, but she still wants her lover ("I can't help myself from looking for ya"). Fire is irreversible, it destroys, but it's the only thing left for her to do.
Now she's alone, heart broken twice, and this time she can't move on. She "wake[s] up by the door", presumably from crying herself to sleep, alone on the floor of her home. It's over, but she remains caught in her heartache and loneliness.
The coda (last line of the song) leaves us with what's left of her sentiment. "Let it burn": come what may, whatever, screw all of this:/ "let it burn".
The song is gorgeous, sung beautifully by Adele obviously, but every word plays a part in telling the story. Poetry.
Apr 4th, 2011 4:09pm report
In the beginning, it seems as if she has just ended a relationship. She is torn from that relationship and is in pieces (i.e. "I let it fall, my heart" and "It was dark and I was over").
She comments at how this new relationship helped her pull herself together (i.e. "And as it fell, you rose to claim it" [...] "Until you kissed my lips and you saved me"). She emphasizes how much influence this new relationship had on her and maybe how she didn't recognize her weaknesses in the new relationship (i.e. "My hands, they were strong, but my knees were far too weak / To stand in your arms without falling to your feet").
The rest of the song is exploring this second partner and how she ended the second relationship.
It is evident that this partner is two-sided, deceitful and manipulative (i.e. "But there's a side to you that I never knew, never knew / All the things you'd say, they were never true, never true / And the games you'd play, you would always win, always win").
Adele uses a very deep metaphor to describe how she ends the relationship (i.e. "But I set fire to the rain / Watched it pour as I touched your face / Well, it burned while I cried / 'Cause I heard it screaming out your name, your name). The metaphor is obviously open to many interpretations, but I think there are some basic things that she is trying to say. By "setting fire to the rain", I believe Adele is saying that had the courage to confront a situation that was draining her. I think she goes on to say that she was left hurt and deeply moved ("it burned while I cried") by the situation because all she could focus on was still her partner (" 'Cause I heard it screaming out your name").
She continues to explain the relationship by saying, "When laying with you I could stay there / Close my eyes, feel you here forever / You and me together, nothing is better". So emphasizing how much faith she had in this partner.
And again highlighting that by confronting the situation, she knew there would be no going back (i.e. "And I threw us into the flames / Well I felt something die"). Setting fire to something changes it forever and she recognizes that since she confronted the situation, she has to walk away from it because it is fundamentally changed (i.e. "'Cause I knew that that was the last time, the last time).
It is clear that she misses her partner and is left in pieces yet again (i.e. "Sometimes I wake up by the door / And heard you calling, must be waiting for you / Even now when we're already over / I can't help myself from looking for you"). But again she repeats the chorus to finalize her decision to be brave enough to face something, to confront it and to walk away from it.
I think the song is absolutely beautiful, with deep metaphorical meaning. And while this is my interpretation, I know that each person will find their own meaning.
May 22nd, 2011 5:44am report
Setting fire to the rain, for me is about doing the impossible. I believe that when she was leaving this manipulative person, she was still in love with him and therefore breaking it off was as powerful and as hard as setting fire to the rain.
The fire continued to burn and destroy the relationship while she cried and mourned the loss. The main theme of the song, as I see it, is the powerful conflict of leaving a person that is bad for you while you still love them.
In the end of the song she admits that it is over but she is still longing for the man she left.
Jun 14th, 6:40pm report
I think to the song as my album to mark my calendar is to updated the dongs into recording voices, but I typed up voice recorder, when I use my voice to help me out and it's very helpful to use that tool to help me understand. But when it's complicated my mother doesn't know it at all.
Jun 1st, 6:00pm report
I think the song is to have relationship but me and Shawn are in a relationship but we're going to have the producer work on it, my friend Patrick had been out of town to Massachusetts. But I've been sending him the song when he's out of town. Since he's in my house or anything I need to work on.
Nov 23rd, 2018 11:22pm report
She wants to light up. The lighter struggles to work in the rain.
I have to set things on fires, because I have the most relationship with my husband, I'm done with the album rest of the year, I'm very happy to healing that, I went to the studio, then I'm recording my voices to heavy and even broken pieces. The important thing about my album twenty one, irs about female empowering and young lovers.
My interpretation of this song is that it is about her relationship with God. In the beginning she let herself "fall" into God's arms and she trusted him. As she got older and life started to turn her away she learned things about god (maybe truth, maybe lies) that made her question her loyal devotion. Setting fire to the rain is a way of questioning God. Water and fire both do the same thing which is erode. Erode away the lies to see the truth underneath. Adele used her own wisdom to put God under the microscope and fill her mind with doubts leaving her feeling abandoned, lied to and empty. Her head decides God is not real but her heart continues to search because deep down she knows she needs God. This song is meant to lead people astray and to find beauty in their fall. Only when you return to God will true beauty return.
I am sure she was in a relationship with a Narcissis.... It Sound like the typical pattern.
Jan 15th, 2016 1:32am report
I know from her own lips during an interview it was about the old relationship dying and him calling her a fat bitch and telling her that she wasn't able to strike a cig in the rain...she threw the lighter down and said she knew that would be the last time she ever saw him....
So the first verse sees Adele explain at the very beginning how she left a man to join somebody else for a fresh start. After those first two lines, she explains how before she met the new person, she felt very isolated and full of despair. But then when this man showed her affection and love, she felt as if her life was saved, as they were already together. She then describes how she felt happy being with him, but her heart obviously wouldn't let him go. She just fell for him instantly, even though she tried to be strong.
In the pre-chorus, Adele then explains how she eventually saw his true colours; he was two-faced, a liar, and always played games with her mind and heart, and it just wouldn't stop.
Then in the chorus, she then explains metaphorically how she is strong enough to stop crying and just leave this man, now she knows who he really is, by setting fire to the rain (her tears). But then in the next line she goes through some old photos of them together, taken long before she unearthed his true personality, and stares at it while crying tears of flames, and was rubbing her finger over his face as soon as the tears hit the picture; a good metaphor for a memory that is slowly fading away. She is hurt after seeing it because she still feels like she wants to see him again.
The second verse sees her describe that when she is next to this man, like it is forever, she puts all the negative behind her and just relaxes, and is in heaven when she feels this way. She thinks nothing else is better; she feels loved by him, even though she keeps getting hurt.
The next chorus is extended; after the first four lines, she digs deeper in terms of explaining how she breaks up with him. She throws them into the flames, which is a metaphor for the chance of a pure relationship being damaged. She then felt something die, which was obviously her potential significant other, not physically, but he has already broken up with her. The final line tells us that there is no going back; they're done.
The bridge sees Adele left heartbroken yet again after leaving him, and how much she misses being with him. She obviously cannot help but think of him on certain occasions.
Nov 3rd, 2014 11:37am report
Wondering who the person is who always ties every song by every artist to illuminati. This is about a breakup and another breakup! We all have proof of such! This whole album is about the mess Adele was in after her breakup. While this guy was probably a jerk, I don't think she was singing about Satan. It's a powerful, moving, brilliant song, one that proves that good things come out of bad situations.
Jun 18th, 2014 6:30am report
People ,this song is about satan and god and god's names.
I guess I see it as a song about her falling for someone. She probably shouldn't have fallen for him but she did. For whatever reasons she just couldn't help herself. She realized after some time that he wasn't the person she thought. She felt a little foolish for having fell for him like all the other women did. However the love she felt for him was real to her and she was upset to have to let go of him. She cried real tears for him and just realized she couldn't do it anymore. When she says she set fire to the rain it means she stopped crying and let go of her love for him. Letting go helped her to move forward. SHES MOVING FORWARD WITHOUT HIM. He can't play with her feelings anymore because she's done. Done!
The way I see it, she fell in love but he played her so she is now trying to find herself.
This is my interpertation again her producer who married someone else while she didn't even know it and she found out when adele was doing her second album
Her ex boyfriend dumped her and married someone else and now she's finding herself right now
May 8th, 2013 5:13am report
Nobody ever thought about Gaslighting while listening to this ?
‹ prev	12345678	next ›
More Adele song meanings »
Adele Fans Also Like:
One Direction song meanings
Email me when new interpretations are posted for Set Fire to the Rain
Adele Song Meanings
Chasing Pavements
Don't You Remember
He Won't Go
Rumour Has It
I Can't Make You Love Me
Hometown Glory
I'll Be Waiting
Hiding My Heart
Between Rock and a Heart Place

redpajama_set_name: RedPajamaCommonCrawl


HIPPY KILLER HOEDOWN: HKH 6 Updates!
Okay So I am super bummed to announce that my friends and F-ing mind blowing duo plus one, the Picture books and Claus Grabke can't make it to this years Hoedown. We went back and forth on this and they just could'nt make it happen and wanted to let you guys know.
" We are very sorry to announce that the picturebooks will not be performing at the Hippy Killer Hoedown in April. Visa issues are forcing us to postpone our tour plans until June. There's absolutely nothing we can do about it sorry! We so wished to be at this fantastic event and be a part of the action! We will be back though, cant wait to tour the USA again, Dates soon!"
Thanks dudes and I will see you in Germany at the end of May!


text:
Poster Collections
Poster History
Email: info@artifiche.com
Tue: 11am-2pm, by appointment only
Wed: 2-6pm, by appointment only
Thu: 11am-2pm, 4-7pm, by appointment only
2G rule
Swiss Juice Market in Zurich
Artist: Burkhard Mangold
Size: 101 x 67 cm / 39.8 x 26.4″
Poster sold
About this poster
Burkhard Mangold was born in Basel in 1873, where he served an apprenticeship as an ornamental painter and attended courses at the "Gewerbeschule" in Basel. He went to Paris in 1894 and studied in Munich until 1900 where he had a studio for decorative art. He returned to Basel and worked as a teacher for lithography and glass painting. Mangold designed posters from 1896 onwards and obtained various awards for his works. In 1905 he gained the attention of lithographer J.E. Wolfensberger and designed several exceptional, Jugendstil-influenced posters like this image announcing the 5th Swiss Cider Fair to be held at the Zurich Tonhalle in 1909.
Burkhard Mangold was born in 1873 in Basel, where he died in 1950. From 1889 to 1894 he served an apprenticeship as an ornamental painter and attended courses at the "Gewerbeschule" in Basel. He went to Paris in 1894 and studied in Munich until 1900. There, he had a studio for decorative art. He returned to Basel and worked as a teacher for lithography and glass painting at the "Gewerbeschule" from 1915 to... more
Read biography
Posters by Burkhard Mangold
Burkhard Mangold was born in 1873 in Basel, where he died in 1950. From 1889 to 1894 he served an apprenticeship as an ornamental painter and attended courses ...
at the "Gewerbeschule" in Basel. He went to Paris in 1894 and studied in Munich until 1900. There, he had a studio for decorative art. He returned to Basel and worked as a teacher for lithography and glass painting at the "Gewerbeschule" from 1915 to... more
Poster No.: 3324
Burkhard Mangold
Printer: Gebr. Fretz AG, Zürich
Printing technique:
Stone lithograph in colours
Condition: A/J
Excellent condition. Picture preserved completely. Wrinkles and small tears, if any, restricted to edges. Mounted on acid-free Japanese vellum.
BeverageLiquor, Beer & Wine
Burkhard MANGOLDCity of Zurichmarket in ZurichZurich music hallAntique posterHistorical posterNostalgicturn of the century
Publications:Reihe Schweizer Plakatgestalter 1 - Burkhard Mangold - 1873 - 1950
Posters of this category
Kupferberg Gold Sparkling Wine
Julius Klinger,1912
Bitter Dennler, Interlaken
Artist unknown,1910
Real Jamaican Rum
Chocolat Suchard
Tuesday: 11am-2pm*
Wednesday: 2-6pm*
Thursday: 11am–2pm, 4–7pm*
* = by appointment and 2G rule only
Sign up to our newsletter if you'd like to be informed occasionally of our latest arrivals, special offers and more.
© 2022 by Artifiche AG, Member of IVPDA
Press / Links / Terms and Conditions / Privacy policy
This website uses cookies to guarantee you the best possible service. If you continue surfing on the site, you agree to the use of cookies. Details can be found in our privacy policy.Agree


You want a plan you can be on – For Now. For Life.
Lifetime Membership – Only $24.99!
On this plan, we make it easy for you to be vegan, pesco-vegetarian, or omnivore (poultry & meat), while following a pure food weight loss program. We have plenty of vegan protein options and serving size guidelines to ensure you get adequate amounts of protein. If you decide to include fish, we provide a list of what to eat and avoid. If you decide to eat meat, we encourage you to limit your intake of organic poultry and grass-fed beef, while helping you integrate a wider variety proteins that yield a return for your health.
We limit dairy, because it can be irritant for many people and may lead to unpleasant digestive side effects and inflammation. There is some contradictory research and unknown risks about the connections between cancer, dairy and the hormone content in dairy products (including organic). Women – particularly those with a personal or family history of breast cancer – should reduce their dietary intake of hormones. For those reasons, PowerPerks 101 is dairy-free. For those who choose to include dairy, we recommend that they only have organic kefir/yogurt due to its lower content of IGF-1.
Research suggests that being mindful of the quantity and quality of the fat you eat may prevent cancer or its recurrence. On PowerPerks 101, we prioritize which fats should be front and center in your power pantry. We emphasize those containing anti-inflammatory omega-3 fatty acids which are shown to help prevent certain cancers, cardiovascular disease, rheumatoid arthritis, and cognitive disorders.
On PowerPerks 101, we eliminate the added sugars and the white/refined carbs (they are basically sugar), and ask you to fuel yourself with natural whole foods like fruits, veg, whole grains, and legumes. Over time you'll stop craving the refined foods and start thriving on the real deal. If you find that you do need a touch of sweetness, you can sparingly try some of these options: dates, raw honey, pure grade A maple syrup.
While much research is still to be done, it's believed that many people see great results by going gluten-free because you naturally reduce the amount of refined grains that you eat. By adding more wheat-free whole grains into the diet, you're getting excellent nutrients and less refined foods. If your body tolerates gluten without any difficulty, the key is to include wholesome grains and avoid pulverized options.
No, we won't be selling you a line up of supplements, rather, we'll be loading you up on unique healing spice combinations, herbs and lots of power foods to amp up the nutri-power of your meals, snacks and beverages. Some spices and foods work far better together, synergistically boosting their health benefits — think of them as the ultimate power couples! PowerPerks includes surprising absorption boosters and spice and power food synergy concepts. "Food First" is our mantra!
Wish we could tell you otherwise, but research tells us that it's best to avoid if you have a personal or family history of cancer. Otherwise, limit to 1 – 3 drinks per week, but keep in mind: the calories stack up.
Avoid overly processed foods that can throw off your gut microbiota, make you gain weight and make weight loss harder. These foods don't offer the same nutritional benefits as what we consider "Real Food" from whole foods so leave them off the menu.
Feel the PowerPerks Difference – Start Your Journey Today!


text:
Fall Down, Get Up Again- a Column by John Connor
My Right Arm Is Going to Look Really Young
by John Connor | June 10, 2022
I've just received four intramuscular Botox injections in my right arm to relieve the muscle spasticity that comes with multiple sclerosis. (OK, it wasn't actually Botox, but Dysport, or abobotulinumtoxinA, another medication derived from the botulinum toxin to block muscle contractions.)
And "my right arm is going to look really young" is the gag I've been cracking ever since the treatment was proposed to me by my spasticity neurologist two months ago. So when I told the bunch of comedians I'd assembled for our now annual outing of my comedy show "The Edge" about the "Botox," they scrambled to deliver exactly the same gag.
As comics, they didn't quite believe me when I told them that they were in fact two months too late.
We were actually a laid-back group, happily downing complimentary drinks and food, as I ran our "creative meeting" pre-show. It's something I've been doing for over 30 years now, though I'd thought I'd never do it again. It was fun to be back, and I felt enormously better than my attempt last year. But then, I had only been out of the hospital a month after suffering from cellulitis.
May 4, 2022 News by Marisa Wexler, MS
Cannabis 'Highly Effective' Against MS Symptoms, Some Users Report
Maybe it was also the Dysport. It had been a week, and I could even type a bit with the aid of my right hand. (In fact, it has required a bit of effort, but I just managed this lot in italics.) This was something that had been completely impossible for, at least, over two years.
My doctor took great delight in informing me that the Dysport had been developed at Porton Down, the U.K.'s highly secretive germ warfare laboratory. In fact, it's the closest we've got to Area 51. Unless we've got an Area 51 that is, you know, really secret. Bad luck, Yanks.
The strand of botulism that was injected into my arm was first isolated in Porton Down, the U.K.'s highly secretive germ warfare laboratory, in 1946. Doubt they did it for "armless" purposes! (Photo by John Connor)
I countered with this: Do you know it was created during World War I? He did. Spoilsport.
Anyway, I do get to tell youse lot. A very clever German scientist named Fritz Haber led a team called "the Disinfection Unit" to introduce poison gas to the battlefield at Ypres, in modern Belgium, in 1915. He's also remembered for creating the fixing of nitrogen, which led to artificial fertilizer and saved the future, fast-growing human population from starvation. Something of a dichotomy.
The British hastily set up Porton Down to create countermeasures. Love a historical diversion. All roads lead to Rome. See — even more history.
My arm is no longer clasped across my chest like I was impersonating Napoleon (soz, I can't stop) and now at least looks relatively normal. Though its range has increased massively compared with before, it still is extremely limited.
I managed to use it briefly to hold a fork at the dinner table. Still couldn't eat with it, though.
And there's absolutely no chance of my right hand passing the salt. Or if I spill it, shaking it over my shoulder to ward off the devil.
Fortunately, as I'm an atheist, he's not there.
Note: Multiple Sclerosis News Today is strictly a news and information website about the disease. It does not provide medical advice, diagnosis, or treatment. This content is not intended to be a substitute for professional medical advice, diagnosis, or treatment. Always seek the advice of your physician or other qualified health provider with any questions you may have regarding a medical condition. Never disregard professional medical advice or delay in seeking it because of something you have read on this website. The opinions expressed in this column are not those of Multiple Sclerosis News Today or its parent company, BioNews, and are intended to spark discussion about issues pertaining to multiple sclerosis.
John Connor In the '80s, John created the first regular column about the burgeoning London stand-up scene. In 1990 he wrote a book about its effect on the Edinburgh Festival: "Comics: A Decade of Comedy at the Assembly Rooms." That year he also devised and ran a live topical stand-up team show at The London Comedy Store, The Edge. (It was destroyed in 2020!) In 2009 John was diagnosed with RRMS, which cut short his main job as a TV casting director for "Black Books," "My Family," et al. Now, John writes "Fall Down Get Up Again," an irreverent journey with MS, and also serves as MS News Today Forums co-moderator.
abobotulinumtoxinA, Dysport, MS treatment, muscle spasticity, neurologist
Patricia P. Garrett
Totally Useful information! I cannot wait to share with my support group.
Fill in the required fields to post. Your email address will not be published.


Columba Di Pasqua sometimes called Columba Di Pasquale is an Italian Easter bread which literally means Easter Dove and traditionally it is made in the shape of a dove although the shape usually looks more like a cross to me (one long piece in the middle and two balls usually get baked in a paper mould) This bread is very similar to the Christmas Panettone which I just love (I have posted a recipe for Panettone ) This bread usually has candied orange peel or other fruits but, unlike the Panettone does not normally have raisins in it. Very few people ever make this or the Panettone because it is a labour of love and is made over two days. I say what a nice way to show someone you love them by making this kind of special treat! Mine has the lovely scent of orange, lemon, candied ginger and a bit of orange flavoured cranberries.
Second Rise – This is done on the day you are baking the bread and after the first rise has occurred.
all the dough from the first rise plus….
1 – 1 1/2 cups chopped candied peel like orange and lemon or other dried fruits you like. I made mine with candied orange and lemon peel, crystallized ginger and a bit of dried orange flavoured cranberries.
If you do not have a sourdough starter then you need to create a quick overnight starter. Make the Biga by mixing all ingredients and leaving in a covered plastic container on the counter for 15-19 hours. So…if you want to make your bread on a Saturday create the Biga on a Thursday and leave it until Friday when you will start to make your bread with the First Rise portion of the recipe. This is important because time creates a better flavoured bread rather than making it quicker with more yeast. I told you this was a labour of love! This is what the Biga looks like after 17 hours.
In the bowl of a stand mixer add everything for the First Rise: your Biga or sourdough starter, flour, honey, egg yolks, water and yeast. Mix well to incorporate and then mix on high for 5 minutes. Once you have mixed it then add your softened butter and mix another minute. At this stage the dough is very wet. Cover with plastic wrap and leave on the counter to rise 15-18 hours. I started mine in the afternoon and then did the second rise the next morning.
Chop all your peel (I make my own – see link) and dried fruit. Add everything to the bowl for the Second Rise: the dough from the day before, flour, honey, olive oil, salt. 3 egg yolks, vanilla, orange zest, lemon zest, chopped orange peel, lemon peel, candied ginger and cranberries. Mix until incorporated and then mix on high for 5 minutes.
Cover and let rise 3 hours. The dough will still be quite wet.
In a food processor make frosting. Mix all ingredients for 1 minute. Set aside.
Once the dough has risen for 3 hours take the additional 1 cup of flour and add a bit at a time until it is all incorporated. I like to do this by hand because I like to feel the bread. The dough is very soft at this stage and I use a scraper to move it around the flour until it is dry enough for me to start kneading. If you prefer you can simply add the flour to the dough in the stand mixer with the dough attachment until it is absorbed and easy enough to manage.
You can form into the traditional dove shape or make into smaller loaves. I made 3 so I could share with my neighbors.
I used foil tins because I was giving them away but, they are not ideal. Make sure you oil them to avoid sticking and I turned up the rim of the tins so they would contain the frosting. Generously add frosting and then a sprinkle of sliced almonds. When I make the Panettone I like to use tall sided non stick baking pans.
Let rise again 1 hour. Heat oven to 350 degrees F.
Let cool and then slice and enjoy! Share with your neighbors while the bread is still warm for optimal wow factor!
Ham and pineapple are amazing on pizza and in this rice. When you have some extra ham this is a great thing to make. I take the ham and use a food processor to make it finely minced but, if you like chunks feel free to chop it as you like.
1 cup rice – cooked in 2 cups of water – let come to a boil then cover and turn to low and leave it.
Step 1: cook rice, (or use leftovers) chop onions, red chili and clean thyme leaves from stalks.
Step 2: mince ham in a food processor. In a pan saute ham, pineapple, onions and thyme. Cook to remove some of the water and start to brown.This will take 5-10 minutes on medium heat.
Step 3: add rice, chopped chili, spring onions and cilantro along with a few tbsp olive oil. Fry on high heat for a few minutes. Taste and add salt and pepper and a bit of soy sauce.
This tart has the beautiful fresh taste of lemon and herbs along with the slightly sharp tang of young goat cheese, asparagus and eggs. Served with a drizzle of exceptional oil like Mandranova Biancolilla, some more fresh basil and a salad and you have the perfect spring lunch.
Step 1: remove woody bottoms of asparagus and in a small pan with 1 tbsp of olive oil and 2 tbsp water, salt and pepper cook asparagus and sliced leek for 3-4 minutes until the water evaporates and the asparagus gets bright green. It should still be crunchy but, no longer raw.
Step 2: in a small dish or baking pan unfold the thawed puff pastry. I used a narrow ceramic dish just to have a lip of pastry to contain your eggs. You can use a pie plate or any square baking pan. I just made sure that the puff pastry went up the sides of the dish. Dock the pastry with a fork so it doesn't puff too much and place asparagus spears in a decorative manner that you like!
Step 3: in a small bowl add eggs, ,milk, (or cream, or non dairy substitute) lemon zest, lemon juice, basil, spring onions and parsley (leave some fresh basil for sprinkling on top just before serving) Beat with a fork until mixed well and pour evenly over tart. Add small blobs of goat cheese and the leeks.
Step 4: add some shaved Manchego cheese and a sprinkle of salt and pepper.
Bake in a heated 350 degree F oven for 30-35 minutes until top is browned and beautiful.
Immediately add a drizzle of good olive oil and some chopped basil. Serve with a side salad. I just had a sliced tomato, olive oil, salt, pepper and a bit of balsamic vinegar.
You can make this dish with or without meat. Pasta Primavera is typically pasta with fresh vegetables, lots of herbs and grated cheese at the end. You can make this with almost any kind of vegetables you like. I have prepared mine with purple kale, cabbage, red peppers and some fresh spinach and herbs. A good drizzle of olive oil and perhaps some grated Parmesano Reggiano and all is well in the world tonight!
pasta – enough for your crowd – cooked al dente – I used tagliatelle which is a flat egg noodle but you can use any noodle you prefer.
Step 1: chop chicken and onions. In a large pan with olive oil cook chicken, onions, Italian seasoning, salt and pepper until starting to brown and carmelize. This will take approx 15 minutes stirring to avoid burning. If you have bits that stick to the bottom of the pan this is good and imparts lots of flavour to the finished sauce.
Step 2: add your tomato sauce. I prepare my sauce by taking a carrot, a stalk of celery, a 1/2 onion, 3 cloves garlic, 5 basil leaves and a handful of parsley and puree until almost a paste in a food processor. I then pour everything into a pan with a good glug of olive oil and cook for 5 minutes. I add a can of tomato puree and cook 10 minutes. Add salt and pepper and that is your base sauce. You could always add a decent can of spaghetti sauce if you prefer not to make your own.
Step 3: get your water going to cook your pasta. Cook according to your pasta instructions.
Step 4: chop all remaining ingredients and in a saute pan with a bit of olive oil cook kale, cabbage, red pepper, chili pepper until partially cooked. This will only take 5 minutes. Add to the tomato sauce.
Step 5: just before serving add spring onion, basil and mixed greens or spinach. Taste and adjust salt and pepper if necessary.
Step 6: drain pasta (always keeping some of the pasta water to thin out the sauce if necessary!) Toss pasta in sauce and coat until combined.
Serve with a good drizzle of your best olive oil and some grated Parmesan cheese if you like.
Jicama (pronounced Hee-Ka-Ma) is one of my favourite ingredients to add to a salad. It is a crunchy, slightly sweet root vegetable. In this salad I have sliced jicama, apples and some purple cabbage and tossed with some good olive oil, some lime, fresh basil and mint to create a fresh, bright and crunchy salad. You could also add more cabbage to create more of a slaw if you like.
Step 1: Jicama can come waxed or un-waxed. This one is covered in wax to store it longer in the store. Slice off the outer skin and then slice the inside white flesh into thin slices and then into sticks.
Step 2: slice the apple into thin slices as well. Add both the apples and jicama to a large bowl.
Step 3: chop your chili pepper, cabbage fresh basil and mint. Add all remaining ingredients to the bowl and toss to combine. Taste and adjust seasoning as necessary.
It`s fresh, crunchy and bright!
Just a small amount of crab can make a nice appetizer or lunch. This combination of lemon and crab, along with the smooth avocado and some good olive oil make a beautiful little tea sandwich or cracker topping or perfect just sprinkled over a salad.
Step 1: this is best if you have fresh but I bought a can of crab to try it and was pleasantly surprised. It is a perfect amount for two people as well. Drain water and add crab to a small bowl.
Step 2: chop mint, parsley, spring onion or shallot and add to crab.
Step 3: Add lemon juice, olive oil, salt and pepper to crab. Toss gently so crab maintains some shape.
Step 4: mash an avocado and add an additional squeeze of lemon, salt and pepper.
I add a green salad and a sliced cucumber and topped simply with the great olive oil, salt and pepper.
This is a moist and delicious pound cake made with olive oil instead of butter and dotted with blood oranges. It bakes up perfectly and I love knowing that I am using a healthier fat that in now way reduces its flavour. Try it.
Step 1: Wash and zest one orange to get 1 tbsp of zest. Place zest into a glass measuring cup.
Step 2: Remove top and bottoms of 2 oranges. Slice off peel by slicing knife down the peel. Carefully slice the orange segments with a small knife leaving the membrane between each orange segment. Place segments into the glass measuring cup. Squeeze the remaining membrane into the measuring cup to extract any additional juice. Top off with buttermilk until you get 2/3 cup liquid.
Step 3: Supreme the third orange and set aside to place on top of batter.
Step 4: In a bowl add orange/buttermilk mix, olive oil, sugar, eggs and vanilla. Whisk to incorporate.
Step 5: In another bowl add flour, baking soda, baking powder and salt. Mix with a whisk.
Step 6: Add wet ingredients to dry and stir until just combined.
Step 7: pour into buttered and floured pan. Add additional orange segments. Bake in a 350 degree F oven for 45 minutes until nicely browned and a toothpick inserted in top comes out clean.
Let cool 10 minutes and remove to a cooling rack.
Step 2: Remove top and bottoms of 2 oranges. Slice off peel by slicing knife down the peel. Carefully slice the orange segments with a small knife leaving the membrane between each orange segment. Place segments into the glass measuring cup. Squeeze the remaining membrane into a measuring cup to extract any additional juice. Top off using buttermilk until you get 2/3 cup liquid.
Slice and serve with a blob of whipped cream and some orange segments.


Rules for binary options strategy Gimmee Bar The main features is to trade when it is in a range. Determine the range for slope = Bollinger bands when they are relatively flat, you are within range.
The Bollinger bands with WPR binary options strategy is a trend-reversal system that is inspired by a classic strategy Bollinger bands and Moving Average. The suitable timeframe for this method is 5 minutes and higher with an expiry time of 3-5 candles.
The Bollinger Bands trading strategy is one of the simplest tools a new trader can use and one of the most effective ones to implement in binary options trading. Its main purpose is to signal the investor when the price of the binary options are likely to rise or decline in the close future.
Forex Bollinger Bands Breakout Binary Options Strategy: This 5 min Binary Options Strategy High/Low is based on the Bollinger Bands Breakout Method. Markets: any.
Binary Options forex indicators iqoption opciones binarias trading. 21:03. Bollinger Bands - Indicator What are Bollinger bands? lower Bollinger Band and selling it when the price has bounced from the upper Bollinger line is a widely used trading strategy with high profit-generating potential.
12/8/2018 · Bollinger Bands Using WPR Currency Trading Binary Options Trading Approach is a Combo of Metatrader 5 (MT5) Index (s) along with template) Depending on this advice, additional price movement can be assumed by merchants and adapt this process.
Binary Options Bollinger Bands Technical Analysis Bollinger Band is the widely used trend indicator for technical analysis, developed by John Bollinger back in 1980.
Binary Options system Strategy Bollinger Bands and Zig Zag May 7, 2017 Binary option , Indicators Forex this indicator system depend forex bollinger band with zigzag in binary option trading.For long trading this system forex play very imported role in forex trend trading with easy follow just indicator .
This can be a great indicator on the Binary Options market for any type of trader. Adapting Strategy From Traditional Trading; Bollinger Bands are an amazing resource in the toolkit of any trader, whether they are looking at equity, foreign exchange, bonds, or commodities.
The binary strategy described below is mainly based on bollinger bands with trend following indicator. This is a rapid entry strategy with 5 min expiry time. Just perfect for impatient binary traders.
© Binary options strategy with bollinger bands Binary Option | Binary options strategy with bollinger bands Best binary options.


Posted in House of Marigold, Marigold Watches, Shilpa Marigold.
Posted in House of Marigold, Luxury Watches, Marigold Watches, Marigold Watches Collection, Shilpa Marigold.
A stately heritage location overlooking the QutubMinar, The Kila is Delhi's scorching new fashion destination. Joining the ranks of India's finest designers – Sabyasachi, Manish Malhotra, Manish Arora amongst others – at this prestigious retail space is The House of Marigold. The Ahmedabad-based luxury watch brand – also available in Mumbai, Jaipur, Udaipur, San Francisco, with an upcoming store in Dubai – has launched its boutique flagship store in the capital on a glamorous high. Not only has The House of Marigold invigorated the capital's fashion landscape, its plush interiors have set new standards in retail interiors as the House of Marigold interiors work on the theme of 'Modern Baroque'.
Designed by the brand's CEO ShilpaChoksi along with India's finest art directorOmung Kumar, the uberluxe spaceat the Kila, near QutabMinar, features crystal chandeliers, mouldings, silk carpets and gold-hued sofas and chairs. Think luscious jewel tones with soothing pastels – olive greens, lemon and mango sorbets – swillingaround sweeping balustrades, mirrored tables with wings and 2.25 karat gold platted leaf work on walls! The veritable treasure trove of limited edition vintage clocks from European markets and Mediterranean towns also adorn the store.With three sub-brands under the label – Marigold, Aabhasa and Jacaranda – there's a wealth of bespoke watches on offer. Choksi's designs for Marigold, with rubies, emeralds and diamonds set in 18-karat gold, have been lauded for their innovation and story-telling exquisiteness.
Posted in Marigold Watches, Marigold Watches Collection, Shilpa Marigold.


text:
Q: MySQL InnoDB Foreign Key Problems I have the following tables and I am trying to run them in MySQL but I keep getting an errno 150. Just not sure why, but MySQL cannot seem to create the foreign key constraint. I have already looked at the rules for setting FKs for InnoDB and everything seems ok. Could someone please lend me another set of eyes and expertise?
-- Table publication_type (parent table)
CREATE TABLE publication_type (
  id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  publication_type varchar(55)  NOT NULL,
  tstamp timestamp  NOT NULL  DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT publication_type_pk PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

-- Table publication (child table)
CREATE TABLE publication (
  id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  authors varchar(255)  NOT NULL,
  publication_title varchar(100)  NOT NULL,
  publication_type_id int(11) UNSIGNED NOT NULL,
  user_id int(11) UNSIGNED NOT NULL,
  CONSTRAINT publication_pk PRIMARY KEY (id),
  CONSTRAINT publication_type_fk FOREIGN KEY (publication_type_id)  REFERENCES publication_type(id) ON DELETE SET NULL ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

A: The types do not match:
publication_type.id is of type int UNSIGNED
publication.publication_type_id is of type int
See also the docs: http://dev.mysql.com/doc/refman/5.1/en/create-table-foreign-keys.html, specifically:

Corresponding columns in the foreign key and the referenced key must
  have similar data types. The size and sign of integer types must be
  the same. The length of string types need not be the same. For
  nonbinary (character) string columns, the character set and collation
  must be the same.

emphasis mine.

redpajama_set_name: RedPajamaStackExchange


According to the time code on the CCTV footage, the suspects fled the apartment roughly 49 minutes later. A bag can be seen on the front of one of the bicycles. Kim K was robbed of a report $10 million dollars worth of jewelry and has been social media silent since the event. The investigation is being led by the French police's Brigade de Repression du Banditisme aka the (BRB).


Very Cool Gift for son, daughter, sister, brother, boyfriend and girlfriend, mom, mother, dad, father, granda and grandma. Bigfoot is real Undefeated Hide & Seek Champion world, Bigfoot evidence, Sasquatch gifts, Keep it squatchy.
Reto Vintage Hide and Seek World Champion Bigfoot is real for men, women and Youth, Boys, Girls, and Kids.
Funny Reto Vintage Hide and Seek World Champion Bigfoot Hoodie, Undefeated Hide & Seek Champion World, Bigfoot Sasquatch Yeti Gift Hoodiefor Men, Women, Boys, Girls, and Kids. Perfect Gift Hoodie for wannabe park rangers, outdoor people, forest lovers and hiking dads.


text:
LAUSD labor talks
LAUSD's plan to stave off financial ruin and a potential county takeover: Cut 15 percent of central office staff and save $86 million
Laura Greanias | December 10, 2018
Updated Dec. 11
L.A. Unified is facing a new deadline to prove to its county overseers that it will be able to stay afloat.
By Monday, Dec. 17, the district must submit a revised plan to show how it will address its structural deficit that could render L.A. Unified insolvent within three years, meaning it needs to figure out how to cut its expenses or find more income so it can keep paying its bills. If it can't, it faces a takeover.
In the budget's revision that will be presented at Tuesday's school board meeting, Scott Price, L.A. Unified's chief financial officer, states that "the district continues to deficit spend, (and) a large portion of the reserves will be consumed in 2019-20 and is expected to be depleted by 2020-21."
That means two years from now, L.A. Unified will end its school year $4 million short, according to Price's letter, because its reserves will be exhausted and can no longer be used to plug the estimated $500 million each year that the district says it is spending above what it takes in. L.A. Unified's total annual budget is about $7.5 billion.
An independent financial analysis commissioned by L.A. Unified also found that the district will be insolvent by 2021-22 and warned that the district's expenditures are expected to exceed revenues in each of the next five years.
To stave off insolvency, the district plans an ongoing 15 percent reduction of central office resources, saving $86 million over two years, according to the budget revise that will be presented Tuesday. The district also plans to save $3 million ongoing by cutting attendance incentives to the Local Districts, to save $10 million by changing how it procures uniforms and to save $5.7 million on books and supplies.
The school board will vote Tuesday on the revised budget and the cost-savings plans, which include a list of specific central office positions recommended for cutting. The positions and their expected savings — which represent the total annual cost of the position, including salary and benefits — include:
• chief of police, $317,000
• 13 police officers, saving $1.3 million
• a Korean translator, $100,000
• a coordinator of counseling, $160,000
• a deputy budget director, over $200,000
• two directors of special education, who make nearly $200,000 each
• an executive director of special education, nearly $210,000
• a television producer-director, nearly $160,000
The Los Angeles County Office of Education has said the district's continued use of deficit spending — meaning it is eating into its savings to cover its operating costs — has led to a "drastic" drop in its financial reserves and "continues to be alarming."
The county has given L.A. Unified until Dec. 17 to outline how it will reverse its march toward insolvency by either cutting costs or finding new revenues. If the county is not satisfied with the district's plan, it stated that it could choose to either send in a financial expert to collaborate with the district or install a fiscal adviser — someone who essentially takes over all financial decisions for the country's second-largest school district.
After the county receives L.A. Unified's budget revision, it will respond within 30 days, a county spokeswoman said.
The district's weakening financial health is central to why the district and its teachers union have not been able to come to an agreement in its protracted contract negotiations. United Teachers Los Angeles is planning to strike in January if a last-minute deal is not cut. Last week, mediation efforts ended, and after a report that is due Friday is issued from the fact-finding panel, the union is free to strike.
L.A. Unified and UTLA have painted starkly different pictures of the district's finances: District negotiators say accepting all of UTLA's demands, which include higher salaries and lower class sizes, would "immediately bankrupt" the district and lead to teacher layoffs. UTLA says the district is overstating its financial woes and is "sitting on" money that is desperately needed in the schools.
In related news, on Tuesday Dr. Candi Clark, the Chief Financial Officer of the Los Angeles County Office of Education, sent a written statement addressing allegations by the union that she had not written her own remarks when she addressed the school board in August.
"As Chief Financial Officer for the Los Angeles County Office of Education, I prepared my own budget comments provided at the Aug. 21 meeting of the LAUSD Board of Education.
"After sharing concerns that morning regarding LAUSD's budget in a meeting with Supt. Beutner, I decided to stay and share my comments at the Board of Education meeting scheduled for later that day. I also decided to take my list of concerns and put them in a statement to the Board.
"In addition, my concerns about the LAUSD budget have been conveyed in letters to the district prior to and after the Aug. 21 Board meeting.
"While at the district office, I asked to use an LAUSD laptop because I had not brought my own. At my request, the completed statement was sent to my LACOE email address for my files.
"I expanded on these same concerns at the Sept. 11 meeting of the LAUSD Board, and these issues were also the focus of remarks by Nick Schweizer, Deputy Superintendent of Public Instruction, California Department of Education.
"The fiscal solvency of LAUSD remains an ongoing critical issue, and LACOE is committed to working closely with the district to address these concerns."
• Read more:
LAUSD parents stuck 'in the middle' as Los Angeles braces for a likely teacher strike
LAUSD's 'signs of fiscal distress' trigger two new warnings, including risk of going broke within three years
It gets worse for LAUSD: This week both the county and the state showed up to say, 'Get your fiscal house in order or else we're taking over'
'LAUSD is not too big to fail': School board members alarmed by LA County official's dire financial projections — and warnings of the possible appointment of a 'fiscal adviser'
This article was updated Dec. 11 with comments from the Los Angeles County Office of Education's Chief Financial Officer, Dr. Clark.


According to a posting at RushOnRock, Rush may be returning to the UK next summer, perhaps headlining in the High Voltage Music Festival at Victoria Park.
"...Rush could break with tradition and play one of the big British festivals next summer in support of upcoming album Clockwork Angels.
Blown away by fans' passion for the their Time Machine shows in the UK this month, the prog rock trio are already planning a swift return to these shores.
And the band's Canadian management company is looking at booking a high profile festival slot for summer 2012..."
Rush has never been known as a 'Festival Band' but with the popularity of the current Time Machine Tour and the anticipated tour in support of Clockwork Angels, it appears that the band is in high demand. As always, this should be treated as a rumor until an official announcement comes down from Rush and/or their management team.