text:
package lombok.javac.handlers;

import static lombok.core.handlers.HandlerUtil.*;
import static lombok.javac.Javac.*;
import static lombok.javac.handlers.JavacHandlerUtil.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

import lombok.ConfigurationKeys;
import lombok.EqualsAndHashCode;
import lombok.core.AST.Kind;
import lombok.core.AnnotationValues;
import lombok.core.handlers.HandlerUtil;
import lombok.javac.Javac;
import lombok.javac.JavacAnnotationHandler;
import lombok.javac.JavacNode;
import lombok.javac.JavacTreeMaker;
import lombok.javac.handlers.JavacHandlerUtil.FieldAccess;
import lombok.javac.handlers.JavacHandlerUtil.MemberExistsResult;

import org.mangosdk.spi.ProviderFor;

import com.sun.tools.javac.code.BoundKind;
import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.JCTree.JCAnnotation;
import com.sun.tools.javac.tree.JCTree.JCArrayTypeTree;
import com.sun.tools.javac.tree.JCTree.JCBinary;
import com.sun.tools.javac.tree.JCTree.JCBlock;
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
import com.sun.tools.javac.tree.JCTree.JCExpression;
import com.sun.tools.javac.tree.JCTree.JCExpressionStatement;
import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
import com.sun.tools.javac.tree.JCTree.JCMethodInvocation;
import com.sun.tools.javac.tree.JCTree.JCModifiers;
import com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree;
import com.sun.tools.javac.tree.JCTree.JCStatement;
import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
import com.sun.tools.javac.tree.JCTree.JCUnary;
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
import com.sun.tools.javac.util.List;
import com.sun.tools.javac.util.ListBuffer;
import com.sun.tools.javac.util.Name;

/**
 * Handles the {@code lombok.EqualsAndHashCode} annotation for javac.
 */
@ProviderFor(JavacAnnotationHandler.class)
public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHashCode> {
	private static final String RESULT_NAME = "result";
	private static final String PRIME_NAME = "PRIME";

	public void checkForBogusFieldNames(JavacNode type, AnnotationValues<EqualsAndHashCode> annotation) {
		if (annotation.isExplicit("exclude")) {
			for (int i : createListOfNonExistentFields(List.from(annotation.getInstance().exclude()), type, true, true)) {
				annotation.setWarning("exclude", "This field does not exist, or would have been excluded anyway.", i);
			}
		}
		if (annotation.isExplicit("of")) {
			for (int i : createListOfNonExistentFields(List.from(annotation.getInstance().of()), type, false, false)) {
				annotation.setWarning("of", "This field does not exist.", i);
			}
		}
	}

	@Override public void handle(AnnotationValues<EqualsAndHashCode> annotation, JCAnnotation ast, JavacNode annotationNode) {
		handleFlagUsage(annotationNode, ConfigurationKeys.EQUALS_AND_HASH_CODE_FLAG_USAGE, "@EqualsAndHashCode");

		deleteAnnotationIfNeccessary(annotationNode, EqualsAndHashCode.class);
		EqualsAndHashCode ann = annotation.getInstance();
		List<String> excludes = List.from(ann.exclude());
		List<String> includes = List.from(ann.of());
		JavacNode typeNode = annotationNode.up();
		List<JCAnnotation> onParam = unboxAndRemoveAnnotationParameter(ast, "onParam", "@EqualsAndHashCode(onParam=", annotationNode);
		checkForBogusFieldNames(typeNode, annotation);

		Boolean callSuper = ann.callSuper();
		if (!annotation.isExplicit("callSuper")) callSuper = null;
		if (!annotation.isExplicit("exclude")) excludes = null;
		if (!annotation.isExplicit("of")) includes = null;

		if (excludes != null && includes != null) {
			excludes = null;
			annotation.setWarning("exclude", "exclude and of are mutually exclusive; the 'exclude' parameter will be ignored.");
		}

		Boolean doNotUseGettersConfiguration = annotationNode.getAst().readConfiguration(ConfigurationKeys.EQUALS_AND_HASH_CODE_DO_NOT_USE_GETTERS);
		boolean doNotUseGetters = annotation.isExplicit("doNotUseGetters") || doNotUseGettersConfiguration == null ? ann.doNotUseGetters() : doNotUseGettersConfiguration;
		FieldAccess fieldAccess = doNotUseGetters ? FieldAccess.PREFER_FIELD : FieldAccess.GETTER;

		generateMethods(typeNode, annotationNode, excludes, includes, callSuper, true, fieldAccess, onParam);
	}

	public void generateEqualsAndHashCodeForType(JavacNode typeNode, JavacNode source) {
		if (hasAnnotation(EqualsAndHashCode.class, typeNode)) {
			//The annotation will make it happen, so we can skip it.
			return;
		}

		generateMethods(typeNode, source, null, null, null, false, FieldAccess.GETTER, List.<JCAnnotation>nil());
	}

	public void generateMethods(JavacNode typeNode, JavacNode source, List<String> excludes, List<String> includes,
			Boolean callSuper, boolean whineIfExists, FieldAccess fieldAccess, List<JCAnnotation> onParam) {
		boolean notAClass = true;
		if (typeNode.get() instanceof JCClassDecl) {
			long flags = ((JCClassDecl)typeNode.get()).mods.flags;
			notAClass = (flags & (Flags.INTERFACE | Flags.ANNOTATION | Flags.ENUM)) != 0;
		}

		if (notAClass) {
			source.addError("@EqualsAndHashCode is only supported on a class.");
			return;
		}

		boolean isDirectDescendantOfObject = true;
		boolean implicitCallSuper = callSuper == null;
		if (callSuper == null) {
			try {
				callSuper = ((Boolean)EqualsAndHashCode.class.getMethod("callSuper").getDefaultValue()).booleanValue();
			} catch (Exception ignore) {
				throw new InternalError("Lombok bug - this cannot happen - can't find callSuper field in EqualsAndHashCode annotation.");
			}
		}

		JCTree extending = Javac.getExtendsClause((JCClassDecl)typeNode.get());
		if (extending != null) {
			String p = extending.toString();
			isDirectDescendantOfObject = p.equals("Object") || p.equals("java.lang.Object");
		}

		if (isDirectDescendantOfObject && callSuper) {
			source.addError("Generating equals/hashCode with a supercall to java.lang.Object is pointless.");
			return;
		}

		if (!isDirectDescendantOfObject && !callSuper && implicitCallSuper) {
			source.addWarning("Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.");
		}

		ListBuffer<JavacNode> nodesForEquality = new ListBuffer<JavacNode>();
		if (includes != null) {
			for (JavacNode child : typeNode.down()) {
				if (child.getKind() != Kind.FIELD) continue;
				JCVariableDecl fieldDecl = (JCVariableDecl) child.get();
				if (includes.contains(fieldDecl.name.toString())) nodesForEquality.append(child);
			}
		} else {
			for (JavacNode child : typeNode.down()) {
				if (child.getKind() != Kind.FIELD) continue;
				JCVariableDecl fieldDecl = (JCVariableDecl) child.get();
				//Skip static fields.
				if ((fieldDecl.mods.flags & Flags.STATIC) != 0) continue;
				//Skip transient fields.
				if ((fieldDecl.mods.flags & Flags.TRANSIENT) != 0) continue;
				//Skip excluded fields.
				if (excludes != null && excludes.contains(fieldDecl.name.toString())) continue;
				//Skip fields that start with $
				if (fieldDecl.name.toString().startsWith("$")) continue;
				nodesForEquality.append(child);
			}
		}

		boolean isFinal = (((JCClassDecl)typeNode.get()).mods.flags & Flags.FINAL) != 0;
		boolean needsCanEqual = !isFinal || !isDirectDescendantOfObject;
		MemberExistsResult equalsExists = methodExists("equals", typeNode, 1);
		MemberExistsResult hashCodeExists = methodExists("hashCode", typeNode, 0);
		MemberExistsResult canEqualExists = methodExists("canEqual", typeNode, 1);
		switch (Collections.max(Arrays.asList(equalsExists, hashCodeExists))) {
		case EXISTS_BY_LOMBOK:
			return;
		case EXISTS_BY_USER:
			if (whineIfExists) {
				String msg = "Not generating equals and hashCode: A method with one of those names already exists. (Either both or none of these methods will be generated).";
				source.addWarning(msg);
			} else if (equalsExists == MemberExistsResult.NOT_EXISTS || hashCodeExists == MemberExistsResult.NOT_EXISTS) {
				// This means equals OR hashCode exists and not both.
				// Even though we should suppress the message about not generating these, this is such a weird and surprising situation we should ALWAYS generate a warning.
				// The user code couldn't possibly (barring really weird subclassing shenanigans) be in a shippable state anyway; the implementations of these 2 methods are
				// all inter-related and should be written by the same entity.
				String msg = String.format("Not generating %s: One of equals or hashCode exists. " +
						"You should either write both of these or none of these (in the latter case, lombok generates them).",
						equalsExists == MemberExistsResult.NOT_EXISTS ? "equals" : "hashCode");
				source.addWarning(msg);
			}
			return;
		case NOT_EXISTS:
		default:
			//fallthrough
		}

		JCMethodDecl equalsMethod = createEquals(typeNode, nodesForEquality.toList(), callSuper, fieldAccess, needsCanEqual, source.get(), onParam);
		injectMethod(typeNode, equalsMethod);

		if (needsCanEqual && canEqualExists == MemberExistsResult.NOT_EXISTS) {
			JCMethodDecl canEqualMethod = createCanEqual(typeNode, source.get(), onParam);
			injectMethod(typeNode, canEqualMethod);
		}

		JCMethodDecl hashCodeMethod = createHashCode(typeNode, nodesForEquality.toList(), callSuper, fieldAccess, source.get());
		injectMethod(typeNode, hashCodeMethod);
	}

	public JCMethodDecl createHashCode(JavacNode typeNode, List<JavacNode> fields, boolean callSuper, FieldAccess fieldAccess, JCTree source) {
		JavacTreeMaker maker = typeNode.getTreeMaker();

		JCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(typeNode, "Override"), List.<JCExpression>nil());
		JCModifiers mods = maker.Modifiers(Flags.PUBLIC, List.of(overrideAnnotation));
		JCExpression returnType = maker.TypeIdent(CTC_INT);
		ListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();

		Name primeName = typeNode.toName(PRIME_NAME);
		Name resultName = typeNode.toName(RESULT_NAME);
		long finalFlag = JavacHandlerUtil.addFinalIfNeeded(0L, typeNode.getContext());

		/* final int PRIME = X; */ {
			if (!fields.isEmpty() || callSuper) {
				statements.append(maker.VarDef(maker.Modifiers(finalFlag), primeName, maker.TypeIdent(CTC_INT), maker.Literal(HandlerUtil.primeForHashcode())));
			}
		}

		/* int result = 1; */ {
			statements.append(maker.VarDef(maker.Modifiers(0), resultName, maker.TypeIdent(CTC_INT), maker.Literal(1)));
		}

		if (callSuper) {
			JCMethodInvocation callToSuper = maker.Apply(List.<JCExpression>nil(),
					maker.Select(maker.Ident(typeNode.toName("super")), typeNode.toName("hashCode")),
					List.<JCExpression>nil());
			statements.append(createResultCalculation(typeNode, callToSuper));
		}

		Name dollar = typeNode.toName("$");
		for (JavacNode fieldNode : fields) {
			JCExpression fType = getFieldType(fieldNode, fieldAccess);
			JCExpression fieldAccessor = createFieldAccessor(maker, fieldNode, fieldAccess);
			if (fType instanceof JCPrimitiveTypeTree) {
				switch (((JCPrimitiveTypeTree)fType).getPrimitiveTypeKind()) {
				case BOOLEAN:
					/* this.fieldName ? X : Y */
					statements.append(createResultCalculation(typeNode, maker.Conditional(fieldAccessor,
							maker.Literal(HandlerUtil.primeForTrue()), maker.Literal(HandlerUtil.primeForFalse()))));
					break;
				case LONG: {
						Name dollarFieldName = dollar.append(((JCVariableDecl)fieldNode.get()).name);
						statements.append(maker.VarDef(maker.Modifiers(finalFlag), dollarFieldName, maker.TypeIdent(CTC_LONG), fieldAccessor));
						statements.append(createResultCalculation(typeNode, longToIntForHashCode(maker, maker.Ident(dollarFieldName), maker.Ident(dollarFieldName))));
					}
					break;
				case FLOAT:
					/* Float.floatToIntBits(this.fieldName) */
					statements.append(createResultCalculation(typeNode, maker.Apply(
							List.<JCExpression>nil(),
							genJavaLangTypeRef(typeNode, "Float", "floatToIntBits"),
							List.of(fieldAccessor))));
					break;
				case DOUBLE: {
						/* longToIntForHashCode(Double.doubleToLongBits(this.fieldName)) */
						Name dollarFieldName = dollar.append(((JCVariableDecl)fieldNode.get()).name);
						JCExpression init = maker.Apply(
								List.<JCExpression>nil(),
								genJavaLangTypeRef(typeNode, "Double", "doubleToLongBits"),
								List.of(fieldAccessor));
						statements.append(maker.VarDef(maker.Modifiers(finalFlag), dollarFieldName, maker.TypeIdent(CTC_LONG), init));
						statements.append(createResultCalculation(typeNode, longToIntForHashCode(maker, maker.Ident(dollarFieldName), maker.Ident(dollarFieldName))));
					}
					break;
				default:
				case BYTE:
				case SHORT:
				case INT:
				case CHAR:
					/* just the field */
					statements.append(createResultCalculation(typeNode, fieldAccessor));
					break;
				}
			} else if (fType instanceof JCArrayTypeTree) {
				/* java.util.Arrays.deepHashCode(this.fieldName) //use just hashCode() for primitive arrays. */
				boolean multiDim = ((JCArrayTypeTree)fType).elemtype instanceof JCArrayTypeTree;
				boolean primitiveArray = ((JCArrayTypeTree)fType).elemtype instanceof JCPrimitiveTypeTree;
				boolean useDeepHC = multiDim || !primitiveArray;

				JCExpression hcMethod = chainDots(typeNode, "java", "util", "Arrays", useDeepHC ? "deepHashCode" : "hashCode");
				statements.append(createResultCalculation(typeNode, maker.Apply(List.<JCExpression>nil(), hcMethod, List.of(fieldAccessor))));
			} else /* objects */ {
				/* final java.lang.Object $fieldName = this.fieldName; */
				/* $fieldName == null ? NULL_PRIME : $fieldName.hashCode() */

				Name dollarFieldName = dollar.append(((JCVariableDecl)fieldNode.get()).name);
				statements.append(maker.VarDef(maker.Modifiers(finalFlag), dollarFieldName, genJavaLangTypeRef(typeNode, "Object"), fieldAccessor));

				JCExpression hcCall = maker.Apply(List.<JCExpression>nil(), maker.Select(maker.Ident(dollarFieldName), typeNode.toName("hashCode")),
						List.<JCExpression>nil());
				JCExpression thisEqualsNull = maker.Binary(CTC_EQUAL, maker.Ident(dollarFieldName), maker.Literal(CTC_BOT, null));
				statements.append(createResultCalculation(typeNode, maker.Conditional(thisEqualsNull, maker.Literal(HandlerUtil.primeForNull()), hcCall)));
			}
		}

		/* return result; */ {
			statements.append(maker.Return(maker.Ident(resultName)));
		}

		JCBlock body = maker.Block(0, statements.toList());
		return recursiveSetGeneratedBy(maker.MethodDef(mods, typeNode.toName("hashCode"), returnType,
				List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null), source, typeNode.getContext());
	}

	public JCExpressionStatement createResultCalculation(JavacNode typeNode, JCExpression expr) {
		/* result = result * PRIME + (expr); */
		JavacTreeMaker maker = typeNode.getTreeMaker();
		Name resultName = typeNode.toName(RESULT_NAME);
		JCExpression mult = maker.Binary(CTC_MUL, maker.Ident(resultName), maker.Ident(typeNode.toName(PRIME_NAME)));
		JCExpression add = maker.Binary(CTC_PLUS, mult, expr);
		return maker.Exec(maker.Assign(maker.Ident(resultName), add));
	}

	/** The 2 references must be clones of each other. */
	public JCExpression longToIntForHashCode(JavacTreeMaker maker, JCExpression ref1, JCExpression ref2) {
		/* (int)(ref >>> 32 ^ ref) */
		JCExpression shift = maker.Binary(CTC_UNSIGNED_SHIFT_RIGHT, ref1, maker.Literal(32));
		JCExpression xorBits = maker.Binary(CTC_BITXOR, shift, ref2);
		return maker.TypeCast(maker.TypeIdent(CTC_INT), xorBits);
	}

	public JCExpression createTypeReference(JavacNode type) {
		java.util.List<String> list = new ArrayList<String>();
		list.add(type.getName());
		JavacNode tNode = type.up();
		while (tNode != null && tNode.getKind() == Kind.TYPE) {
			list.add(tNode.getName());
			tNode = tNode.up();
		}
		Collections.reverse(list);

		JavacTreeMaker maker = type.getTreeMaker();
		JCExpression chain = maker.Ident(type.toName(list.get(0)));

		for (int i = 1; i < list.size(); i++) {
			chain = maker.Select(chain, type.toName(list.get(i)));
		}

		return chain;
	}

	public JCMethodDecl createEquals(JavacNode typeNode, List<JavacNode> fields, boolean callSuper, FieldAccess fieldAccess, boolean needsCanEqual, JCTree source, List<JCAnnotation> onParam) {
		JavacTreeMaker maker = typeNode.getTreeMaker();
		JCClassDecl type = (JCClassDecl) typeNode.get();

		Name oName = typeNode.toName("o");
		Name otherName = typeNode.toName("other");
		Name thisName = typeNode.toName("this");

		JCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(typeNode, "Override"), List.<JCExpression>nil());
		JCModifiers mods = maker.Modifiers(Flags.PUBLIC, List.of(overrideAnnotation));
		JCExpression objectType = genJavaLangTypeRef(typeNode, "Object");
		JCExpression returnType = maker.TypeIdent(CTC_BOOLEAN);

		long finalFlag = JavacHandlerUtil.addFinalIfNeeded(0L, typeNode.getContext());

		ListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();
		final List<JCVariableDecl> params = List.of(maker.VarDef(maker.Modifiers(finalFlag | Flags.PARAMETER, onParam), oName, objectType, null));

		/* if (o == this) return true; */ {
			statements.append(maker.If(maker.Binary(CTC_EQUAL, maker.Ident(oName),
					maker.Ident(thisName)), returnBool(maker, true), null));
		}

		/* if (!(o instanceof Outer.Inner.MyType) return false; */ {

			JCUnary notInstanceOf = maker.Unary(CTC_NOT, maker.TypeTest(maker.Ident(oName), createTypeReference(typeNode)));
			statements.append(maker.If(notInstanceOf, returnBool(maker, false), null));
		}

		/* MyType<?> other = (MyType<?>) o; */ {
			if (!fields.isEmpty() || needsCanEqual) {
				final JCExpression selfType1, selfType2;
				ListBuffer<JCExpression> wildcards1 = new ListBuffer<JCExpression>();
				ListBuffer<JCExpression> wildcards2 = new ListBuffer<JCExpression>();
				for (int i = 0 ; i < type.typarams.length() ; i++) {
					wildcards1.append(maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null));
					wildcards2.append(maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null));
				}

				if (type.typarams.isEmpty()) {
					selfType1 = maker.Ident(type.name);
					selfType2 = maker.Ident(type.name);
				} else {
					selfType1 = maker.TypeApply(maker.Ident(type.name), wildcards1.toList());
					selfType2 = maker.TypeApply(maker.Ident(type.name), wildcards2.toList());
				}

				statements.append(
						maker.VarDef(maker.Modifiers(finalFlag), otherName, selfType1, maker.TypeCast(selfType2, maker.Ident(oName))));
			}
		}

		/* if (!other.canEqual((java.lang.Object) this)) return false; */ {
			if (needsCanEqual) {
				List<JCExpression> exprNil = List.nil();
				JCExpression thisRef = maker.Ident(thisName);
				JCExpression castThisRef = maker.TypeCast(genJavaLangTypeRef(typeNode, "Object"), thisRef);
				JCExpression equalityCheck = maker.Apply(exprNil,
						maker.Select(maker.Ident(otherName), typeNode.toName("canEqual")),
						List.of(castThisRef));
				statements.append(maker.If(maker.Unary(CTC_NOT, equalityCheck), returnBool(maker, false), null));
			}
		}

		/* if (!super.equals(o)) return false; */
		if (callSuper) {
			JCMethodInvocation callToSuper = maker.Apply(List.<JCExpression>nil(),
					maker.Select(maker.Ident(typeNode.toName("super")), typeNode.toName("equals")),
					List.<JCExpression>of(maker.Ident(oName)));
			JCUnary superNotEqual = maker.Unary(CTC_NOT, callToSuper);
			statements.append(maker.If(superNotEqual, returnBool(maker, false), null));
		}

		Name thisDollar = typeNode.toName("this$");
		Name otherDollar = typeNode.toName("other$");
		for (JavacNode fieldNode : fields) {
			JCExpression fType = getFieldType(fieldNode, fieldAccess);
			JCExpression thisFieldAccessor = createFieldAccessor(maker, fieldNode, fieldAccess);
			JCExpression otherFieldAccessor = createFieldAccessor(maker, fieldNode, fieldAccess, maker.Ident(otherName));
			if (fType instanceof JCPrimitiveTypeTree) {
				switch (((JCPrimitiveTypeTree)fType).getPrimitiveTypeKind()) {
				case FLOAT:
					/* if (Float.compare(this.fieldName, other.fieldName) != 0) return false; */
					statements.append(generateCompareFloatOrDouble(thisFieldAccessor, otherFieldAccessor, maker, typeNode, false));
					break;
				case DOUBLE:
					/* if (Double.compare(this.fieldName, other.fieldName) != 0) return false; */
					statements.append(generateCompareFloatOrDouble(thisFieldAccessor, otherFieldAccessor, maker, typeNode, true));
					break;
				default:
					/* if (this.fieldName != other.fieldName) return false; */
					statements.append(
							maker.If(maker.Binary(CTC_NOT_EQUAL, thisFieldAccessor, otherFieldAccessor), returnBool(maker, false), null));
					break;
				}
			} else if (fType instanceof JCArrayTypeTree) {
				/* if (!java.util.Arrays.deepEquals(this.fieldName, other.fieldName)) return false; //use equals for primitive arrays. */
				boolean multiDim = ((JCArrayTypeTree)fType).elemtype instanceof JCArrayTypeTree;
				boolean primitiveArray = ((JCArrayTypeTree)fType).elemtype instanceof JCPrimitiveTypeTree;
				boolean useDeepEquals = multiDim || !primitiveArray;

				JCExpression eqMethod = chainDots(typeNode, "java", "util", "Arrays", useDeepEquals ? "deepEquals" : "equals");
				List<JCExpression> args = List.of(thisFieldAccessor, otherFieldAccessor);
				statements.append(maker.If(maker.Unary(CTC_NOT,
						maker.Apply(List.<JCExpression>nil(), eqMethod, args)), returnBool(maker, false), null));
			} else /* objects */ {
				/* final java.lang.Object this$fieldName = this.fieldName; */
				/* final java.lang.Object other$fieldName = other.fieldName; */
				/* if (this$fieldName == null ? other$fieldName != null : !this$fieldName.equals(other$fieldName)) return false;; */
				Name fieldName = ((JCVariableDecl)fieldNode.get()).name;
				Name thisDollarFieldName = thisDollar.append(fieldName);
				Name otherDollarFieldName = otherDollar.append(fieldName);

				statements.append(maker.VarDef(maker.Modifiers(finalFlag), thisDollarFieldName, genJavaLangTypeRef(typeNode, "Object"), thisFieldAccessor));
				statements.append(maker.VarDef(maker.Modifiers(finalFlag), otherDollarFieldName, genJavaLangTypeRef(typeNode, "Object"), otherFieldAccessor));

				JCExpression thisEqualsNull = maker.Binary(CTC_EQUAL, maker.Ident(thisDollarFieldName), maker.Literal(CTC_BOT, null));
				JCExpression otherNotEqualsNull = maker.Binary(CTC_NOT_EQUAL, maker.Ident(otherDollarFieldName), maker.Literal(CTC_BOT, null));
				JCExpression thisEqualsThat = maker.Apply(List.<JCExpression>nil(),
						maker.Select(maker.Ident(thisDollarFieldName), typeNode.toName("equals")),
						List.<JCExpression>of(maker.Ident(otherDollarFieldName)));
				JCExpression fieldsAreNotEqual = maker.Conditional(thisEqualsNull, otherNotEqualsNull, maker.Unary(CTC_NOT, thisEqualsThat));
				statements.append(maker.If(fieldsAreNotEqual, returnBool(maker, false), null));
			}
		}

		/* return true; */ {
			statements.append(returnBool(maker, true));
		}

		JCBlock body = maker.Block(0, statements.toList());
		return recursiveSetGeneratedBy(maker.MethodDef(mods, typeNode.toName("equals"), returnType, List.<JCTypeParameter>nil(), params, List.<JCExpression>nil(), body, null), source, typeNode.getContext());
	}

	public JCMethodDecl createCanEqual(JavacNode typeNode, JCTree source, List<JCAnnotation> onParam) {
		/* public boolean canEqual(final java.lang.Object other) {
		 *     return other instanceof Outer.Inner.MyType;
		 * }
		 */
		JavacTreeMaker maker = typeNode.getTreeMaker();

		JCModifiers mods = maker.Modifiers(Flags.PROTECTED, List.<JCAnnotation>nil());
		JCExpression returnType = maker.TypeIdent(CTC_BOOLEAN);
		Name canEqualName = typeNode.toName("canEqual");
		JCExpression objectType = genJavaLangTypeRef(typeNode, "Object");
		Name otherName = typeNode.toName("other");
		long flags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, typeNode.getContext());
		List<JCVariableDecl> params = List.of(maker.VarDef(maker.Modifiers(flags, onParam), otherName, objectType, null));

		JCBlock body = maker.Block(0, List.<JCStatement>of(
				maker.Return(maker.TypeTest(maker.Ident(otherName), createTypeReference(typeNode)))));

		return recursiveSetGeneratedBy(maker.MethodDef(mods, canEqualName, returnType, List.<JCTypeParameter>nil(), params, List.<JCExpression>nil(), body, null), source, typeNode.getContext());
	}

	public JCStatement generateCompareFloatOrDouble(JCExpression thisDotField, JCExpression otherDotField,
			JavacTreeMaker maker, JavacNode node, boolean isDouble) {
		/* if (Float.compare(fieldName, other.fieldName) != 0) return false; */
		JCExpression clazz = genJavaLangTypeRef(node, isDouble ? "Double" : "Float");
		List<JCExpression> args = List.of(thisDotField, otherDotField);
		JCBinary compareCallEquals0 = maker.Binary(CTC_NOT_EQUAL, maker.Apply(
				List.<JCExpression>nil(), maker.Select(clazz, node.toName("compare")), args), maker.Literal(0));
		return maker.If(compareCallEquals0, returnBool(maker, false), null);
	}

	public JCStatement returnBool(JavacTreeMaker maker, boolean bool) {
		return maker.Return(maker.Literal(CTC_BOOLEAN, bool ? 1 : 0));
	}
}

redpajama_set_name: RedPajamaGithub


Center for Socio Economic Studies (also known as "CSEStudies" or "CSES") is established as an Research and Development (R&D) unit of "National Socio Economic Society" (a society registered with government of India under Registration of Societies Act 1860). CSES is a progressive R&D center which undertakes studies / research on Socio and Economic (SE) issues to provide innovative possibilities in the form of solutions to solve SE issues / problems.
CSES is to conduct interdisciplinary research in the development of possible solutions to the SE issues / problems and to encourage and support innovative research and activities that have significant potential value for the society, and to provide exemplary dissemination, training and support on SE issues.
CSES offers Consultancy, Solutions and Services for Socio Economic domain, in research and development perspective. Every problem needs a kind of database as a ground-reality, before attempting to solve it. Such database shall be the input which is then analyzed and attempt to solve the problem with possible approaches utilizing various simulation methods.
CSES with its profound knowhow and interdisciplinary research experiences stands at front to attack the SE problems with knowledge tools and removes the fog to give the problem a clear look. Problems of social or economic nature are also interpreted with scientific methodology and provide a technology touch. As Albert Einstein said (see in left pane) we try to apply imagination before applying knowledge.
©2010-2015 CSES. All Rights Reserved.


text:
Q: Quaternion product I am trying to figure out how to multiply 2 quaternions together. I learned back in school that you use the FOIL method when multiplying 2 binomials together, however when it comes to Quaternions, The FOIL distributive method does not apply:
Qa = [Sa,A]
Qb = [Sb,B]
QaQb = [Sa,A][Sb,B] =
(Sa + Xai + Yaj + ZaK)(Sb + Xbi+ Ybj + Zbk) =
(SaSb - XaXb - YaYb -ZaZb)+
(SaXb + SbXa + YaZb -YbZa)i+
(SaYb + SbYa + ZaXb - ZbXa)j+
(SaZb + SbZa + XaYb - XbYa)k
Is there a standard way of multiplying 2 Quaternions together similar to the FOIL method used for multiplying 2 binomials?

A: Not everything is a binomial. Do you know how to multiply $(a+b+c)(x+y)$ for example? It's still just an application of the distributive property, it's just that FOIL is an acronym invented so students could memorize what the terms would be at the end multiplying two binomials.
For instance, with $(a+b+c)(x+y)$ we would have
$$ \begin{array}{ll} (a+b+c)(x+y) & =a(x+y)+b(x+y)+c(x+y) \\
 & = ax+ay+bx+by+cx+xy. \end{array} $$
When there are $4\times 4=16$ terms to multiply out, it becomes cumbersome to keep everything on one line, so if you want you can make a $4\times 4$ array to keep track of it all:
$$ \begin{array}{|c|c|c|c|c|} \hline & a_2 & b_2\mathbf{i} & c_2\mathbf{j} & d_2\mathbf{k} \\ \hline a_1 \\ \hline b_1\mathbf{i} \\ \hline c_1\mathbf{j} \\ \hline d_1\mathbf{k} \\ \hline  \end{array} $$
In each entry, compute $uv$ where $u$ is the term at the left of the row and $v$ is the term at the top of the column. When done filling in the table, add up all of its entries (not including the  terms labelling the rows and columns) to get $(a_1+b_1\mathbf{i}+c_1\mathbf{j}+d_1\mathbf{k})(a_2+b_2\mathbf{i}+c_2\mathbf{j}+d_2\mathbf{k})$.
Another way is to write quaternions in the form $r+\mathbf{u}$, where $r$ is a scalar and $\mathbf{u}$ is a vector; in this case you can multiply two quaternions as if it were a product of binomials, then use the rule $\mathbf{u}\mathbf{v}=-\mathbf{u}\cdot\mathbf{v}+\mathbf{u}\times\mathbf{v}$ (where $\mathbf{u},\mathbf{v}$ are vectors, i.e. pure imaginary quaternions, $\mathbf{u}\cdot\mathbf{v}$ denotes the dot product and $\times$ denotes the cross product) and combine like terms to simplify.

A: Where does the FOIL method come from?  It's from the distributive law, which says that $$x(y+z) = xy+xz.$$
Here the right term $(y+z)$ is a sum and we've distributed the left term $x$ over the right term.   If the left term is a sum, we can do it in the other direction:
$$(y+z)x = yx+zx.$$
How do we get from this to FOIL? When we multiply two binomials, both sides are sums and we can distribute in both directions. The first step is to distribute the left term over the right term as before:
$$(a+b)(c+d) = (a+b)c + (a+b)d$$
Where we took $x = (a+b)$ and $y = c$ and $z=d$.
Then we distribute again, in the other direction, twice:
$$\color{darkred}{(a+b)c} + \color{darkblue}{(a+b)d} =
\color{darkred}{ac + bc} + \color{darkblue}{ad + bd}$$
At this point we might be able to  combine like terms, if there are any.  In this example, which is very general, there aren't any.  But if we had been multiplying $x+2$ and $x+3$ then $bc$ would be $2\cdot x$ and $ad$ would be $x\cdot3$ and we would have been  able to combine them to get $5x$.
Now let's move on to quaternions.  The idea is the same:
$$(a + bi + cj+ dk)(w+xi+yj+zk) $$
We distribute the left term over the right one:
$$(a + bi + cj+ dk)w \\
+ (a + bi + cj+ dk)xi \\
+ (a + bi + cj+ dk)yj \\
+(a + bi + cj+ dk)zk $$
Can you take it from there?

A: FOIL method is only a mnemonic for the distributive law, that can be useful for the product of two binomial expressions, but for the product of polynomial expressions  I don't know   a similar mnemonic and we simply use distributivity.
In the case of quaternions we have:
$$
(a_0+a_1 \mathbf i+ a_2 \mathbf j+a_3 \mathbf k) (b_0+b_1 \mathbf i+ b_2 \mathbf j+b_3 \mathbf k) =a_0(b_0+b_1 \mathbf i+ b_2 \mathbf j+b_3 \mathbf k)+a_1 \mathbf i (b_0+b_1 \mathbf i+ b_2 \mathbf j+b_3 \mathbf k)+a_2\mathbf j (b_0+b_1 \mathbf i+ b_2 \mathbf j+b_3 \mathbf k)+a_3\mathbf k (b_0+b_1 \mathbf i+ b_2 \mathbf j+b_3 \mathbf k)=
$$
and the distributive law  can be still applied but, since the product is  not commutative, it is also important to respect the order of the factors when we distribute the products over the sum.

redpajama_set_name: RedPajamaStackExchange


text:
Youth services, not facilities, aim of new law
By: Capital News Service Mary Tablante April 17, 2013
ANNAPOLIS — The Maryland General Assembly passed a bill in the recently completed session that prohibits juvenile courts from committing a child to the Department of Juvenile Services for out-of-home placement for minor offenses, including trespass and possession of marijuana.
The aim is to reduce the number of youth sent to long-term juvenile facilities. Instead, the youth will receive services in their communities.
Examples of out-of-home placement include foster homes, group homes and independent living programs. The bill, HB 916, will go into effect Oct. 1.
Other offenses that will also not be eligible include thefts of less than $1,000, prostitution, malicious destruction of property, disorderly conduct or if the most serious offense involves inhalants.
The new law does not affect juveniles who commit violent crimes or other more serious offenses.
The bill includes exceptions for juveniles with three or more separate previous offenses, for the protection of the child and for other cases where the court decides an out-of-home placement is necessary.
"[The bill] will help youth by ensuring that they are in the least restrictive settings to get the services they need, and that's not always in out-of-home placements," said Angela Johnese, the newly appointed director of the mayor's office on criminal justice in Baltimore and the former juvenile justice director of Advocates for Children and Youth.
The Department of Legislative Services estimates the bill could save up to $12.5 million if DJS placements are reduced by 20 percent.
"Community services … also cost significantly less than out-of-home placement and result in better outcomes for young people," Johnese said.
Services for youth depend on what type of help they need, but can include mental health counseling and substance abuse treatment.
Another juvenile justice bill, HB 786, sponsored by Del. Jill Carter, D-Baltimore, established a task force that will study issues within the juvenile court. The group will decide whether to eliminate certain offenses that result in automatically charging youth as adults.
"What we've found is that over the years we're overcharging youth as adults, and we saw [this] recently with the decision not to build the $70 million Baltimore detention center for youth. … We really don't have a need for that many bed spaces because we're overcharging," Carter said.
Carter, who is chair of the Juvenile Law subcommittee of the House Judiciary Committee, said 70 percent of youth initially charged as adults are reversed back to the juvenile system, or their cases are dismissed after they've been housed in adult facilities.
Carter said the bills that passed are a piece-by-piece approach to reform the juvenile justice system.
"We need to treat youth as youth," she said. "Of course, there are going to be exceptions, but we need to deal with those on an individual basis."
Other juvenile law bills were unsuccessful this session.
SB 454/HB 848 would have allowed a child to remain detained in a juvenile facility even after the juvenile court determined that the youth could be tried for a crime in adult court.
The goal was to keep young people out of the adult system to make sure they have the services they need.
DJS opposed the bill because it would have resulted in a significant increase in the population in the state's juvenile detention facilities.
Johnese said she expects the legislature will reintroduce the bill in the future because it would keep youth safe from the physical and mental harm they might encounter in the adult system.
Another bill, SB 788/HB 966, would have established a task force to study law enforcement programs diverting children away from juvenile services, but it received an unfavorable report from the Senate Judicial Proceedings Committee.
Monique Dixon, the director of the criminal and juvenile justice program of the Open Society Institute-Baltimore, said DJS has already taken steps to reduce the number of young people in the juvenile justice system. These steps include supervising juveniles charged with minor offenses and allowing them to return home with their parents.
In the 2012 fiscal year (July 1, 2011, through June 30, 2012), 61.7 percent of newly committed youth were committed for misdemeanors, while 20 percent were committed for violent crimes, according to the most recent DJS data.
"Unlike adults, young people are amenable to treatment and would be more likely to receive that treatment in the juvenile justice system than in the adult system," she said.
department of juvenile services General Assembly juvenile services Law legal news maryland 7:23 pm Wed, April 17, 2013 Maryland Daily Record
Capital News Service
Tagged with: department of juvenile services General Assembly juvenile services Law legal news maryland
Coppin awarded $4M to broaden high-speed internet access
by Daily Record Staff | Jan. 30

redpajama_set_name: RedPajamaCommonCrawl


text:
Home Front Page 50/50 Women on Boards Releases 2020 IPO Annual Analysis Revealing Historic Advancements...
50/50 Women on Boards Releases 2020 IPO Annual Analysis Revealing Historic Advancements for Women on Boards
50/50 Women on Boards, the leading education and advocacy campaign accelerating gender balance and diversity on corporate boards, has released new research revealing a positive shift in board diversity. For companies that represented the 25 largest initial public offerings (IPOs) of 2020, women held 24% of all company board seats – up from 21.9% in 2019, culminating a 10% overall increase since 2015. However, six companies among the largest IPOs of the year still went public with only one woman on the board, and one company went public with no women. Further, women of color still hold the fewest board seats, just under 5%, across the Fortune 500 largest publicly-traded companies.
"The progress made in board gender diversity among the top 25 IPOs is promising, but more needs to be accomplished in pursuit of diverse leadership," said Betsy Berkhemer-Credaire, CEO of 50/50 Women on Boards. "Having women on boards is good for business, from better profitability and productivity, to improvements in workplace culture. It's unfair that publicly traded companies would deprive their shareholders of this business advantage. Respected shareholder voices like ISS and StateStreet will vote against directors of companies without diverse board members. There's been considerable improvement for women on boards, but now we must focus on gender balance and diversity on boards."
While 2020 presented pivotal challenges for women in the workplace, women's advancement onto boards at the time of IPO continues to increase. From mortgages to food wrap, two well-known companies went public last year with gender-balanced boards: Rocket Company Inc. and Reynolds Consumer. Additionally, 10 companies on the top 25 IPO list of 2020 had three or more women directors. Of the top 25 companies that went public in 2019, by the end of 2020, they added 12 women for a percentage of 25.6% women on these companies' boards. Notably, Lyft and Uber, which went public in 2019, achieved gender-balance on their boards in 2020.
The 2020 findings offer optimism for gender diversity on public boards, but there are still far too many companies entering public ownership lacking gender balance and diversity. The 181-year-old Dun & Bradstreet did so with the dubious distinction of being the only company on the list to go public without a single woman on its board.
"We are pleased to see that there are more women on boards than ever before, but we must remain focused on the goal," says Malli Gero, Co-Founder and Vice-Chair of 50/50 Women on Boards as well as the author of the 2020 IPO gender analysis. "We are not aiming for only a handful of companies to achieve greater gender diversity; we must work to establish gender balance and diversity as the norm on corporate boards. 50/50 Women on Boards remains focused on being a leading voice in this effort."
Social and financial pressures are moving companies toward having more women on boards. In December 2020, Nasdaq filed a proposal with the Securities and Exchange Commission (SEC) to adopt new listing rules regarding boardroom diversity and disclosure. If approved, within four years, all companies listed on Nasdaq's U.S. exchange will be required to have at least two diverse directors – one who self-identifies as female and one who self-identifies as either an underrepresented minority or LGBTQ+.
Previous articleSarah Jakes Roberts To Release Fifth Book "Woman Evolve: Break Up With Your Fears And Revolutionize Your Life"
Next articleWorld Renowned Ophthalmologist Dr. Patricia Bath Could Be First Black Woman Inducted into the National Inventors Hall of Fame


text:
layout: post
title: Where's the disney castle??
categories:
- Learning
---

Our fairy tale castle - the disney castle where we have seen the dancing beauty and the beast, cinderella and sleeping beauty...

![](/img/disneycastle.jpg)

And it is actually inspired from the [Neuschwanstein Castle](http://en.wikipedia.org/wiki/Neuschwanstein)... well fairy tales _do_ exist right here ;)

![](/img/neuschwansteincastle.jpg)

[picture credit here](http://www.texasgirlschoir.org/lgtr00/NeuschwansteinCastle1.jpg)


You will Watch Count Duckula Season 1 Episode 4 online for free episodes with HQ / high quality. Stream cartoons Count Duckula Episode 4 Transylvanian Homesick Blues. Duckula, Igor and Nanny take a literal rollercoaster ride through time.


While it has nothing to do with lean or six sigma this was just too good to not share.
Sure, they 'cost' a lot of money… but to me… kids are priceless!
Enjoy your weekend – and especially your children – if applicable.
Oh my gosh, I have tears coming out of my eyes from laughing so hard. What a blessing children are! Enjoy your weekend (and family) too.
Third pillar of TPS: DON'T GROW UP!


text:
Today's Politicos vs The Words and Deeds of The Founders
Make a blogger happy, come back. Sign up for email post alerts!
I hesitated to write this article for a long time for fear of sounding extreme or intemperate. However, the time has come to speak out. There is no doubt that the scenario I am about describe is the game plan envisioned by those who seek absolute control.
It is not about gun control per se. It is about criminalizing the political enemies of the left. The name of the game is division and here is how it will play out over the next few years.
There will be another Newtown, another Columbine or another Aurora. Sadly our society has been degraded to such an extent by the polices of the tyrannical left that there is less and less that encourages a shared value system. In a world where morality is untethered from a shared ideal of right an wrong, where there is nothing of meaning to hold onto, the mentally unhinged become more so, and those prone to frustration and violence find less and less restraint. It is no longer necessary to create a Reichstag moment out of whole cloth, the demons have been unleashed and the mechanism will provide the needed excuse for draconian over-reaction soon enough, all on its own.
After another lunatic or two perpetrates another awful tragedy, universal gun registration, possibly under the guise of "background" checks will be implemented. The ever-compliant MSM will do its best to rev up the anti-gun zealots until it seems that everyone is crying out to rid the nation of the scourge of gun violence.
The penalties for not registering your weapons will be severe enough that gun owners will be faced with an unpleasant choice about whether to comply or not.
Thus the division will begin. This is the process that will be used to fragment and criminalize opponents of a tyrannical government.
Once such measures are passed, a portion, maybe 40% of gun owners will comply out fear. They will have too much to lose to risk falling afoul of a vindictive federal government.
Some, perhaps 5-10% of gun owners, will choose instead to sell their guns, rather than register them. This will reduce the gun owning opposition proportionately.
Finally, a third group, maybe 30% will choose to disobey the edict as unconstitutional. The government will go after this group with a vengeance. They will become criminals.
It won't be easy for these Americans to keep their arsenals a secret. It will be difficult, if not impossible to buy ammunition without the purchases being tracked back to the buyer. We've seen in recent days how the government is plugged in to credit processors, banks, telephone communications, and the internet. There will undoubtedly be mechanisms for "reporting unlicensed/unregistered gun ownership." These Americans won't be able to go to a shooting range, or utilize BLM land to practice. They will be forced to hide and cower for fear of discovery.
Registering firearms will do nothing to curb violence (it never has). It will, if anything, heighten the odds of another event. The pro-gun lobby will be weakened significantly by the depredation and criminalization of its members. More legislation will follow. Perhaps it will initially take the form of licensing, perhaps it will be further controls on ammunition, or perhaps a combination of things.
Once again, American gun-owners will be faced with the choice of complying or not complying. More Americans will abandon their property as too expensive, and too risky, leaving an ever smaller group of people exercising what remains of their Second Amendment right. This is all part of the plan to criminalize, demonize, and most of all, fragment the opposition.
Eventually guns will be confiscated. The government will start with those who have obeyed the laws and registered their guns. At this point these people will have little choice but to comply in the face of overwhelming force.
Those who remain in possession of their property in contradiction to these new laws will be in grave jeopardy as de facto criminals. But they will be a smaller group and will be dealt with ruthlessly as they are discovered.
Tell me I'm wrong.
Never Let a Crisis Go To Waste
The Center Isn't Holding
This is an election about an idea
1 George Archibald { 06.17.13 at 2:47 pm }
Keep your powder dry. Voters described as Tea Party types are fighting back. In the June 11 Virginia Republican primary election, two veteran Republican incumbents with fairly consistent conservative voting records were ousted by good challengers with terrific backgrounds (one a construction company owner, the other a medical doctor) who will win the general election in November and immediately become a focal point for other legislators on such lightning-rod issues as Obamacare and controlling big-government. Watch their names in Virginia politics: Dave LaRock of Leesburg, Va., and Dr. Mark Berg of Winchester, Va.
Martin Reply:
Good choice of words. Let's also keep in mind the first part of the quote attributed to Cromwell:
'put your trust in God; but mind to keep your powder dry'."
2 LD Jackson { 06.17.13 at 6:39 pm }
The man I work for is a gun owner with quite an arsenal of his own. Anytime a discussion is started about gun confiscation, he is fond of asking different people what they would do, were the government to come knocking on their door to confiscate their guns.
Your post illustrates exactly what is wrong with the idea that the government will do that, out of the blue and overnight. I am convinced it will not happen in that manner. Instead, over a period of time, years, perhaps decades, we will be conditioned, as a society and a people, to accept it when it does happen.
It is like a Southern Gospel song that was recorded years ago by The McKameys, "Getting Used To The Dark". Little by little, people become accustomed to sin and accept it. Little by little, Americans will likely become accustomed to government intrusion until we will no longer have the will or the strength to fight. That is when they will come to confiscate the guns and by then, it will be too late.
Indeed. Whether intentional, slippery slope, or progressive, the effect will be one of division and fragmentation until there aren't enough people to resist.
3 Fastercat { 06.19.13 at 4:56 pm }
As in most wars, 3% of gun 0wners will join the shooting war. That's about 25,000.
The question is – will you be one of the 3%? (Don't answer that, it's rhetorical.)
Get Your Book/Film Reviewed
Support WWTFT
Enter Amazon here before you do your shopping to put a couple cents in our pockets (referral credit).
Sign Up For Post Alerts!
The posts are coming!
How to Prove There Is a God: Mortimer J. Adler's Writings and Thoughts About God by Mortimer Adler
George Washington: A Biography, Vol. 7: Leader of the Revolution by Douglas Southall Freeman
A Battlefield Atlas of the American Revolution by Craig Symonds
Daniel Morgan: Ranger of the Revolution by North Callahan
American Spring: Lexington, Concord, and the Road to Revolution by Walter R. Borneman
The Nizam's Daughters (Matthew Hervey, Book 2) by Allan Mallinson
Aristotle for Everybody: Difficult Thought Made Easy by Mortimer J. Adler
The Complete Aubrey/Maturin Novels (re-reading) by Patrick O'Brian
Copyright 2010-2014 What Would The Founders Think?


In the first part of this two-part blog, I introduced you to a life-design process that you can use to increase your overall happiness. Here's how you can take it a step further.
Now we've drilled down more deeply into one area of your life. Each of the items on the list above have the potential to represent a key piece of your vision for happiness related to family.
How can you clarify your vision in the areas that matter most to you?
What do you really want in the areas that are most important to you?
How can you close the gap between where you currently are and what you really want?
How will you build support from other family members to create forward movement towards your vision?
If you take the time to create a vision and design bold steps to move towards your vision, you will discover wonderful new perspectives not only on family life, but in all other areas of your life as well because all the areas are your areas and are connected. Going deeply into one area impacts your whole life.
Bold and decisive action is necessary to move you to greater happiness. It won't just magically happen. Don't wait for happiness to come to you. It's already under your nose. Take it!
Jim is the founder and director of Coaching to Connect. He has three decades of experience in organizational and relationship work including coaching, consulting, non-profit CEO, program director, project manager, teacher, author and more. Jim holds a Master of Science degree in Education from Duquesne University with an emphasis in Adult Spiritual Formation.
Coaching to Connect provides coaching, training and consulting services for leaders, couples, and individuals. For more information, browse the site or contact Jim Merhaut, 330-261-1630 or jim@coachingtoconnect.com.


As a new mum, I've been interested to know how other artist-mums manage to balance their artistic projects with kids, work, life. So I was pleased to chat to the talented and lovely Christina Dwivedi today about writing, reading and everything in-between.
I'm mostly working on my middle grade fantasy, From Peaksbury to Piyali. Ella, twelve and curious, is thrown onto a journey to help protect her family. It's a bit of a genre mashup, with some sci-fi, because there are people living on another planet who can see what's happening on Ella's world, and are also invested in protecting Ella's family.
So what's the inspiration behind the story?
Years ago, I first thought of the image of a girl walking on a hill, in a chilly wind. I imagined her wearing a shawl. So frontier life came to mind, and yet I wanted it to be fantastical. The story has been influenced by prairie/frontier life, C.S. Lewis' Space Trilogy, and my international travels.
How are you finding balance work/ writing/ family?
I am still working on that. I have had to put the more intense writing sessions aside, off and on. Recently, I've tried to get writing or editing done after dropping my older son off at school. My four year old stays at home with me, but if he is distracted by toys or games or a movie, I'm able to get some writing time in. I used to write late at night, but my mind wouldn't stop thinking about the story when I tried to sleep! Now I read more at night, able to turn my imagination off better than if I was writing.
Do you have a your writing process?
With From Peaksbury to Piyali, I "pantsed" it over many years' time (i.e. I just let the plot ideas come as I wrote). However, it has caused me headaches for editing the plot. But now, for revisions and future stories, even a loose outline works wonders for me personally. So I start writing my ideas, especially in Google docs, and then try to turn them into a simple outline.
Does that mean you'll finish the book soon?
I have finished it, with several drafts done. But I would love to finish and polish my latest, somewhat major revisions by July this year. It's so different than the first draft!
Doodlings of an inspired writer.
Why do you write fantasy for middle grade audiences?
It has been my favorite genre ever since I myself was the middle grade audience. I love the adventure and curiosity. The stories reach children at an important time in their lives, when they are getting older and more curious about the world. If we can give them a little hope, courage or magic to hold onto, I think they benefit.
I do believe in writer's block for sections of a story. Sometimes you can't work out how the plot should transition from one point to another. I haven't had a problem with new story ideas, but once you get down to writing, detailed plot can stump you. What helps me is taking a shower, or doing dishes—or trying to get a stubborn child to fall asleep. I think getting away from the screen (sometimes not by choice) helps with brainstorming ideas.
I was quiet and shy but friendly if approached. My closest friends saw more of the real, goofy side of me. I did well in school and my favorite class was oceanography. I enjoyed other science classes too. I was a fast reader, and enjoyed it, but didn't think of myself as a future writer.
Last question. What's your biggest learning experience so far from this writing process?
Wow. I've learned so much. First of all, it's much harder to write, and then edit, a book than I imagined. Editing is where the magic happens, and where I spend most of my time in the writing process. Also, critique partners are essential to polishing your story and encouraging you to push ahead.


Just as the DigiNotar storm seemed to have calmed down, Google announced they discovered, yet another Certificate Authority that was involved in a similar incident. TURKTRUST, a certificate authority, mis-issued two intermediate certificates that were later used to intercept SSL traffic to Gmail. In cases like this the attacker is interested in intercepting communication between Gmail users and the Gmail servers. In order to successfully execute such an attack the attacker will need to insert his fake Gmail impersonating webserver between the user and the actual Gmail servers, this is what we call a Man in the Middle Attack, sometimes referred to as MITM.
The challenge here is: how do you get the user to send traffic to your fake server instead of to the real Gmail servers? One common way of achieving this is to have some kind of interception appliance on the edge of the network. But what if you don't have control of the network where the user resides? Perhaps the users the attacker is interested in are in a different country or even a different continent.
If you could just somehow change the DNS response for Gmail.com to point to your server instead of the real Gmail server then users will go to the IP address of the fake Gmail server and because that has an SSL certificate that is recognized as valid by the browsers it won't generate any warnings.
Over the last few years we've seen viruses such as DNSCHANGER change the DNS server settings to DNS servers that are controlled by an attacker. Other ways to achieve this are DNS cache poisoning attacks.
Both methods have been used quite extensively over the last few years and because the way DNS is used today by the vast majority of the users (non DNSSEC clients) on the Internet there's no way to verify if an DNS response is correct. This makes it relatively easy to insert fake DNS responses.
One other way to redirect traffic from the user to the attacker is to go lower in the network stack and try to fool the routing system. BGP is the routing protocol of choice on the Internet today and since it's largely based on trust, it's relatively easy to fool the system. For example, if the attacker is able to announce a more specific route for the Gmail address range (IP prefix) and it's picked up by the major transit providers, Internet users will be redirected to the attackers. It's obvious that the potential impact of this is much bigger than let's say DNS cache poisoning as that tends to be more localized. Incidents like this happen relatively often by mistake, just take a look at our blog were we've published several high profile prefix hijack incidents over the last few years. It's important to note that most of these cases are the result of configuration mistakes and most of the times it's relatively easy to determine who hijacked the route. But what if an attacker could just somehow launch a man in the middle attack using BGP that's much harder to detect and still allows the attacker to redirect traffic globally…?
This exact use case was presented a few years back at Defcon16 in a presentation titled "Stealing The Internet, An Internet-Scale Man In The Middle Attack".
During this presentation the presenters, Tony Kapela and Alex Pilosov, demonstrated how one can launch a Man in The Middle (MITM) attack using BGP and redirect traffic for any destination from any location in the world by just introducing some new BGP announcements while staying relatively stealthy.
Earlier in this article we stated that (accidental) BGP hijacks are relatively common, BGP MITM attacks however are rare and harder to detect. Having said that, our software does have logic to detect this kind of attack and last week we noticed a sudden increase in BGP MITM alerts being triggered for many prefixes including those of large networks such as France Telecom, Facebook and Microsoft. Let's dig a bit deeper into this specific case and try to find out what exactly happened.
The following is an example alert and provides us with a starting point.
A BGP MITM attack as demonstrated at Defcon16 has the following properties: the BGP announcement is for a new more specific prefix and when looking at the ASpath closely we see AS relations that are typically not correct (fake) and most likely partially spoofed. Obviously this type of attack can be tuned, so the fingerprint may vary depending on the intent and creativity of the attacker.
With the above finger print in mind and numerous alerts helping us focusing in on the rather large data set, we started to dig deeper and tried to determine what exactly had happened here.
One of the clues we have when troubleshooting BGP is the ASpath. By looking at the ASpath we can say who originated the prefixes, which network provides transit to the originator and how does the path to the eventual receiver of the BGP update look like.
Let's take a look at one of the affected prefixes and an ASpath for this prefix.
A quick look at this path might not show anything strange, however when looking a bit more closely at this ASpath there are a few things that don't add up.
In this case we know that originator of the prefix, AS3215 France Telecom, does not have a direct peering/transit relationship with Tata (AS6453). This relationship does however show up in the ASpath. The other thing to note is that the ASpath shows that AS35625 (Avenir Telematique) is receiving the route from Tata (6453)(originated by France Telecom, 3215) and then announcing it to HE AS6939 (a peer of 35625) which then announces it to its customers. This means that 35625 (Avenir Telematique) is providing transit for 6453 3215 towards 6939 (Hurricane Electric). Given the size of both Tata (AS6453) and Hurricane Electric (AS6939), AS35625 should never be in the middle of these two.
So to summarize, the reason this update was marked as suspicious and eventually as a possible man in the middle attack is because it was a new more specific, the ASpath is suspicious as it contains non-existing relationships and one AS is leaking between two large providers. Our software has a few other checks and balances in place to prevent false alerts, but this pretty much sums up why it was flagged as suspicious.
When looking closer at the ASpaths for all the events that were flagged as possible MITM we found that all ASpaths had one Autonomous System in common, AS35625 (Avenir Telematique), the same AS that appeared to have leaked the announcement to HE. At that point we focused our attention on this Autonomous System and we presumed that AS35625 was the one introducing these new announcements including the fake ASpaths.
After contacting the team responsible for AS35625 our suspicions were confirmed. As it turned out AS35625 has a "route optimizer" appliance that changes and introduces new BGP announcements, by breaking up prefixes in more specifics and altering the ASpath. All this is done in order to improve reachability and latency. Obviously these announcements are supposed to stay within the boundaries of the autonomous system, but in this case they were leaked to many of its peers.
If we look at the impact and affected networks we see that the number of prefixes that match the fingerprint was 418 unique prefixes of 133 unique Autonomous systems, including Facebook, Microsoft, Cogent, Bell Canada, Verizon, Level3, Shaw, Tata, Comcast, Yahoo, Verisign and many more, see full list here. The total event lasted for about 30 minutes, although it should be noted that the impact varied per prefix and peering partner.
The new more specific prefixes were announced to numerous peers of AS35625, we detected it via approximately 50 direct peers of AS35625, most notably via AS6327 (Shaw Cablesystems) and AS6939, Hurricane Electric.
As these are more specific prefixes it's fair to assume that networks that received the BGP update for the affected prefixes, including the large customer base of both Hurricane Electric and Shaw would have rerouted traffic for some of the 400 prefixes towards AS35625 in France for several minutes.
In this case the only thing that limited the impact and prevented more prefixes to be affected were "max prefix filters" on the peering connections. In the case of Hurricane Electric the impact was limited to ~80 prefixes.
This event demonstrates how easy it is to accidentally steal parts of the Internet, and it make you wonder what could be done if an attacker would carefully plan and execute such an attack (would it be detected?).
It's obvious that once an attacker has access to a Certificate Authority and can issue seemingly valid SSL certificates at will, there are numerous options for redirecting traffic. The event described in this blog show how BGP can help attackers redirect traffic for any network in the world, while staying relatively stealthy.
All this demonstrates the fragility of the current routing, CA and DNS system. The good news is that new technologies are currently underway to make the Internet more secure, DNSSEC, DANE and RPKI & BGPSEC are all technologies to make these the Internet infrastructure more secure, the bad news is that most of these technologies lack significant deployment or are still in the standardization phase.


Meals at Cinderella's Royal Table require 2 table service credits per person. Included with your meal are your gratuities, and even a wonderful keepsake photo package. You will truly feel like royalty dining in the beautiful Cinderella Castle. Make sure to make your Advance Dining Reservations. Enjoy!


URBANA, Ill. - Weeds often emerge at the same time as vulnerable crop seedlings and sneak between plants as crops grow. How do farmers kill them without harming the crops themselves?
The article, "Transcriptome profiling and genome-wide association studies reveal GSTs and other defense genes involved in multiple signaling pathways induced by herbicide safener in grain sorghum," is published in Frontiers in Plant Science [DOI: 10.3389/fpls.2019.00192]. Authors include You Soon Baek, Loren Goodrich, Patrick Brown, Brandon James, Stephen Moose, Kris Lambert, and Dean Riechers. The research was supported by USDA's Agriculture and Food Research Initiative (grant no: 2015-67013-22818).


Life is pretty much impossible without a face moisturiser. For me that is. And I love a multitasking product; I like to keep my makeup intact, so many layers are a no-no.
Caudalie answered all my prayers in the shape of the fantastic Polyphenol C15 Anti-wrinkle Protect SPF20 face moisturiser.
I quickly became a fan of Caudalie and went on a bit about their ethics, story, ingredients… so this time I'll spare you – you can read my previous post.
Focus is on this fabulous face moisturiser that comes cream rather rich, but at the same time light and quickly absorbed by the skin.
It does feel like silk againt the face and the smell is deliciously fruity.
This lovely face cream protects the skin from free radicals, thanks to the polyphenols, very powerful anti-oxydants and they can be found in the grape seeds. it also offer protection against sun damage as it contains a SPF 20.
My skin just loves it – it feels like it drinks it. During the day, skin feels hydrated and now, after using it for a couple of weeks, it appears plumper and replenished.
I apply every morning to face and neck, after my toner and before all the makeup; it sits extremely well under it.
It is not tested on animals, non-comedogenic, dermatologist tested and free from parabens, phenoxyethanol, mineral oils, paraffin, synthetic artificial colorings, sodium laureth sulfate, phthalates and animal-derived raw materials.
The Polyphenol C15 Anti-wrinkle Protect SPF20 face moisturiser costs £29 for 40ml and can be purchased from the Caudalie site, their boutique & spas (in London, in Covent Garden) and retailers nationwide.


This is a placeholder page for Alisha Brown, which means this person is not currently on this site. We do suggest using the tools below to find Alisha Brown.
You are visiting the placeholder page for Alisha Brown. This page is here because someone used our placeholder utility to look for Alisha Brown. We created this page automatically in hopes Alisha Brown would find it. If you are not Alisha Brown, but are an alumni of Deltona High School, register on this site for free now.


text:
Home | Uzbekistan Travel Guide | Sights of Uzbekistan | Sights of Samarkand | Shakhi Zinda Necropolis
Shakhi Zinda Necropolis in Samarkand
Shakhi Zinda Necropolis, Samarkand
Shakhi Zinda is a necropolis in the north-eastern part of Samarkand, Uzbekistan.
Probably, there is no place in the glorious and old city of Samarkand that would more fully reflect the many milestones of its turbulent and long history as the Shakhi Zinda memorial complex. Locals call this necropolis a "cemetery street", but, of course, these majestic and monumental structures have nothing to do with the living dead who stagger here, hunting mortals.
In the local mausoleums created by the best architects of their time, Muslim saints, relatives of the famous ruler Timur, religious figures, thinkers and philosophers rest. Here is concentrated such a huge number of buildings remarkable for their historical, aesthetic and cultural value, that in order to inspect all these tombs and tombs, a whole sultry day may not be enough. No wonder this complex is included in the UNESCO World Heritage List.
Ancient times Shakhi Zinda was the largest religious and cultural center of Central Asia. Perhaps the best description of the importance of this complex in the picture of the Muslim world at that time is the fact that the hajj (i.e. pilgrimage) to Mecca could be replaced by a visit to Shakhi Zinda. The story itself is also unusual, according to which wonderful architectural works appeared here. This story is connected, but rather even a legend with the name of the cousin of the prophet Muhammad - Kussam ibn Abass. In 676, Kussam visited the city of Samarkand with the aim of preaching Islam in these places. During the prayer, which was done by the preacher and his new flock, the pagans from Panjakent attacked the worshipers. Actually, after the moment of the attack, various versions of the development of events begin.
So, according to one of them, the brother of the prophet was killed by an arrow fired by one of the attackers. On the other, Kussam disappeared into the gap, which suddenly appeared on a minbar chopped beneath it. The third version claims that the preacher managed to hide in the Shaaban well, where Saint Hyzr brought him. Proponents of this legend claim that he is hiding there to this day. The fourth version is less rosy: Kussam was beheaded right at the well, but managed to drink the miraculous "living water" and thanks to this he received immortality.
By the way, the name of the Shakhi Zinda memorial complex can be translated into English roughly as "living king", and the inscription on the tombstone of Kussam ibn Abass says: "Those who are killed on the path of Allah, do not consider them dead: no, they are alive ..."
Tomb of Kussam ibn Abass
Actually, it is the tomb of Kussam ibn Abass that is the center and foundation of the entire ensemble of Shahi Zind. Attention immediately rivets the door with its beauty and artful design, which leads to the tomb. This door was created by the great carver Yusuf Shirazi in 1404. In those ancient times, one of the main decorations of the entrance was ivory inlay, which to our days, unfortunately, has not been preserved. But the laudatory inscription dedicated to Kussam has been preserved: "The Arab, Hasham, Kuraishinsky, Mecca and Medda prophet said, may peace be upon him: Kussam, the son of Abbas, resembles me more than anyone else in appearance and character."
The room of the mausoleum is divided into several parts: the mosque of Ziyorathon, the tomb itself - gurkhona, the place where the chillahona was fasted and the room where the utensils necessary for worship - tughona were stored. The mosque and the tomb are separated by a characteristic wooden lattice, very elegantly decorated. The tombstone is decorated with intricate patterns and tiles and richly covered in gold. In addition to the tomb of the saint himself, other mausoleums also enter this complex, most of which tightly "encircled" the resting place of the preacher. The fact is that it was believed that the closer a person is buried to the body of the saint, the less committed his sins during his earthly journey.
Tomb of Tamerlane's wife Tuman-aka
Among others, the tomb of Tamerlane's wife Tuman-aka, the tomb of the religious leader and enlightener Khoja Ahmal, as well as the obscure "girl who met the death of chaste" are especially notable. Well, it goes without saying that the most noticeable and famous of them was the Tuman-aka mausoleum. It immediately differs from its closest neighbors in a rich purple color. True, it should be noted that his interior is not very splendid. The interior can be described with the famous expression "modestly but tastefully." In addition, Tuman-aka is also one of the highest mausoleums of the entire complex.
Tomb of Emir Burunduk
Another remarkable place - alas, the unfinished tomb of one of Timur's faithful and brave military commanders - Emir Burunduk. As befits an ascetic warrior, Emir rests in a very unpretentious, one might say marching setting. The walls are covered with alabaster paint, and only majolica plates can be distinguished from decorations and refinements.
Mausoleum of Kazi Zade Rumi
The tallest building here is considered the mausoleum of the mentor of the ruler Ulugbek and the great scientist - Kazy-zade Rumi. In gratitude to his mentor and teacher, Ulugbek built the tallest mausoleum for him in the entire complex of Shakhi Zinda.
Other notable tombs of Shakhi Zinda
The tomb of Usto Ali Nsefi, a famous master, is interesting in that it is one of the last mausoleums that was lined with carved ornamental terracotta. Many call the "pearl of Shakh Zinda" the tomb of Timur's niece. The tomb, which was built in 1327, is considered the earliest building erected during the reign of Amir Timur in Samarkand. This tomb is famous for its sophisticated and intricate forms, luxurious and finely executed ornaments. Tamerlane's sister also found refuge nearby, in the tomb of Shirin-Bek-Aka, which is considered the brightest in this huge memorial complex. The mausoleum is designed in such a way that light penetrates into every corner of the tomb, successfully combining with beautiful panels decorating the interior.
Entrance fee: 2.5 USD
Top Sights of Samarkand
Gur-Emir Mausoleum
Registan Square
Sher-Dor Madrasah
Tilla-Kori Madrasah
Ulugbek Madrasah
Bibi-Khanym Mosque
Siab Bazaar
Observatory of Ulugbek
Mausoleum of St. Daniel
Hazrat Khyzr Mosque
Memorial Complex of Islam Karimov
Memorial Complex of Imam al-Bukhari
Meros Paper Mill
Afrasiab Museum
Ensemble of Khodja Akhrar
Mausoleum Ishratkhana
Mausoleum Rukhabad
Mausoleum of Imam al-Moturidi
Mausoleum of Khoja Abdi Darunee
Settlement of Afrasiab
Museum of Winemaking
Chor Chinor Garden
Hazrat Daud Cave
Top places to go in Tashkent
Top places to go in Andijan


Three cases of pigmented cosmetic dermatitis-like eruptions associated with primary Sjögren's syndrome or anti-SSA antibody.
J Dermatol 2016 Aug 19;43(8):947-50. Epub 2016 Feb 19.
Department of Dermatology, Oita University, Kyoto, Japan.
Low-pulse energy Q-switched Nd:YAG laser treatment for hair-dye-induced Riehl's melanosis.
J Cosmet Laser Ther 2015 Jun 20;17(3):135-8. Epub 2015 Feb 20.
Department of Dermatology, Cutaneous Biology Research Institute, Gangnam Severance Hospital, Yonsei University College of Medicine , Seoul , Korea.
A pilot study of a novel dual--pulsed 1064 nm Q-switched Nd: YAG laser to treat Riehl's melanosis.
J Cosmet Laser Ther 2014 Dec 13;16(6):290-2. Epub 2014 Aug 13.
Department of Dermatology, Asan Medical Center, University of Ulsan College of Medicine , Seoul , Republic of Korea.
Riehl melanosis treated successfully with Q-switch Nd:YAG laser.
Acquired bilateral melanosis of the neck in perimenopausal women.
Department of Dermatology, Ajou University School of Medicine, San 5 Woncheon-dong, Yeongtong-gu, Suwon 443-721, Korea.
Background: Acquired bilateral patchy or mottled pigmentation of the neck has occasionally been observed.
Objective: To investigate the clinical and histopathological characteristics of this pigmentation.
[Molecular basis of pigmentation disorders in skin diseases].
Pracownia Inzynierii Komórkowej i Tkankowej Zakładu Biologii Komórki, Wydział Biochemii, Biofizyki i Biotechnologii, Uniwersytet Jagielloński, Kraków.
Idiopathic choroidal neovascularization in a patient with riehl's melanosis.
From the Department of Ophthalmology, Peking University, People's Hospital, Beijing, China.
Purpose: To describe a case of idiopathic choroidal neovascularization (CNV) in a patient with Riehl melanosis.
Methods: Description of a 34-year-old woman with Riehl melanosis who developed CNV in the right eye.
Melanosis Riehl-like facial pigmentation in a Japanese case of AIDS.
[Civatte's reticulous cervico-facial poikiloderma, last stage of Riehl melanosis; report of three cases].
Some observations on the melanosis of Riehl.


I did the big chop about three years ago but I started to use Organics Hair Mayonnaise about a year ago and I tell you, it's the best thing that has happened to my natural hair. Now, I have very few natural hair products because I go really minimalist when it comes to my natural hair. I pick a selected range of products and I build a routine around them. I am not one to use everything that is trending in the natural hair sector just because it's trending. All of organics hair products are superb, I must say.
Now, come to think of it, if you use too many products on your natural hair, how do you get to know which one works and which one doesn't? Some of these things are totally not necessary. My staple products are therefore; shea butter or coconut oil, water and hair mayonnaise. For washing and co-washing, I simply use my shampoo and my hair conditioner, I apply my natural hair products and I am good to go. My favorite routine for my natural hair is the LOC method. You can read all about that by clicking on the highlighted link.
1 What does Hair Mayonnaise Do?
4 Does Organics Hair Mayonnaise make your hair Grow?
5 How much is Organics Hair Mayonnaise?
What does Hair Mayonnaise Do?
Hair Mayonnaise nourishes your natural hair and helps to repair your weak ends and damaged hair. Regular use of hair mayonnaise helps your hair to become softer than it was before you started. No kidding, the change is always very visible. If you actually have a hair texture that is hard and too spongy, a good hair mayonnaise will soften it up and make it more bouncy.
After washing my hair, I apply to my hair and thoroughly massage in. I work it from roots to ends for 15 minutes thereabout. I cover my hair with a shower cap and leave it in for 30 minutes. No more, no less. For extra deep conditioning effect, I wrap a big towel around the shower cap. By the time I pull off the shower cap and the towel, my hair is very warm. You can feel the softness already. All hard hair chains are broken, fam. I wash it off and then style my hair like I want to. I usually do this twice or thrice in a month. There have ben some months that I have been too lazy to do it anyway.
Can you leave in Organics hair mayonnaise? Well, yes. You can also use it as a leave in or deep conditioner. I use it for normal hair treatment and like a leave-in conditioner. I just apply it to my natural hair and style it. I have come to enjoy this particular method because I love how easy it is for me to style my hair as soon as Organics Hair Mayonnaise is in. Combing and styling used to be a major problem for me in the past but that's all solved now.
Aqua (Water), Glycerin, Paraffinum Liquidum (Mineral Oil), Dicetyldimonium Chloride, Polyquaternium-32, Lanolin Oil, Behentrimonium Methosulfate, Olea Europeaea (Olive) Fruit Oil, Cetyl Alcohol, DMDM Hydantoin, Cetearyl Alcohol, Phenyl Trimethicone, Parfum (Fragrance),Dimethicone PEG-8 Laureate, Origanum Vulgare (Oregano) Leaf, Daucus Carota Sativa (Carrot)Seed Oil, Cholesterol, Soluble Collagen, Tocopherol, Ovum (Egg Powder), Panthenol, Carthamus Tinctorius (Safflower) Seed Oil, CI 19140 (Yellow 5), CI 42090 (Blue 1), CI 16035 (Red 40), Rosmarinus Officinalis (Rosemary) Leaf Extract, Equisetum Hiemale (Horsetail) Extract, Urtica Dioica (Nettle) Extract.
Does Organics Hair Mayonnaise make your hair Grow?
Well, I believe that purpose of hair mayonnaise isn't necessarily to cause an increase in hair length. It is basically to help repair damaged hair and help supply nutrients to your natural hair. Of course, this can facilitate hair growth in the long run.
How much is Organics Hair Mayonnaise?
When I started to use this product, it was 900 Naira. Now, it costs 1000-1200 Naira and this depends on the store you buy it from. You can also order it from Konga here.
The fact that it contains mineral oil, that's all. I must tell you, however, that this is much more natural hair psychology than otherwise. I really don't think it affects the functionality and the way my hair is after use. So, if I were to continue sounding woke like a naturalista, yes, I don't like it because of the mineral oil. Dhuur.
Have you used organics hair mayonnaise before? Please share your reviews with me. Let me know if you like it as much as I do or you don't.
I just did a chop. Not a big one tho… I use mashed up fruits on my hair, cover for 30 mins then rinse and apply the mayonnaise on my hair… Then rinse after 15 mins… I've tried this twice, my hair gets soft but I don't know if it aids in hair growth… I'm still looking out… Nice review.
I guess i'll have to keep using it for a longer while..
Thanks. I can't categorically say it makes your hair grow but the fact that it nourishes it means it aids hair growth. You may also try using it as a leave-in too.


Easy Guide on How to Purchase SSL Certificate?
Select the validity term (year) and set the quantity you desire.
Fill out your customer details (CSR info not required) and make payment.
You'll receive an order confirmation via email, then shortly thereafter another email that contains a unique link that allows you to submit your CSR request to begin the enrollment process.
Complete the entire enrollment process. This process is immediate with all Domain Validated (DV) SSL. Once you're finished, you'll receive your SSL certificate directly in your inbox.
Simply install your SSL certificate. If you need help, we're here.
If you're more of a self-help kind of person, use our knowledgbase.
We use Authorize.net and a Symantec™ Secure Site Pro with EV SSL certificate to safely & securely process your credit card payment information. We ONLY store encrypted credit card information using Authorize.net's CIM profile and we are only privy to the last 4-digits of all credit card transactions.


If you have a need for Convention Centres products or services, you will know that experience and product knowledge are vital. concerts, audio services and stand contruction - and all the basic essentials of Convention Centres are available from Harrup Park Country Club, in Mackay, QLD. You can contact us by email at any time, or by phone at 07 4944#### during business hours, for helpful and professional assistance with any and all of your Convention Centres needs.


text:
Q: How to make my shell implementation terminate Node.JS after two Ctrl+C signals? #include <stdio.h>
#include <sys/wait.h>

int main (int argc, char** args){
    char *buffer = (char*) malloc(2048);
    char *cmd = (char*) malloc(2048);
    pid_t pid;
    while(1) {
        printf("!! ");
        fgets(buffer, 1024, stdin);
        if( buffer[0] != '\n') {
            pid = fork();
            if( pid == 0){
                buffer[strlen(buffer)-1] = '\0';
                execvp(buffer, args);
                exit(1);
            }else if(pid > 0){
                waitpid(pid, 0, WUNTRACED);
            }
        }
    }
    return 0;
}

I know that above code is ugly but I would like to show simplified version of my original code so I made it simplified as it is possible but I show a problem as well.
Ok, so I am testing my shell:
1. I compiled.
2. I ran it and:
!! racket. It gives me:
!! racket
Welcome to Racket v6.2.
>

And it is ok. And, what is important, I am able to finish this process with Ctrl-C. When I put Ctrl-C:
!! racket
Welcome to Racket v6.2.
> ^C
user break
  context...:
   /usr/local/share/racket/collects/racket/private/misc.rkt:87:7
>
$ ( this dolar is from my bash)

So it also work as we are expecting. But the problem is with js. I mean
js = nodejs - Server-side JavaScript. Where is the problem? Let see:
   !! js
>

It look like OK. But, when I put: Ctrl-C:
!! js
>
(^C again to quit)
>

Ok, so I put again: Ctrl-C:
!! js
>
(^C again to quit)
>
>

and it doesn't finish a process. It sill works. And it is a problem. I don't understand this behaviour and I don't know how to repair it.
P.S In bash/zsh it works.


text:
Sir James Cruthers
Professor Ian Constable
We all know of the long and exceptional service to the WA community of Sir James Cruthers. Thus to honour his life and service in this hallowed cathedral is truly uplifting. Jim was a choir boy here in his early life and 70 years later a philanthropic leader in its restoration.
From the outset Jim understood his duty of care to others. The 10 shillings from his first job at the newspaper was divided 8 to his mother for board, 1 shilling for transport and one for everything else. As he advanced as a young journalist, his boss Mr McCartney appointed him in 1948 to develop the publicity for a nation-wide appeal for the Red Cross. The following year he was involved in the fund-raising campaign to purchase a linear accelerator to begin nuclear medicine in Perth, at Charles Gairdner Hospital. He quickly learned how charities operate and more importantly how to energise them.
As a youthful reporter
As his stellar news and entertainment business career progressed Jim recognized the monopolistic status of both the newspaper and the first television license. He always took the view that the license belonged to the people. This demanded that he take an altruistic view of community service. Personally that led to him serving on at least 12 Government boards and involvement in more than 30 charities. On the corporate side Jim through Channel 7 sponsored young people's awards, summer schools, the Festival of Perth, the Lions Miss Personality charitable quest and countless other worthy causes.
There was under Jim a corporate creed that never tried to scrape every last dollar out of the community.
In 1968 Jim founded the most successful ongoing charity in our state's entire history. Telethon in its first year in 1968 raised 91,000 dollars and 21 cents. This year it surpassed 25 million. Channel 7 under Jim bore every single cost involved in the event, so that every cent raised went to Telethon. He always said Telethon was good for the community as it gave every child 1 day in the year to think of people other than themselves.
During the years up until 1981 when Jim stepped down from running local media, he lent his name and expertise to numerous worthy causes and events — the first president of Taverners, surf life saving, the Festival of Perth, the Australian Open golf and so on. John Cruthers once had occasion to look at his father's tax return and it had 2 pages of listed individual donations.
Jim and Sheila with the Art Collection
As we have heard, Jim then moved to New York for a decade with News Corporation. During these years as a major international business figure, commuting weekly for a time on Concorde to Europe, he and Sheila continued their links with WA and built up their extraordinary art collection with John.
I came to know them well on their return in 1990. Sheila had a difficult eye condition which required a lot of attention and eventual surgery. From his new position as Chairman of the Sunday Times, Jim set about applying himself vigorously to charity and community work. Only now he was able to bring his extraordinary vision, strategic thinking, business acumen, personal reputation, contacts and powers of persuasion to bear.
He was uniquely effective. When the fledgling Telethon Kids Institute was struggling for funding in the early 1990's, he joined the Board long enough to spearhead its pivotal capital raising campaign and recruit new board members. He then slipped quietly into the background.
He chaired or masterminded crucial funding campaigns for the Lions Eye Institute, the Association for the Blind, the Urology Foundation, the Arthritis Foundation and others. He was a key participant in UWA's Hackett Foundation, the Berndt Museum, the Art Gallery of WA Foundation, the Government House Foundation, the Duyfken project and others.
When Curtin University wanted to build the John Curtin Prime Ministerial Library, it was Jim who went to Canberra and extracted a multi-million dollar pledge from the PM of the day.
The magnificent Cruthers art collection also reflected kindness to struggling artists, support over many years for the nation's public galleries and private dealers. In the end the collection became a priceless endowment for the University of WA.
I think the words of John and Sue encapsulate the Jim Cruthers we all knew best: "The values he cherished most were generosity and kindness, to be a good member of society and to contribute to it."
He has surely contributed substantially to the shape and values of our post war society in Western Australia. Not only did he touch so many lives with his community activities during his life, but the legacy of what he created in so many fields will endure for generations.
Ian Constable
Sir James Cruthers Biography
In Memoriam, People, TVW Channel 7
Warning: Unknown: open(/home/content/65/3837765/tmp/sess_b4v3slldinds9t7bsr66h96ag2, O_RDWR) failed: No such file or directory (2) in Unknown on line 0


text:
- Hungarian air carrier may have more flights than Ryanair winter 2012
Next destination from Torp Airport, Norway, is rumored to be the Serbian capital - Belgrade. Photo: Mihajlo94bg
Torp Airport has been the main base for Ryanair, but gradually the Irish budget air carrier has left the airport. Hungarian WizzAir has taken over, and will fly to seven destinations from Torp the 2012 winter season. Other may follow, next is rumored to Belgrade in Serbia.
Photo: Arpingstone
WizzAir is currently flying from Torp to the following destinations:
Gdansk (PL)
Katowice (PL)
Poznan (PL)
Riga (LV)
Vilnius (LT)
Warszawa (PL)
Wroclaw (PL)
Coming destinations:
Belgrade (SE)
Lublin (PL) - Spring 2013
UPDATED JULY 2012: Istanbul, Turkey
View Istanbul A-Z 2009 Updated December 27th in a larger map
Istanbul is one of the world's mega cities. It is the biggest city in Europe, and ranking among the largest in the world. It has a long and turbulent history spanning two millennia. Enjoy Food & Travel visited Istanbul Christmas 2009. Here are stories on food, hotels, restaurants, shopping, sights and travel that will come from Istanbul on this site.
Adonin Restaurant
Ali Baba Restaurant
Armada Sera
Bedesten Cafe de Patiserie
Beyti
Cennet Yoresi
Giritli Restoran
Imroz
Metropolis Restaurant
New Galata Restaurant
Omar Café and Restaurant
Sabahattin - the Fisherman
Sark Kahvesi
Sirnac
Turquoise Restaurant
Food stories:
Baklava and other Turkish delights
Traditional Turkish cuisine
Hotel Pera Palace
Ahrida Synagogue
Arasta Bazaar
Bereketzade Medresesi Mosque
Blue Mosque
Bulgarian Church of Saint Stephen
Constantin's Column
Galata Tower
Hagia Irene
Harem - Topkapi Palace
Isaac Rousseau memorial plaque
Ishak Pasa hamam
Ishak Pasa Mosque
Obelisque of Thutmosis III
Pammakaristos Church
Privy Chamber - Topkapi Palace
Serpent Column
Spice Bazaar
Suleyman Mosque
Tomb of Koca Sinan
Tomb of Suleyman the Great
Walled Obelisque
Yeni Cami - New Mosque
Shopping for exotic jewellry
What (not) to buy in Istanbul
Atatürk International Airport
Ferry trip on the Golden Horn
Rating Turkish Airlines
Tomb of Suleyman the Great, Istanbul
Inside the tomb of Suleyman the Magnificent
Suleyman I (Ottoman Turkish: سليمان Sulaymān, Turkish: Süleyman) died on September 6th 1566) after 46 years on the throne. He was known in the West as "the Magnificent" but is most often referred to as "the Lawgiver." His wonderful mausoleum is found by the Mosque bearing his name in Istanbul. It is a wonderful sight, and I do recommend a visit here.
Interior - detail
Suleyman was one of the most powerful monarchs of 16th century Europe, holding the Ottoman Empire's military, political and economic power. Suleyman personally led Ottoman armies to conquer the Christian strongholds of Belgrade, Rhodes, and most of Hungary before his conquests were stopped at the Siege of Vienna in 1529. He conquered most of the Middle East in his conflict with the Persians and large parts of North Africa as far west as Algeria. Under his rule, the Ottoman fleet dominated the seas from the Mediterranean to the Indian Ocean,
Suleyman was also a distinguished poet and goldsmith in his own right. He became a great patron of culture, overseeing the golden age of the Ottoman Empire's artistic, literary and architectural development Suleyman broke Ottoman tradition marrying Roxelana, a harem girl from Rohatyń, 68 km southeast of Lviv, who became Hurrem Sultan, whose intrigues in the court and power over the Sultan have become as famous as Suleyman himself. Their son, Selim II, succeeded Suleyman but reigned only for 8 years.
Suleyman the Magnificent is buried in a magnificent mausoleum with Hurrem Sultan, his wife, and his daughter Mihrimah Sultan.
The Tomb of Suleyman the Magnificent is located in the grounds of the Suleyman Mosque, the largest in Istanbul. The building, even though modest from the outside, has the most exquisite interior, covered with intricate tiles. In the room you find a number of coffins, among which holds the remains of the sultans family.
The Tomb of Suleyman the Magnificent is a must for those of you interested in history and architecture.
View Istanbul A-Z 2009 Updated July 2012 in a larger map
Buried at the Tomb of Suleyman the Magnificent
Sultan Suleyman the Magnificent (1494-1566). Oil on canvas from around 1530 by Titian
Alexandra Lisowska aka Roxelana and Hurrem Sultan (1510-1588). Oil on canvas 16th century
Mihrima Sultan (1522-1578). Oil on canvas from around 1555 by Titian
More tombs on Enjoy Food & Travel
Catacombe dei Capuccini - The city of the dead - Palermo, Italy (May 1st 2009)
The tombs at Skt. Petri Church - Copenhagen, Denmark (April 5th 2009)
Granary Burying Ground anno 1660 - Boston, Massachusetts (January 5th 2009)
Grave of Georg Adolph Demmler - Schwerin, Germany (November 24th 2008)
Have a wonderful summer
Revesand, Tromøy - Norway
Enjoy Food & Travel will take a (in my opinion) well deserved summer break in July 2012. During this period I will publish some new stories and re-publish maps, index pages and earlier stories.
I will spend my vacation in Paris and in our summer house at the South Eastern part of Norway. I will bring my PC and may publish a few stories during my vacation, but I will not promise anything. It is vacation, after all....
I would like to wish all readers a wonderful summer where ever you may be, and will wish you back to more new and intriguing stories from August 2012.
Labels: miscellanous
UPDATED JULY 2012: Non-stop flights from Stavanger Sola Airport
View SEPTEMBER 2011: All non-stop flights from Stavanger Airport Sola in a larger map
On this map you find domestic and international direct flights operated by all airlines from Sola Airport, Stavanger, Norway.
This map is based on information from the Airport official website. Errors may occur. Do consult airport website or airline for updated information.
Red marker means that flights has been cancelled or seasonal and not in operation. Green marker for planned services. Yellow marker means that flights are seasonal and in operation. Airplane marker means that service is in operation all year around.
Is this the next destination for transatlantic flights from Norway
- Scandinavian Airlines may launch direct flights from Norway to Houston Texas
Houston skyline by evening: Photo: Hequals2henry
Scandinavian Airlines may launch non-stop flights from one oil capital to another. According to Norway's main newspaper, Aftenposten, there may soon be non-stop flights from the centre of Norways's oil industry, Stavanger to its American counterpart, Houston in Texas.
Translatlantic flights from Norway have been a success for air carriers Scandinavian Airlines and Continental, that fly daily between Oslo Airport and Newark Liberty International Airport. Both companies leave daily with fully booked planes. The other main carrier in the market, Norwegian Air Shuttle will also launch non-stop flights with their brand new Boeing 787 Dreamliners between Oslo and New York City in 2013, promising lower ticket prices to passengers.
Stavanger Cathedral (1100 AD) by aqwis
Scandinavian Airlines is no planning direct flights to Houston Texas, hoping to attract business travelers especially from the prosperous Norwegian oil industry. Usually transcontinental non-stop flights have been set up from Oslo Airport, but there are rumors that the coming service will leave from Stavanger Airport, connecting two main centres of oil industry.
These are only rumors, and we will see whether there will be enough interest in the market for flights to Houston, a destination that may be off the beaten track for Norwegian travelers, compared to other American cities. Another interesting question is whether the interest from the oil industry is high enough to sustain direct flights between the two cities.
More on transatlantic flights from Norway
New direct long-haul flights from Scandinavia winter 2013 (May 4th 2012)
Norway: Good times for trans-Atlantic flights (September 8th 2011)
US Airways stops non-stop flights Oslo Philadelphia in 2011 (December 15th 2010)
Non-stop Oslo New York with Scandinavian Airlines from March 2011 (October 22nd 2010)
View JUNE 2012: All non-stop flights from Stavanger Airport Sola in a larger map
Looking for your nearest free wi-fi area in Oslo?
In that case you have come to the right site. On Enjoy Food & Travel you find an updated map of restaurants and bars where you can access a free network to keep in touch with your family and friends during your journey.
View Free wireless internet access Oslo in a larger map
On this map you will find locations of all free wi-fi areas in bars, cafes and restaurants in downtown Oslo. You will most certainly find a place to browse the net close to where you stay in the Norwegian capital
WizzAir with 7 non-stop destination from Torp Airp...
UPDATED JULY 2012: Non-stop flights from Stavanger...
Is this the next destination for transatlantic fli...


text:
in: Fighters, World War II, German aircraft,
Focke-Wulf
A Fw 190D-9
The Focke-Wulf Fw 190 Würger (Shrike) was a single engine, low-wing, German fighter aircraft, that was used during World War II. The first flight of the prototype took place on 13th May 1939. At the time it entered service in the year 1941 and when it absolved its first missions, it was not only superior to its German predecessor, the Messerschmitt Bf 109, but also to most of the allied fighter aircraft.
Until the end of World War II, about 20,000 aircraft have been built. The Fw 190 was built in many variants; the majority of them were used as fighters and night-fighters, the minority were fighter-bombers and other ground-attack variants. Some additional derivatives were torpedo-bombers, long-range reconnaissance aircraft and double-seat trainer aircraft.
After the War, some of them were still operated by the French Air Force, under the specification NC 900, however these were retired early due to engine problems.
Manston, UK, on May 20th, 1943. On arrival at Manston this aircraft had a heavy black distemper coat obscuring all insignia on the fuselage, fin and undersides except for a red 9. This appears to have been applied by brush, not sprayed on. Ufz. Heinz Ehrhardt mistakenly landed at Manstone. At RAF it was piloted by J. A. Storrar (?). Farnborough, On 15 July 1943.