text:
package com.hue.services;

import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.hue.common.CardinalityType;
import com.hue.common.ColumnKeyType;
import com.hue.common.DBType;
import com.hue.common.JoinType;
import com.hue.common.TableType;
import com.hue.connection.ConnUtils;
import com.hue.connection.SshException;
import com.hue.model.Column;
import com.hue.model.Datasource;
import com.hue.model.Join;
import com.hue.utils.CommonUtils;

import schemacrawler.schema.Catalog;
import schemacrawler.schema.ForeignKey;
import schemacrawler.schema.Schema;
import schemacrawler.schema.Table;
import schemacrawler.schemacrawler.RegularExpressionExclusionRule;
import schemacrawler.schemacrawler.RegularExpressionInclusionRule;
import schemacrawler.schemacrawler.SchemaCrawlerException;
import schemacrawler.schemacrawler.SchemaCrawlerOptions;
import schemacrawler.schemacrawler.SchemaInfoLevel;
import schemacrawler.schemacrawler.SchemaInfoLevelBuilder;
import schemacrawler.utility.SchemaCrawlerUtility;

public final class SchemaImportService {
	private static final Logger logger = LoggerFactory.getLogger(SchemaImportService.class.getName());

	private static final String TEST_QUERY = "SELECT 1+1";
	private static final String TEST_QUERY_ORACLE = "SELECT 'X' FROM dual";
	private static final String TEST_QUERY_DERBY = "SELECT 1+1 FROM SYSIBM.SYSDUMMY1";
	private static final String ROW_COUNT_QUERY = "SELECT count(*) FROM \"%s\"";
	private static final String ROW_COUNT_QUERY_WITH_SCHEMA = "SELECT count(*) FROM \"%s\".\"%s\"";
	private static final String MYSQL_ROW_COUNT_QUERY = "SELECT count(*) FROM `%s`.`%s`";
	private static final List<String> EXCLUDED_METHODS = Arrays.asList("getURL", "toString", "hashCode", "equals");

	private static final Map<String, schemacrawler.schema.Table> schemaTables = new HashMap<String, schemacrawler.schema.Table>();

	private SchemaImportService() {
	}

	// Import schema names only. No need for anything else.
	public static List<String> importSchemas(Datasource datasource) throws ServiceException {
		List<String> schemaNames = new ArrayList<>();
		try (Connection connection = ConnUtils.getSchemaCrawlerConnection(datasource)) {
			final SchemaCrawlerOptions options = getSchemaCrawlerOptions(datasource);
			options.getSchemaInfoLevel().setRetrieveDatabaseInfo(false);
			options.getSchemaInfoLevel().setRetrieveTables(false);
			Catalog database = SchemaCrawlerUtility.getCatalog(connection, options);
			// MySQL only has catalog name, no schema name
			if (datasource.getDatabaseType() == DBType.MYSQL) {
				schemaNames.addAll(
						database.getSchemas().stream().map(Schema::getCatalogName).collect(Collectors.toList()));
			}
			else {
				schemaNames.addAll(database.getSchemas().stream().map(Schema::getName).collect(Collectors.toList()));
			}
		}
		catch (Exception e) {
			logger.error(e.getMessage(), e);
			throw new ServiceException(e);
		}

		return schemaNames;
	}

	public static Integer getRowCount(Datasource datasource, String schemaName, String tableName)
			throws ServiceException {

		DBType dbType = datasource.getDatabaseType();

		try (final Connection connection = ConnUtils.getNonSshConnection(datasource)) {
			String query = null;
			tableName = CommonUtils.removeQuotes(tableName);

			if (dbType == DBType.MYSQL || dbType == DBType.HIVE) {
				query = String.format(MYSQL_ROW_COUNT_QUERY, schemaName, tableName);
			}
			else if (dbType == DBType.POSTGRESQL || dbType == DBType.REDSHIFT
					|| dbType == DBType.MSSQL || dbType == DBType.DERBY_LOCAL
					|| datasource.getDatabaseType() == DBType.AZURE
					|| datasource.getDatabaseType() == DBType.VERTICA) {
				query = String.format(ROW_COUNT_QUERY_WITH_SCHEMA, schemaName, tableName);
			}
			else {
				query = String.format(ROW_COUNT_QUERY, tableName);
			}

			logger.debug("Count Query = " + query);

			ResultSet rs = connection.createStatement().executeQuery(query);

			rs.next();
			return rs.getInt(1);
		}
		catch (Exception e) {
			throw new ServiceException(e);
		}
	}

	public static void importColumnsForTable(Datasource datasource, com.hue.model.Table table) throws ServiceException {
		// TH 06/07/2015, this method will be called in multithread environment.
		// So have to create
		// SSH connection outside of this method.
		// SshService sshService = null;

		// AA 8/19/2015 - quoting table name to prevent query errors.
		String q = "";
		try (Connection connection = ConnUtils.getNonSshConnection(datasource)) {
			q = connection.getMetaData().getIdentifierQuoteString();

			// Create the options
			final SchemaCrawlerOptions options = getSchemaCrawlerOptions(datasource);
			// update options to only specific schema and table
			String schemaName = table.getSchemaName();
			if (datasource.getDatabaseType() == DBType.MSSQL
					|| datasource.getDatabaseType() == DBType.AZURE
					|| datasource.getDatabaseType() == DBType.REDSHIFT
					|| datasource.getDatabaseType() == DBType.VERTICA) {
				schemaName = datasource.getDatabaseName() + "." + schemaName;
			}

			options.getSchemaInfoLevel().setRetrieveTableColumns(true);
			options.getSchemaInfoLevel().setRetrieveForeignKeyDefinitions(true);
			options.getSchemaInfoLevel().setRetrievePrimaryKeyDefinitions(true);
			options.getSchemaInfoLevel().setRetrieveForeignKeyDefinitions(true);
			options.setSchemaInclusionRule(createSchemaInclusionRule(datasource, table.getSchemaName()));
			options.setTableNamePattern(table.getPhysicalName());

			try {
				// Get the schema definition
				Catalog database = SchemaCrawlerUtility.getCatalog(connection, options);
				com.annimon.stream.Optional<? extends Schema> schemaO = database.lookupSchema(schemaName);

				if(!schemaO.isPresent()) throw new ServiceException("Schema with name " + schemaName + " not found.");

				com.annimon.stream.Optional<? extends Table> schemaTable = database.lookupTable(schemaO.get(),
						quoteIdent(table.getPhysicalName(),q));

				if(!schemaTable.isPresent()) throw new ServiceException("Table with name " + table.getPhysicalName() + " not found in schema " + schemaName);

				// Saved schema table for join detection later.
				schemaTables.put(table.getName(), schemaTable.get());

				for (schemacrawler.schema.Column schemaColumn : schemaTable.get().getColumns()) {
					Column column = new Column();
					column.setName(stripQuoteIdent(CommonUtils.removeBackTicks(schemaColumn.getName()),q));
					column.setDataType(CommonUtils.mapToDataType(
							schemaColumn.getColumnDataType().getTypeMappedClass().getName(),
							schemaColumn.getColumnDataType().getJavaSqlType().getJavaSqlTypeName(),
							schemaColumn.getColumnDataType().getDatabaseSpecificTypeName()));
					column.setKeyType(getKeyType(schemaColumn, schemaTable.get()));

					table.getColumns().add(column);
				}
			}
			catch (Exception e) {
				logger.error(e.getMessage(), e);
				// TH 04/22/2015, In Teradata, if user doesn't have permission
				// on DBC.UDTInfo, getColumns through JDBC will
				// fail. Implemented this fall back method try to retrieve
				// column from ResultSet
				DatabaseMetaData databaseMetaData = connection.getMetaData();
				Statement statement = connection.createStatement();
				ResultSet resultSet = statement.executeQuery(
						"select * from " + quoteIdent(table.getPhysicalName(),q) + " where 1 = 2");

				ResultSetMetaData resultSetMetaData = resultSet.getMetaData();

				List<String> primaryKeys = new ArrayList<>();
				List<String> foreignKeys = new ArrayList<>();

				ResultSet primaryKeyResultSet = databaseMetaData.getPrimaryKeys(null, schemaName,
						table.getPhysicalName());

				while (primaryKeyResultSet.next()) {
					String columnName = primaryKeyResultSet.getString("COLUMN_NAME");
					primaryKeys.add(columnName);
				}

				ResultSet foreignKeyResultSet = connection.getMetaData().getImportedKeys(null, schemaName,
						table.getPhysicalName());

				while (foreignKeyResultSet.next()) {
					String columnName = foreignKeyResultSet.getString("FKCOLUMN_NAME");
					foreignKeys.add(columnName);
				}

				for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
					Column column = new Column();
					column.setName(resultSetMetaData.getColumnName(i));
					column.setDataType(CommonUtils.mapToDataType(
							resultSetMetaData.getColumnClassName(i),
							CommonUtils.getJavaSqlTypeName(resultSetMetaData.getColumnType(i)),
							resultSetMetaData.getColumnTypeName(i)));

					if (primaryKeys.contains(column.getName()))
						column.setKeyType(ColumnKeyType.PRIMARY_KEY);
					else if (foreignKeys.contains(column.getName()))
						column.setKeyType(ColumnKeyType.FOREIGN_KEY);
					else
						column.setKeyType(ColumnKeyType.NO_KEY_TYPE);

//					column.setNullable(resultSetMetaData.isNullable(i) != ResultSetMetaData.columnNoNulls);

					table.getColumns().add(column);
				}
			}

			table.setTableType(getTableType(table));
		}
		catch (Exception e) {
			throw new ServiceException("Failed to import columns for table - " + table.getName(), e);
		}
	}

	public static TableType getTableType(com.hue.model.Table table) {
		List<Column> primaryKeyColumns = table.getPrimaryKeys();
		List<Column> foreignKeyColumns = table.getForeignKeys();
		List<Column> nonkeyColumns = table.getKeys(ColumnKeyType.NO_KEY_TYPE);

		if (primaryKeyColumns.size() == 1 && foreignKeyColumns.isEmpty()) {
			return TableType.DIMENSION;
		}
		else if (foreignKeyColumns.size() == table.getColumns().size()
				|| (foreignKeyColumns.size() > 0 && nonkeyColumns.isEmpty())) {
			return TableType.BRIDGE;
		}
		else if (foreignKeyColumns.size() > 0 && nonkeyColumns.size() > 0) {
			return TableType.FACT;
		}else if (foreignKeyColumns.isEmpty() && primaryKeyColumns.isEmpty()) {
			if(table.getDatasource() != null && table.getDatasource().getDatabaseType() == DBType.REDSHIFT) {
				return TableType.DIMENSION;
			}
			return TableType.FACT;
		}

		return TableType.DIMENSION;
	}

	public static ColumnKeyType getKeyType(schemacrawler.schema.Column column, Table table) {
		if (table.getPrimaryKey() != null
				&& table.getPrimaryKey().getColumns().stream().anyMatch(c -> column.getName().equals(c.getName()))) {
			return ColumnKeyType.PRIMARY_KEY;
		}
		else {
			for (ForeignKey foreignKey : table.getImportedForeignKeys()) {
				if (foreignKey.getColumnReferences().stream().anyMatch(
						c -> c.getForeignKeyColumn().getName().equals(column.getName()))) {
					return ColumnKeyType.FOREIGN_KEY;
				}
			}
		}

		return ColumnKeyType.NO_KEY_TYPE;
	}

	public static String quoteIdent(String physicalName, String q) {
		if(physicalName.contains(" ")){
			return q + physicalName + q;
		}else{
			return physicalName;
		}
	}

	// Only import tables based on options. No column and key information
	// loaded.
	// Be aware that how much information to retrieve by this method is
	// determined by options. By default,
	// options excluded column information.
	public static List<com.hue.model.Table> importTables(Datasource datasource, Connection connection, SchemaCrawlerOptions options)
			throws ServiceException {

		List<com.hue.model.Table> availableTables = new ArrayList<com.hue.model.Table>();
		schemaTables.clear();

		// Get the schema definition
		Catalog database;
		String q = "";
		try {
			database = SchemaCrawlerUtility.getCatalog(connection, options);
			q= connection.getMetaData().getIdentifierQuoteString();
		}
		catch (SchemaCrawlerException | SQLException e) {
			throw new ServiceException("Cannot crawl database catalog", e);
		}

		String databaseVendor = database.getDatabaseInfo().getProductName();
		if (databaseVendor == null) {
			databaseVendor = datasource.getDatabaseType().getVendorName();
		}
//		datasource.setDatabaseVendor(databaseVendor);
		String databaseVersion = database.getDatabaseInfo().getProductVersion();
		if (databaseVersion == null) {
			databaseVersion = "?";
		}
//		datasource.setDatabaseVersion(databaseVersion);

		for (Schema schema : database.getSchemas()) {
			logger.debug("Import schema - " + schema.getName());

			for (schemacrawler.schema.Table schemaTable : database.getTables(schema)) {
				com.hue.model.Table table = new com.hue.model.Table();
				table.setDatasource(datasource);
				table.setName(stripQuoteIdent(schemaTable.getName(),q));
				table.setPhysicalName(stripQuoteIdent(schemaTable.getName(),q));
				Schema tableSchema = schemaTable.getSchema();
				String schemaName = tableSchema.getName();
				if (schemaName == null) {
					schemaName = tableSchema.getFullName();
				}
				table.setSchemaName(schemaName);
				// System.err.println("Table name = " + schemaTable.getName());
				// if (schemaTable.getPrimaryKey() != null) {
				// schemaTable.getPrimaryKey().getColumns().forEach(c ->
				// System.err.println("Primary Key Column: " + c.getName()));
				// }
				//
				// if (schemaTable.getImportedForeignKeys().size() > 0) {
				// schemaTable.getImportedForeignKeys().forEach(fk ->
				// {System.err.println("Imported Foreign Key Name : " +
				// fk.getName());
				// fk.getColumnReferences().forEach(cr ->
				// System.err.println("Imported Foreign Key Column Reference : "
				// +
				// cr.getForeignKeyColumn().getParent().getName() + "." +
				// cr.getForeignKeyColumn().getName() + " "
				// + cr.getPrimaryKeyColumn().getParent().getName() + "." +
				// cr.getPrimaryKeyColumn().getName()));
				// });
				// }
				//
				// if (schemaTable.getExportedForeignKeys().size() > 0) {
				// schemaTable.getExportedForeignKeys().forEach(fk ->
				// {System.err.println("Exported Foreign Key Name : " +
				// fk.getName());
				// fk.getColumnReferences().forEach(cr ->
				// System.err.println("Exported Foreign Key Column References :
				// "
				// + cr.getForeignKeyColumn().getParent().getName() + "." +
				// cr.getForeignKeyColumn().getName()
				// + " " + cr.getPrimaryKeyColumn().getParent().getName() + "."
				// + cr.getPrimaryKeyColumn().getName()));
				// });
				// }
				//
				// if (schemaTable.getPrivileges().size() > 0) {
				// schemaTable.getPrivileges().forEach(p ->
				// System.err.println("Table Privileges" + p.getFullName()));
				// }
				// TH 04/02/2015, no longer load column information here.
				// for (schemacrawler.schema.Column schemaColumn :
				// schemaTable.getColumns()) {
				// Column column = new Column();
				// column.setName(schemaColumn.getName());
				// column.setDataType(schemaColumn.getColumnDataType().getDatabaseSpecificTypeName());
				// column.setKeyType(UIUtils.getKeyType(schemaColumn,
				// schemaTable));
				// column.setNullable(schemaColumn.isNullable());
				//
				// table.addColumn(column);
				// }

				// table.setTableType(UIUtils.getTableType(table));

				// TH 09/22/2014, do not load row count when import tables
				// ResultSet rs =
				// connection.createStatement().executeQuery(String.format(ROW_COUNT_QUERY,
				// schemaTable.getName()));
				// rs.next();
				// table.setRowCount(rs.getInt(1));

				availableTables.add(table);
				// schemaTables.put(table.getName(), schemaTable);
			}
		}

		return availableTables;
	}

	private static String stripQuoteIdent(String name, String q) {
		String pattern = "^\\" +  q + "|\\.\\" + q + "|\\" + q +"$";
		return name.replaceAll(pattern, "");
	}

	public static String getDefaultSchema(Datasource datasource, List<String> schemas) throws ServiceException {
		if (schemas == null || schemas.isEmpty()) throw new ServiceException("No schema found in target database");

		String schemaName = null;

		if (datasource.getDatabaseType() == DBType.ORACLE) {
			schemaName = datasource.getUserName();
		}
		else if (datasource.getDatabaseType() == DBType.MSSQL
				|| datasource.getDatabaseType() == DBType.AZURE) {
			schemaName = "dbo";
		}
		else if (datasource.getDatabaseType() == DBType.POSTGRESQL || datasource.getDatabaseType() == DBType.REDSHIFT || datasource.getDatabaseType() == DBType.VERTICA) {
			schemaName = "public";
		}
		else {
			schemaName = datasource.getDatabaseName();
		}

		// go through given schema list to find out exact name in database. If it doesn't exist, pick the first
		// one as default schema name
		final String name = schemaName;
		Optional<String> result = schemas.stream().filter(n -> n.equalsIgnoreCase(name)).findAny();

		if (result.isPresent()) {
			schemaName = result.get();
		}
		else {
			schemaName = schemas.get(0);
		}

		return schemaName;
	}

	public static List<com.hue.model.Table> importTablesForSchemas(Datasource datasource, List<String> schemaNames) throws ServiceException {
		try (Connection connection = ConnUtils.getConnection(datasource)) {
			// Create the options
			final SchemaCrawlerOptions options = getSchemaCrawlerOptions(datasource);
			options.setSchemaInclusionRule(createSchemaInclusionRule(datasource, schemaNames));

			return importTables(datasource, connection, options);
		}
		catch (SQLException e) {
			throw new ServiceException("Database exception", e);
		}
		catch (SshException e) {
			throw new ServiceException("SSH connection failed.", e);
		}
		catch (ClassNotFoundException e) {
			throw new ServiceException(e);
		}
		catch (IOException e) {
			throw new ServiceException(e);
		}
	}

	public static List<com.hue.model.Table> importTablesForSchema(Datasource datasource, String schemaName) throws ServiceException {
		return importTablesForSchemas(datasource, Arrays.asList(schemaName));
	}

	public static SchemaCrawlerOptions getSchemaCrawlerOptions(Datasource datasource) {
		final SchemaCrawlerOptions options = new SchemaCrawlerOptions();
		// Set what details are required in the schema - this affects the
		// time taken to crawl the schema
		SchemaInfoLevel schemaInfoLevel = SchemaInfoLevelBuilder.minimum();
		schemaInfoLevel.setRetrieveAdditionalJdbcDriverInfo(false);
		schemaInfoLevel.setRetrieveRoutines(false);
		schemaInfoLevel.setRetrieveColumnDataTypes(false);
		schemaInfoLevel.setRetrieveTableColumns(false);
		schemaInfoLevel.setRetrieveForeignKeys(true);

		options.setSchemaInfoLevel(schemaInfoLevel);

		DBType dbType = datasource.getDatabaseType();

		if (dbType == DBType.REDSHIFT) {
			options.getSchemaInfoLevel().setRetrieveForeignKeys(false);
		}

		switch (dbType) {
		case POSTGRESQL:
		case REDSHIFT:
			// options.setSchemaInclusionRule(new
			// RegularExpressionExclusionRule(Pattern.compile(
			// "INFORMATION_SCHEMA|PG_CATALOG|PG_INTERNAL",
			// Pattern.CASE_INSENSITIVE)));
			break;
		case MYSQL:
			// options.setSchemaInclusionRule(new
			// RegularExpressionExclusionRule(Pattern.compile("INFORMATION_SCHEMA",
			// Pattern.CASE_INSENSITIVE)));
			break;
		case MSSQL:
		case AZURE:
			options.setSchemaInclusionRule(new RegularExpressionInclusionRule(Pattern.compile(
					String.format("%s\\..*", datasource.getDatabaseName()), Pattern.CASE_INSENSITIVE)));
			break;
		case TERADATA:
			// options.setSchemaInclusionRule(new
			// RegularExpressionExclusionRule(Pattern.compile(
			// "\"All\"|Crashdumps|\"DBC\"|EXTUSER|SQLJ|SYSLIB|SYSSPATIAL|SYSUDTLIB|SysAdmin|Sys_Calendar|SystemFe|TDPUSER|TDStats|TD_SYSFNLIB|dbcmngr|tdwm",
			// Pattern.CASE_INSENSITIVE)));
			// options.setSchemaInclusionRule(new
			// RegularExpressionInclusionRule(Pattern.compile(
			// datasource.getDatabaseName(), Pattern.CASE_INSENSITIVE)));
			break;
		case DERBY_LOCAL:
		case DERBY_REMOTE:
			options.setSchemaInclusionRule(
					new RegularExpressionExclusionRule(Pattern.compile("SYS", Pattern.CASE_INSENSITIVE)));
			break;
		case ORACLE:
			// options.setSchemaInclusionRule(new
			// RegularExpressionExclusionRule(Pattern.compile(
			// "ANONYMOUS|APEX_PUBLIC_USER|CTXSYS|DBSNMP|DIP|EXFSYS|FLOWS_%|FLOWS_FILES|LBACSYS|MDDATA|MDSYS|MGMT_VIEW|OLAPSYS|ORACLE_OCM|ORDDATA|ORDPLUGINS|ORDSYS|OUTLN|OWBSYS|SI_INFORMTN_SCHEMA|SPATIAL_CSW_ADMIN_USR|SPATIAL_WFS_ADMIN_USR|SYS|SYSMAN|SYSTEM|WKPROXY|WKSYS|WK_TEST|WMSYS|XDB|XS$NULL|APPQOSSYS|RDSADMIN|\"SYSTEM\"|DBSNMP|CTXSYS|DIP|SYS|OUTLN",
			// Pattern.CASE_INSENSITIVE)));
			break;
		case HIVE:
			schemaInfoLevel.setRetrieveForeignKeys(false);
			schemaInfoLevel.setRetrieveColumnDataTypes(false);
			schemaInfoLevel.setRetrieveDatabaseInfo(false);
//			schemaInfoLevel.setRetrieveAdditionalSchemaCrawlerInfo(false);
			schemaInfoLevel.setRetrieveAdditionalJdbcDriverInfo(false);
			break;
		case VERTICA:
		case ACCESS:
		case UNKNOWN:
		default:
			break;
		}
		return options;
	}

	public static boolean testConnection(Datasource datasource) throws Exception {
		try (Connection connection = ConnUtils.getSchemaCrawlerConnection(datasource)) {
			DBType dbType = datasource.getDatabaseType();

			String query = null;
			switch (dbType) {
			default:
			case POSTGRESQL:
			case MSSQL:
			case AZURE:
			case TERADATA:
			case MYSQL:
			case ACCESS:
			case HIVE:
			case REDSHIFT:
			case VERTICA:
			case UNKNOWN:
				query = TEST_QUERY;
				break;
			case DERBY_LOCAL:
			case DERBY_REMOTE:
				query = TEST_QUERY_DERBY;
				break;
			case ORACLE:
				query = TEST_QUERY_ORACLE;
				break;
			}
			connection.createStatement().execute(query);

			return true;
		}
		catch (Exception e) {
			throw e;
		}
	}

	// This method have to be called after importSchema() method
	public static List<Join> getJoinDefs(List<com.hue.model.Table> tables) {
		List<Join> joinDefs = new ArrayList<Join>();

		tables.forEach(t -> {
			schemacrawler.schema.Table rightSchemaTable = schemaTables.get(t.getName());
			// TH 06/15/2015, for adding additional table case, schemaTables
			// does not contain the tables which
			// already loaded.
			if (rightSchemaTable != null) {
				rightSchemaTable.getImportedForeignKeys().forEach(fk -> {
					schemacrawler.schema.Table leftSchemaTable = fk.getColumnReferences().get(
							0).getPrimaryKeyColumn().getParent();

					// ignore the self join
					if (!rightSchemaTable.equals(leftSchemaTable)) {
						Optional<com.hue.model.Table> leftTable = tables.stream().filter(
								t1 -> t1.getName().equals(leftSchemaTable.getName())).findFirst();
						if (leftTable.isPresent()) {
							// create join def
							Join joinDef = new Join();

							joinDef.setCardinalityType(CardinalityType.ONE_TO_MANY);
							joinDef.setJoinType(JoinType.INNER_JOIN);
							joinDef.setLeft(leftTable.get());
							joinDef.setRight(t);

							final StringBuffer formula = new StringBuffer("");
							fk.getColumnReferences().stream().filter(
									cr -> cr.getForeignKeyColumn().getParent().equals(rightSchemaTable)).forEach(cr -> {
								if (!formula.toString().equals("")) {
									formula.append(" and ");
								}

								formula.append(CommonUtils.getOptionallyQuotedName(leftTable.get().getName()) + ".")
									.append(CommonUtils.getOptionallyQuotedName(cr.getPrimaryKeyColumn().getName()))
									.append(" = ").append(CommonUtils.getOptionallyQuotedName(t.getName()) + ".")
									.append(CommonUtils.getOptionallyQuotedName(cr.getForeignKeyColumn().getName()));
							});

							joinDef.setSql(formula.toString());

							joinDefs.add(joinDef);
						}
					}
				});
			}
		});

		if (logger.isInfoEnabled()) {
			StringBuffer sb = new StringBuffer();
			joinDefs.forEach(jd -> sb.append(((Table) jd.getLeft()).getName()).append(" ").append(
					jd.getJoinType()).append(" ").append(((Table) jd.getRight()).getName()).append(" ").append(
							jd.getCardinalityType()).append(" ").append(jd.getSql()).append(
									System.lineSeparator()));
			logger.info(sb.toString());
		}
		return joinDefs;
	}

	public static RegularExpressionInclusionRule createSchemaInclusionRule(Datasource datasource, List<String> schemaNames) {
		RegularExpressionInclusionRule inclusionRule = null;

		if (datasource.getDatabaseType() == DBType.MSSQL || datasource.getDatabaseType() == DBType.REDSHIFT
				|| datasource.getDatabaseType() == DBType.VERTICA || datasource.getDatabaseType() == DBType.AZURE) {
			String rule = schemaNames.stream().map(n -> String.format("%s\\.%s", datasource.getDatabaseName(), n)).collect(Collectors.joining("|"));
			inclusionRule = new RegularExpressionInclusionRule(Pattern.compile(rule, Pattern.CASE_INSENSITIVE));
		}
		else {
			inclusionRule = new RegularExpressionInclusionRule(Pattern.compile(String.join("|", schemaNames), Pattern.CASE_INSENSITIVE));
		}

		return inclusionRule;
	}

	public static RegularExpressionInclusionRule createSchemaInclusionRule(Datasource datasource, String schemaName) {
		return createSchemaInclusionRule(datasource, Arrays.asList(schemaName));
	}

	public static Map<String, Object> importDbProps(Datasource datasource) throws ServiceException {
		Map<String, Object> dbProps = new HashMap<String, Object>();

		try (Connection connection = ConnUtils.getSchemaCrawlerConnection(datasource)) {
			DatabaseMetaData metaData = connection.getMetaData();
			Method[] methods = metaData.getClass().getMethods();

			for (Method method : methods) {
				if (method.getParameterCount() == 0 && !EXCLUDED_METHODS.contains(method.getName()) && !Modifier.isAbstract(method.getModifiers())
					&& (method.getReturnType() == int.class || method.getReturnType() == boolean.class || method.getReturnType() == String.class)) {
					try {
						dbProps.put(method.getName(), method.invoke(metaData));
					}
					catch (Exception e) {
						logger.error("Failed to import property - " + method.getName());
					}
				}
			}

//			dbProps.forEach((k, v) -> System.out.println("Key = " + k + " v = " + v));
		}
		catch (Exception e) {
			logger.error(e.getMessage(), e);
			throw new ServiceException(e);
		}

		return dbProps;
	}
}


It's Super Bowl time once again! Maybe you are an avid football fan and you'll be cheering on your favorite tip while you dig in to some tasty super bowl snacks. Or maybe you're more like me and don't really care who is playing as long as there's good food.
For me, going to a Super Bowl party is all about the food – and there are plenty of good Super Bowl recipes to be enjoyed – and hanging out with some friends. It's not a party, Super Bowl or otherwise, without dips, right? Check out this list of dip recipes that will keep your guests coming back for more . . . and even more.
Whether you're watching the game with a crowd or settling in alone with the TV remote, delicious munchies are practically a Super Bowl requirement. Do you need a recipe for a classic blue cheese dip to pair with your favorite wings or something to scoop up with chips? Here are 15 Dip Recipes for Super Bowl 2015. They are all game day approved, tested by the football fans and the food lovers so they're sure to be a hit!
Do you have big food plans for Game Day?
This post is sponsored by Evite. For more dip ideas be sure to check out Evite's 5 Classic Dips. Start inviting everyone to watch the game with you with Evite's premium invitation or others from Evite's Watch the Game invitation gallery.


text:
Download & Play Dawn of Zombies: Survival on PC & Mac (Emulator)
Royal Ark. We craft best action games every day--
Make New Allies and Keep Them Safe
Dawn of Zombies: Survival is an Action game developed by Royal Ark. We craft best action games every day. BlueStacks app player is the best platform (emulator) to play this Android game on your PC or Mac for an immersive gaming experience.
After a nuclear accident the world has completely changed. People are turning into zombies and the only humans that are not affected aim for the Last Territories. Only there can you withstand the terrors of the outside world, but life as you know it is still in danger. Radiation, starvation, wild beasts, bandits and horrible creatures are waiting for you at every step. The Charred are all over the place, so it's up to you dive into this survival simulator, and save people from zombie attacks. Recover items from the corpses of the fallen, stock up on supplies and move on to the next chapter. Make sure to eat and drink in order to keep your strength up and never challenge zombies on an empty stomach!
Dawn of Zombies: Survival PC?
Dawn of Zombies: Survival in the search bar at the top right corner
Dawn of Zombies: Survival from the search results
Dawn of Zombies: Survival
Dawn of Zombies: Survival icon on the home screen to start playing

redpajama_set_name: RedPajamaCommonCrawl


text:
One dead, six wounded in Hamburg supermarket knife attack
GERMANY: One person was killed and six others were injured yesterday (July 28) when a failed asylum-seeker brandishing a knife attacked shoppers in a Hamburg supermarket, shouting "Allahu Akbar" before being overpowered by passers-by, police and officials said.
crimedeathimmigrationpoliceviolence
Saturday 29 July 2017, 09:38AM
Police cordon off the area around a supermarket in the northern German city of Hamburg, where a man killed one person and wounded several others in a knife attack, yesterday (July 28). Photo: AFP
The attack had been motivated by "hate', mayor Olaf Scholz said, although he stopped short of declaring it a terrorist incident.
"It makes me especially angry that the perpetrator appears to be a person who claimed protection in Germany and then turned his hate against us," he said.
If confirmed as an Islamist attack, it would be the first in Germany since Tunisian Anis Amri drove a truck into crowds at a Berlin Christmas market on December 19 last year, killing 12 and injuring 48.
Police said that the man was a 26-year-old born in the United Arab Emirates, but were unable to immediately confirm his nationality or identify the motive behind the violence.
News website Spiegel Online reported that the individual was named Ahmad A., who had arrived in Germany seeking asylum and had contact with the Islamist scene as well as a history of mental health problems and drug use.
The attacker had been scheduled to be deported, but the process had been held up as he lacked identity papers, Scholz said.
A police murder unit and a squad specialising in politically-motivated crime are investigating the attack.
Germany has been on high alert about the threat of a jihadist attack since Amri's rampage in Berlin, for which the Islamic State group claimed responsibility.
Jihadists have also carried out a string of random assaults in European countries using knives.
Like the Hamburg attacker, Amri was a failed asylum seeker who could not be deported for lack of documents.
The similarity between the two cases risks reopening barely-healed wounds over Chancellor Angela Merkel's decision to allow more than million migrants into Germany since 2015, with just two months to go until legislative elections in September.
"These criminals want to poison our free society with fear, but they will not succeed," Mayor Scholz said.
The attacker stabbed to death a 50-year-old man, believed to be a German citizen, and "struck out wildly" at others, wounding a woman and four men aged 19 to 64, police said.
Another 35-year-old man was hurt while overpowering the attacker in the street alongside other passers-by shortly after the killing.
"A crowd of about 30 people ran out of the supermarket. They yelled that someone had been stabbed... we saw a man go past with a big knife, like a butcher's knife, in his hand," eyewitness Ralf Woyna said.
Woyna had been sitting at a cafe opposite the entrance to the shop where the chase began.
"Two customers who also looked Middle Eastern took all the chairs from the cafe and ran after him. I lost sight of them for a minute and heard a shout of 'Allahu Akbar' in the distance, I knew it was an attack straight away," he added.
An amateur mobile phone video published by news site Spiegel Online showed a handful of pursuers confronting the attacker, a bearded man wearing a T-shirt and jeans, amid dense city traffic.
They can be seen hurling chairs at him to keep him at a safe distance as he yells and brandishes the knife.
According to Spiegel Online, the 35-year-old man injured during the struggle was the one who finally forced the suspect to the ground, using a pole.
The witnesses slightly hurt the attacker while they were overpowering him, before handing him over to police.
Newspaper Bild published images of the man lying handcuffed on the ground and sitting in the back seat of a police car, a bloodied white bag pulled over his head.
* Please login to comment. If you do not have an account please register below by simply entering a username, password and email address. You can still leave your comment below at the same time.
Comments Here:
I agree to Comment Policy
Have a news tip-off? Click here
Red flags line Phuket beaches as dangerous surf broils
PHUKET XTRA: VIDEO: Medical marijuana tourism? Dead bride made up! Dog attacker arrested? || July 19
Phuket told to brace for more rain, warned of flash floods, landslides
Driver, 25, charged for asleep at the wheel as truck overturns on main Phuket road
Search for Filipinos lost in Phuket surf continues
Praewa's family to sell land to compensate crash victims
UN: Southeast Asia's meth gangs making $60 billion a year
Free cash to spur tourism, economy
PHUKET XTRA: VIDEO: Teen caught pimping? Patong fire! Tourists lost in surf! || July 18
New tourism minister highlights visitor-safety
Banyan Tree Phuket launches new Serenity Pool Villas & Residences


http://www.NewsAndOpinion.com -- WHEN Webvan, the online grocer, folded, there was much sorrow among those of us who enjoy typing credit card numbers on computers, clicking on icons of bananas, and having real bananas show up magically at the door at our convenience. Now, if we want bananas, we have to leave the house again. Darn. Certainly not the golden future I imagined.
Now the lawyers and creditors and liquidators will pick at the bones. In Webvan's case there are bones to pick, unlike most dotcoms which consisted of a website, a baffling business model, a visionary, and overworked engineers, there are actual assets-- warehouses and trucks.
As a matter of fact, the San Francisco Giants are the proud owners of some Webvan assets, kind of. Every seat cup holder at Pac Bell Park is plastered with the Webvan logo, 42,000 logos in all. What do you do about that?
The logos are paid for through the year, but on the other hand, why advertise a company that no longer exists, when that valuable cupholder space could be sold to another dotcom that will go broke within the year? This could set up a lucrative franchise in the seat cup holder logo leasing niche market. Of course, you'd have to pay maintenance people overtime for all the logo scraping they'll have to do, but I'll bet the profit margin would still make it worthwhile.
When you think about it, the amount of surface available for advertising has expanded outwards in roughly the same ratio as the number of dotcoms collapsing inwards. Yes, businesses are dropping like flies, but we now see ads on buses, ads on automatic teller machines, ads on blimps, ads on flying banners, matchbooks, mini-vans, even on those little dividers that separate people's groceries at the store.
And what about the billboards for defunct companies?
You see them all the time, the company's in Chapter 11, but the billboard's paid for through the month. There they stand as you crawl by in gridlock, advertisements for nothing, the ectoplasm of a ghost economy.


text:
|}

De spoorlijn Hillerød - Gilleleje / Tisvildeleje (Deens: Gribskovbanen) is een lokaalspoorlijn van Hillerød via Kagerup naar Gilleleje en van Hillerød naar Tisvildeleje op het eiland Seeland in Denemarken.

Geschiedenis
In 1873 werden plannen gemaakt voor de aanleg van een spoorlijn in Gribskov ten noorden van Hillerød. Het duurde nog tot 1879 voordat Scandia de opdracht kreeg om een spoorlijn van Hillerød naar Græsted aan te leggen en het materieel te leveren.
Op 20 januari 1880 werd met de lijn door de eerder dat jaar op 7 januari opgerichte Gribskovbanens Driftsselskab (GDS) begonnen.
Nog voordat er een spade in de grond ging voor de aanleg van deze lijn, werden al plannen gemaakt voor verlenging van de lijn naar Gilleleje. In 1894 werd begonnen met de aanleg en op 14 mei 1896 werd de verlengde lijn geopend.
In 1894 werd ook begonnen met het maken van plannen voor een aftakking vanaf Kagerup naar Helsinge, waarvan de aanleg in 1896 begon. Op 15 juli 1897 vond de opening plaats.
Ruim tien jaar later in 1908 werden plannen gemaakt om de lijn vanuit Helsinge te verlengen naar Tisvildeleje, ditmaal zonder subsidie van de overheid. Pas in 1918 was de financiering rond en kon tot aanleg worden overgegaan. Op 11 juli 1924 werd deze verlenging geopend.

Exploitatie
De exploitatie van deze spoorlijnen werd sinds de openingen door de Gribskovbanens Driftsselskab (GDS) verzorgd. Aanvankelijk werd met stoomtractie gereden, later werd overgegaan op het gebruik van railbussen.

Naarmate het treinverkeer toenam werden de treinen naar Gilleleje en Tisvildeleje op het gemeenschappelijke deel tussen Hillerød en Kagerup gecombineerd.

Vanaf 2001 werden plannen gemaakt om een aantal private spoorlijnen op Seeland, waaronder ook Gribskovbanen, onder te brengen bij de Hovedstadens Udviklingsråd (HUR), een organisatie die het lokale busvervoer in Seeland beheerde. In mei 2002 werden twee nieuwe maatschappijen opgericht, waarin de meeste private spoorwegmaatschappijen op Seeland fuseerden. De infrastructuur en het materieel werden ondergebracht bij Hovedstadens Lokalbaner (HL), de exploitatie werd verzorgd door Lokalbanen (LB).

In de zomer rijden er museumtreinen van de Nordsjællands Veterantog tussen Græsted en Gilleleje naar Grønnehave.

Literatuur
 Gerrit Nieuwenhuis / Richard Latten: Spoorwegen (diverse jaargangen), uitgeverij de Alk BV Alkmaar

Externe link
 Lokalbanen
 Nordsjællands Veterantog

Spoorlijn in Denemarken

redpajama_set_name: RedPajamaWikipedia


What an extraordinary thing to say. Do even the great grandchildren of the Austro-Hungarian aristocrats care about the socio-politics of the day? But who among us would not like to have walked among the stalls of the alchemists and Jewish magicians in the Jewish Quarter of Prague, or met an eastern girl in a tryst in view of Charles Bridge or Hradcany Castle as the dusk gathered and lamps were lit.
How and why do academics learn the inability to read?


Thank you for the time to visit the new RTG website. We hope that you find it informative and beneficial to you and your agency. For those of you who don't know who I am, my name is Jim Birrell and I am the Executive Director of the Los Angeles Area Regional Training Group. I am in my fourth year serving in this capacity and was honored to be selected to "pick up the baton" where the previous leadership left off.
Prior to this position, I served as Fire Chief in the City of Monterey Park, retiring in 2014 after a 31 year career with that organization. To say we are in an exciting time in the Fire Service would be an understatement. The advances achieved with regard to training and firefighter safety are astounding and we at the RTG are honored to assist every agency within our region with delivering the highest quality training while staying abreast of the latest technological advances associated with that training. The introduction of the Smart Classroom technology will aid tremendously in the delivery of training materials. This will allow firefighters in the San Fernando Valley to join firefighters in the eastern San Gabriel Valley via this technology where they can receive the same training at the same time. This type of training delivery will propel the RTG and all 31 agencies into the forefront of training not just in California but the United States. The threat of terrorism is unfortunately a threat that is here to stay as evidenced by the attacks in Paris and right here in San Bernardino County. While we all hope that a threat never materializes into an event, we must prepare and train as if it could happen at any moment. Advances in Urban Search and Rescue techniques along with new educational opportunities with Hazardous Materials training will aid our region in our efforts to be prepared to mitigate and respond to any event that might occur in our region.
Additionally, the RTG launched the new Training Delivery Model earlier this year. This new training platform will help all 9,000 Firefighters in the Region to train as one! Please be sure to log in to the RTG LMS or your Department's designated LMS for participation.
We at the RTG serve at the pleasure of the 30 agencies that comprise our region. We are here for you and your training needs. Please take some time to browse through our website. If there is something you would like to see added, please do not hesitate to contact either myself or one of the talented individuals that assist me in ensuring the highest level of training delivery for our region's personnel.


text:
Get a fresh start.
Choose your FT trial
Opinion New Technology Policy Forum
Add to myFT
Eli Noam: The internet's third wave
Share on Twitter (opens new window)
Share on Facebook (opens new window)
Share on LinkedIn (opens new window)
Share on Whatsapp (opens new window)
Save to myFT
Eli Noam
Experimental feature
Listen to this article
Play audio for this article
Report a mispronounced word
What was mispronounced? Optional: help us by adding the time
Last week, the UN held in Tunis its global summit on the information society. The summit brought together almost 30 heads of state and government, and about twenty thousand officials, activists, experts, managers, plainclothes Tunisian police, and plain geeks.
Most of the media attention was focused on the battle over American control of the internet through its hold over the private non-profit entity ICANN that runs some organisational aspects of the internet. That role had been challenged by the EU, as well as by countries such as Iran, Cuba, and China. Zimbabwe's Robert Mugabe, for example, decried the "undemocratic" internet . In the end, the US (with the help of Australia, Canada, Japan, and India) got to keep its role for the present, but a global forum will be established whose undeclared function is to help whittle down US control. The likely end-result is a two-tier mechanism, with an intergovernmental rule-setting board and a non-profit implementation body like the existing ICANN, with a broadened base.
There was a quaint aura to this heated debate by diplomats parsing words relating to national sovereignty and intergovernmental models, when in reality the issue isn't one of which government should be in control. It isn't even whether the private sector or government should be in control. The emerging issue is whether the commercial or the non-profit parts of the private sector will be in charge: the second or the third wave of the internet.
The first wave was the early generation of 'techies' who cooperatively established the technology and culture of the internet. They were largely apolitical. The second wave were the innovators and dotcom entrepreneurs who created industries from scratch. They were largely anti-political and libertarian. The third wave, strongly represented in Tunis through NGOs, is that of the internet social activists, under the loose umbrella of "civil society", who are highly political and often seek a state role in the internet. What is manifest is the shift of energy from the second wave that sought to push the envelope to the activist third wave that seeks to redress problems and grievances.
The activism of civil society NGOs in Tunis is part of a much larger third wave mobilization in the information sector. It is manifest in a variety of disparate fronts. Just in the US, they include:
• the struggle over media concentration that overwhelmed last year the American government and media industry.
• the "open source" movement that battles and baffles Microsoft.
• the fair use and "copyleft" community that challenges restrictive copyright expansion to the benefit of companies such as Disney.
• the privacy protection advocacy against the use of personal information by marketers.
• the fight against governmental controls over encryption
• the advocacy for non-commercial community radio and low-power TV stations
• the peer-to-peer file sharing, which has moved beyond piracy to an ideology and undermined the music industry's business model.
• the "unlicensed spectrum" initiatives that seek to end the exclusivity of access to airwaves of broadcasters and wireless providers.
• the move to municipal and free wi-fi connectivity challenging the phone companies.
All of these developments have their particular reasons but also a common thread. They are manifestations of a wider conflict over the role of the private sector in the information society. As the internet permeates society, society in turn permeates the internet, with its internal and international conflicts.
The emergence of third wave activists should not be surprising. They reflect the belief that many aspects of social and political life have deteriorated, creating political apathy, violence, consumerism, gender and racial stereotyping, neglect of the world's poor and poor nutritional habits. A second element is that information media play a central role in either creating or exacerbating these problems, or in preventing their alleviation. Therefore, information sector reform equals social reform.
This syllogism is shared by the anti-authoritarian left with the political right and traditionalists who are deeply suspicious of information medias' role in modernism and hedonism, and with most governments wishing to control information media. China's Vice Premier minced no words when he declared in Tunis that "For the internet, we need effective measures to fight against…anything that harms state security." Together, this is a formidable grouping. Its NGO members are well-connected electronically and instantaneously into a world-wide activist network of a kind that never existed before. They exhibited at the summit effective collaborative skills. They can run electronic circles not only around governments that are in their way - from Tunisia to the US - but also around traditional media firms.
Information companies should not be surprised. For years they have touted their sector as the key to the planet's economic and cultural future and solution to most of its problems. No wonder that control over this sector is being contested by more than their business competitors. In the industrial age, the control over the "means of production" led to revolutionary movements and the overthrow of governments and social systems. In Britain, the "commanding heights" of the economy - the coal and steel sector - were nationalised in the 1940s, with dubious results. Today, a similar battle is emerging over control over the "means of information".
How should the second wave of the internet deal with this challenge?
First, by relentlessly pushing internet technology forward and recapturing the public imagination. Nobody challenged the narrowband internet when it created new marvels at a dizzying pace.
Second, by engaging rather than walking away from the debate, and by promoting positive values and principles. Gordon Moore, Vint Cerf, Robert Kahn, or Tim Berners-Lee have more credibility in the worldwide internet community in favour of cyber-liberties than the White House.
Third, by embracing civil society. Civil society, in concept, is a counterweight to authoritarian government and stodgy business giants. Its social entrepreneurialism, often American-styled, is much more palatable to second wavers than traditional inter-governmental agencies and standard-setting associations.
Most second wavers are familiar with the various flash points, but they have not connected the dots and recognised that they are facing an incipient social movement on the model of environmentalism, a comparison made by my co-columnist James Boyle. Conversely, many third wavers are caught in their own myopia. They ask both for more, and for less, of a governmental role in the internet. Thus, second and third wavers, even with their different perspectives, need to recognise the commonalities: a self-reliant perspective, tech-savvy, a healthy suspicion of big government, and a common adversarial relation to traditional big media.
Only an alliance of the internet's commercial and non-profit sectors can hold off a fourth wave which will benefit neither, that of regulatory controls over the commanding heights of the information economy.
The writer is professor of finance and economics at Columbia University and director of its Columbia Institute for Tele-Information
Get alerts on Columnists when a new story is published
Copyright The Financial Times Limited 2019. All rights reserved.
Reuse this content (opens in new window)
Comments have not been enabled for this article.
Follow the topics in this article
New Technology Policy Forum
Internet Corp for Assigned Names & Numbers


When Sally and I first started planning our wedding we just thought a DJ was a DJ. We had no clue about how to book a DJ or where to find a good one. But after talking to some friends they recommended we contact Lem with DJ Element Productions.
When we first sat down with Lem, he had all the plans and details laid out. We sat there and looked at all the information and details that go into planning a wedding and boy was that an eye opener! If we didn't have all that information we would have had a terrible and unorganized wedding. Lem basically had a game plan from the beginning to end. He had every detail from when to start the song, how long it should be played, and when to end it. We can honestly say that we used his game plan and playlist to keep us on track.
Lem did such an awesome job people were asking us where we found him. They were all asking for his information so when their big day will come they can use him. I always said that a wedding reception should be a party. And boy was it one! We had people dancing the whole night and actually had to kick people out! To this day people still talk about the wedding on how much fun they had drinking and dancing. Most of the people we saw the day after were so sore from being on the dance floor all night. Lem did such a good job with the music and encouraging people to dance that we had a hard time finding any space on the dance floor.
I can honestly say that if you are looking for a well organized DJ, Lem is the one to pick. He is organized, plays good music, and keeps the party going.


Venez visiter ma page Facebook et cliquez si vous aimez.
It's not my first time to visit this web site, i am browsing this web page dailly and take nice information from here daily.
I've been surfing online more than three hours today, yet I never found any interesting article like yours. It's pretty worth enough for me. In my opinion, if all website owners and bloggers made good content as you did, the internet will be a lot more useful than ever before.
Greetings I am so thrilled I found your weblog, I really found you by error, while I was searching on Askjeeve for something else, Anyhow I am here now and would just like to say many thanks for a incredible post and a all round entertaining blog (I also love the theme/design), I don't have time to go through it all at the moment but I have book-marked it and also added in your RSS feeds, so when I have time I will be back to read a lot more, Please do keep up the fantastic work.
What's up to every single one, it's actually a good for me to pay a quick visit this website, it contains useful Information.


Keep you class organized and on-the-go with the Champion Sports High Impact All-Terrain Heavy-Duty Equipment Cart! A handy storage tool for P.E. classes and recreational clubs, this cart holds up to 24 balls, and features storage hooks for jump ropes, resistance tubes, and plastic hoops. Each cart comes with 2 heavy-duty baskets, which are perfect for holding any smaller miscellaneous play equipment. The Heavy-Duty Cart includes fold-away molded handles, non marking swivel-casters, and 2 large all terrain wheels, so you can play on any surface!
This Indoor/Outdoor versatile cart easily transports up to 24 balls, plus ropes, hoops and other accessories. Contains two large heavy-duty plastic baskets measuring 19 1/4inL x 13 1/4inW x 10inH.
Convenient features include foldaway molded handles and heavy-duty swivel casters and non-marring wheels. 52inL x 24inW x 65inH.


The resulting situation often leads to considerable delays in the delivery of energy production systems, as well as to extra costs for the public administration and energy utilities, in form of communication, education and marketing, or even to reduced profit, both considering renewable and non-renewable energy sources.
In this context, Sustainpower represents an integrated solution for the holistic evaluation of the sustainability of power production systems, in a transparent way, and based on metrics and methodologies commonly agreed among the different involved stakeholders. Sustainpower in an on-line platform for decision support, which represents a thorough answer to that need, as it is a solution to accelerate the sustainable development and refurbishment of energy production, by drastically reducing the duration of the required sustainability evaluation, as well as by enforcing shared consensus, potentially accelerating the authorization process and considerably reducing the related costs at the same time.
- Easily understandable description of the impact of the different technologies, resulting in strong communication benefits.
Fuelmed is an Italian company specialised in consultancy and marketing services for power companies, who counts on more than 10 years of experience.
The constant improvement and customization of the offered services allows Fuelmed to be a notable actor in the market of communication and public relation services for the energy industry.


Just under a year ago, I graduated from a BA Film and Animation course. Since graduating, I've been lucky enough to meet some great people and work on some fantastic stuff. But, whilst in thought the other day, I realised how much I would do differently if I could go back in time and start my three years again. So, I thought I'd share some thoughts on that note.
Make use of non-term times to gain experience with companies. Email companies/studios who interest you, call around, take on a couple weeks experience here and there. It'll help you find what area you fit into best.
I interned with Raindance the summer before my final year and learned so much, that's when I realised I should've done more. The experiences I've had since leaving university have really given me a true insight into the industry, I've made really great contacts and there were quite a few roles I never knew of!
Experiment with different genre's, work with different people, go out and about with a camera (even if its just a phone) and create things. It'll help you with all kinds of techniques and make you a much more confident person.
I was always kind of too worried to do this, scared that I'd create something terrible, but later realised it doesn't matter if it's terrible. I guess it's a time that you're allowed to create things that aren't so great. I definitely wish I made more < 5 minute films.
Meeting people with the same interests, people who have had tonnes of experience in their fields, people you could potentially work with, and keeping in contact with them is so vital. Everyone is super kind at these sort of events. Have confidence and remember that if they didn't want to speak, they wouldn't be there.
I didn't do this at all until my third year, mainly due to the fear. But, now I've been to quite a few, I'm so much more confident in networking with people.
I'm still trying to get to grips with being good at this, but know it helps and wish I started a while back!
Again, don't be scared to just try things, even if the idea isn't too great, it's all a learning curve. I had such great facilities in the university I went to and really wish I took more advantage of these and taught myself as much as I could have. Don't be hesitant.
Great article, such valuable wisdom.
I like that U stress the importance of NETWORKING because it is essential!!!


text:
ASIA RISING: Stories of how Asia is changing the world.
What Doctors Think Will Happen In The Year Ahead
2021 is now upon us and it promises to be a historic year for the world. The first COVID-19 vaccines are rolling out in Europe and North America; China and Russia continue to promote their vaccines as safe, effective and affordable; all while many countries continue to see cases spike in second or third waves. Against this uncertain backdrop, it's important to look at what doctors think will happen in the year ahead. Especially those on the frontline.
The Real Time Barometer is an observational study of the impact of the COVID-19 outbreak as reported by physicians with firsthand experience treating COVID-19 patients. Each week, thousands of physicians provide insights on topics regarding the global health crisis. To date, Sermo has conducted over 60,800 interviews with doctors in 31 countries, including the United States, Canada, United Kingdom, France, Brazil, Russia, China, Japan and Australia.
Study 15 of Sermo's COVID-19 Real Time Barometer took the pulse of nearly 4,000 global doctors and it revealed that 74 percent of physicians believe it will take at least 7 months to achieve community immunity with the new vaccines. Sixty percent of the almost 4,000 physicians who participated said they believed it would take at least 10 months or longer, while 23 percent said it would take at least 18 months.
We need the hospital personnel to go first because they care for the sick and we cannot afford to lose them
The long runway to community immunity could be driven by barriers physicians believe will hinder adoption of the vaccine. 81 percent of physicians believed that concerns over vaccine safety or potential side effects could keep people from agreeing to take the vaccine. 46 percent indicated that people may not want the vaccine because they believe they won't get the illness or that symptoms will be mild, while 39 percent said they thought people may not take the vaccine because they don't like people or the government telling them what to do.
The survey includes responses from physicians in 25 countries.
In a follow-on poll among 212 physicians on Sermo's global social platform, doctors believe healthcare workers should be the first to get the vaccine once it becomes available followed by other frontline workers. This is in alignment with recommendations made the same day by the U.S. Centers for Disease Control and Prevention Advisory Committee on Immunization Practices (ACIP), which decided that health workers and residents of long-term care facilities should receive the vaccine first. ACIP's recommendation will need to be approved by the director of the CDC before it becomes official policy.
"We need the hospital personnel to go first because they care for the sick and we cannot afford to lose them," said Dr. Anne Kiltinen, an anesthesiologist practicing in New York. "And when I say hospital personnel, I mean the nursing staff and hospital personnel, not me. I am a senior attending and my contact with patients is limited, so I can wait. We also need public information campaigns. We've seen that some patients are concerned about safety and effectiveness."
The Real Time Barometer also found that the majority of physicians believe that during this critical time, it is imperative that the U.S. participate in the World Health Organization. Of all respondents, 68 percent said that it was very important and 16 percent said it was somewhat important for the U.S. to be part of the global organization.
Most physicians were also anticipating that their communities would endure another lockdown soon, with 37 percent saying it was very likely and 40 percent saying it was somewhat likely.
Published by Editorial Team
The Asia Rising Editorial Team is made up of a multinational team of writers, content experts and journalists from around the world operating out of our Bureaus in New York, Bangkok, Toronto and while on assignment across Asia.	View all posts by Editorial Team
Posted in CultureTagged COVID-19, Healthcare
← The World Economy At The End of the Year
Getting Your Asian Food Fix While At Home →
Why Asia?
It's Written in the Numbers
The Asian Way
Infrastructure Matters
Cleared for Takeoff
Brand Aid
The New Tigers
Entrepeneurs
Vikrom Kromadit
The Amata Foundation
Tweets by @AsiaRisingTV


text:
2. of other British statesmen & soldiers in India, all must acknowledge this, that it was he who laid the foundation of our Indian Empire.
His descent.
Wellesley was of Irish birth. His family was of ancient origin, but of little or no distinction. His grandfather, Richard Colley Wesley (for such was the form of the name with[crossed out] ^ [hle?] the Marquess himself altered it in his schooldays) received an Irish peerage in return for seventeen years of service to his party in Parliament, & became in 1746 1st Baron Mornington. His son, Garret Wesley, was in 1759 raised to the rank of Earl, also for his political services, though his fame rests chiefly on his skill as a musician. He married in the same year Anne, the daughter of Arthur Hill, who afterwards became Viscount Dungannow; & in the following year was born their eldest son Richard Colley. Everyone has heard of the achievements of his three younger brothers, William - afterwards Lord Maryborough, Arthur - the great Duke of Wellington, & Henry the diplomatist - 1st Baron Cowley. What is harder to discover is the origin of such sudden genius in a family otherwise[d crossed out] untouched by the hand of fame.*
Boyhood & early life.
A short account of his early life may not be amiss. After some primary Education at Trim, the chief town of Co: Meath, he was sent to Harrow. But he remained there only a few months, being one of those boys to be expelled for rebelling against the appointment of a new headmaster, in favour of another candidate. In 1771, therefore, he was sent to Eton, where perhaps were sown in him & his brother Arthur the seeds of their greatness. He remained there for seven years, during which time he secured for himself the reputation of a good scholar, & gained
* Note to page 2 Hutton in his "Marquess Wellesley K.G" writes of Wellesley's family: - "An ancient family of Irish gentlemen giving birth in one of its branches to the great religious leader of the Eighteenth century, the house of Wesley. He has, however, confused the family of the four brothers - that of Colley or Wesley with the totally different house of Westley, a Devonshire family from which the great John Wesley sprang. Indeed, the noble name of Wellesley was only adopted by the grandfather of the brothers on his succeeding to property, & the family is in reality that of Colley. Curiously enough, however, both families had ancestresses of the Wellesley family. Hence Hutton's mistake.


Virtual Private Network (VPN) connections are fairly common at work these days. If you travel for business, or work from home, there's a very good chance that your connection back to the office is protected by a VPN.
The VPN acts like a secure tunnel between your computer and the remote system. Data passing along that tunnel is encrypted to prevent hackers stealing sensitive information as it passes over the Internet.
Protecting business data using a VPN makes sense, but they can be used for your personal connections too. And there's some very good reasons for doing so.
VPN connections are similar to the SSL protection offered by ecommerce websites to encrypt information like credit card numbers and passwords – but what about sites that don't use SSL? Any information sent between your computer and a website without encryption could be intercepted by hackers.
Using a VPN service all of your Internet traffic is encrypted , which makes it much harder for thieves to steal. A VPN service is a great way to protect against identity theft, fraud and other online scams.
For many people, online advertising is out of control. Media-rich adverts make surfing the web slow and painful – particularly on mobile devices. There are also serious concerns about ad tracking, the information being gathered by advertisers, and how that data is being used (or who it is being sold to).
A VPN connection helps to anonymise your activities, making it much harder for advertisers to track you online.
Streaming websites like Netflix, BT Sport and Sky use geolocation technology to detect where you are accessing their service from. If you go on holiday abroad, these apps will stop working because you've left your home country.
Video streaming services have to implement these blocks to comply with their contractual agreements – but it's very annoying for anyone unable to use their paid-for subscription. Fortunately VPNs provide a solution.
When using VPN, the geolocation services cannot detect where you actually are. So if you pick a VPN service based in the same country as your subscription, you will be able to watch video from anywhere in the world.
Because modern cybercrime is so sophisticated, you may need several tools to protect yourself. Your router and antivirus software offer protection for data stored on your home computers – but what about information as it leaves the network?
Using a VPN service, you can encrypt all of your web traffic so hackers cannot access it. A VPN service offers the same protections for your phone and tablet when you are outside the house too.
And remember, VPNs are not just for security either. The ability to hide your location is incredibly useful when using location-specific streaming services. And you will also find it much easier to access websites in your language as you travel too.
So, is it time that you started using a VPN at home?
We are glad you find our info useful, thanks for reading us!
Can you recommend any particular VPN?
Thanks for your suggestions, some of the points of your really make sense.
Thanks for your feedback, Jessica!
Thanks for your valuable suggestion and I already use VPN service. Do you tell me some special VPN service?
Thanks for your comment! Keep an eye on our website for further updates.
Thanks a lot for reading us!
We are glad to know you find our content useful!
I rarely travel and when I do it's never out of the country. So why would I want to use this service at home?
You could use it for online banking (it will keep your data hidden), online shopping, private browsing, keeping your online activity hidden from governments and organizations, etc.


text:
Q: BST using modules - OCaml I am trying to create module/interface (i dont exactly know how its called, i am new to the language) for basic operations on BST in OCaml. My goal is to have an implementation that lets me doing something like this:
T.create();;
T.push(2);;
T.push(3);;
T.push(5);;

in order to get a bst tree consisting of 2,3,5.
But at the moment to achieve this i have to write something like this:
 let teeBst = T.push(2)(T.push(3)(T.push(5)(T.create())));;

So when I am checking/using my code I have to do it like this:
    let tee2 = T.push(2)(T.push(3)(T.push(5)(T.create())));;
    T.postorder(tee2);;

The output is fine:
 # val tee2 : T.bt = <abstr>
 # - : int list = [2; 3; 5]

But, as I said before, I would like to achieve this doing as below:
T.push(2);;
T.push(3);;
T.push(5);;
T.postorder();;

(I realise this requires some changes to my postorder function but the one I am currently using is a temporary one so I can check the tree I have atm )
Below is my implementation. If you see the solution, please let me know ;)
   module type Tree =
    sig
        type bt
        val create: unit -> bt
        val push: int -> bt -> bt
        val find: int -> bt -> bool
        val preorder: bt -> int list
        val postorder: bt -> int list
        val inorder: bt -> int list
    end;;

module T : Tree =
    struct
        type bt = E | B of bt * int * bt
        let create () = E
        let rec push x = function
            | E -> B(E, x, E)
            | B (l, y, r) when x<y -> B(push x l, y, r)
            | B (l, y, r) when x>y -> B(l, y, push x r)
            | xs -> xs;;

        let rec find x = function
            | E -> false
            | B(l, y,_) when x< y -> find x l
            | B(_,y,r) when x>y -> find x r
            | _ -> true;;

        let rec preorder = function
            | B(l,v,r) -> v::(preorder r) @ (preorder l)
            | E -> [];;

        let rec inorder = function
            | B(l,v,r) ->(inorder r) @ v::(inorder l)
            | E -> []

        let rec postorder = function
            | B(l,v,r) -> (postorder r) @ (postorder l) @ [v]
            | E -> []
    end;;

A: It seems like you want modules to be classes, but I'd advise you to consider more idiomatic solutions. Have you considered using the pipe operator?
T.create()
|> T.push(2)
|> T.push(3)
|> T.push(5)
|> T.postorder;;

Or with local open (which makes more sense if you have a module with a longer name than just T of course) you can even do
T.(
  create()
  |> push(2)
  |> push(3)
  |> push(5)
  |> postorder
);

What you're asking for would require introducing global mutable state, which isn't just "some changes" but an entirely different paradigm. And one that is generally frowned upon because it makes your code unpredictable and hard to debug since it relies on state that might change at any moment from anywhere.
Another possibility is to actually use classes, since OCaml has those too. Then you'd still have mutable state, but it would at least be contained.

redpajama_set_name: RedPajamaStackExchange


Mali had their pound of flesh yesterday at the Seyni Kountche Stadium, Niamey when they defeated Nigeria to qualify for the final of the on-going African U-20 Nations Cup. Nigeria in December defeated Mali through a penalty shoot out to get to the final of the WAFU U-20 Championship. As was the case yesterday, in that encounter last year, Mali led by a lone goal until the 82nd minute, before defender Valentine Ozornwafor brought Nigeria level, and the Flying Eagles went ahead to win on penalty shoot -out.
Yesterday, Mamadou Traore put Mali ahead in the 78th minute, while substitute Pascal Onyekachi restored parity for the Flying Eagles.
There were no clear–cut opportunities in the extra time of 30 minutes and so the game went into the penalty lottery.
But this time, the penalty luck swung to Mali's favour, as Aniekeme Okon blasted his effort against the crossbar and El Bilal Toure converted his to send the Malians into the final.
Although Nigeria had the better of possession, the Flying Eagles always seemed lost in Mali's half of the pitch, a malaise that had dogged their game from the beginning of the competition.
By winning Group A of the competition, Nigeria had already qualified for the U-20 World Cup, but they wanted to end the competition as African champions. However, their marksmanship could not match their ambition as they frittered away the few chances that came their way.
In the penalty shoot out that decided the game, Lassana N'Diaye, Hadji Drame, Abdoulaye Diaby and El Bilal Toure made good from the spot for Mali, while Valentine Ozornwafor and Aniekeme Okon lost their kicks.
Nigeria will now play for the bronze medal against either Senegal or South Africa on Saturday, while Mali will play in Sunday's final.


Natalie and Ben's kitchen was in need of an update and they also wanted to reconfigure the layout.
Day 5: The tiles are going down. Tiles are the Verde range from Interstone. Nice neutral colour choice.
Day 6: the tiles for Nathalie and Ben's kitchen are laid and grouted. Cupboards go up on Monday.
Day 12: Nathalie and Ben's kitchen is nearly done. The cupboards are in, counters are installed and backsplash tiles are done. The electricians will come by tomorrow to connect the under-cabinet lights and ceiling pot lights.


text:
Liberal DC mayor's former spokesman blasts Biden over border disaster: 'We do not have an immigration coverage'
Victor Jimenez, the previous spokesperson for liberal Washington, D.C. Mayor Muriel Bowser, introduced his departure from the Democratic Party, saying he wanted to be true to his values.
Jimenez defined on "Fox & Friends First" that two of the principle causes he joined the Republican Social gathering are immigration and unemployment.
Critics of the Biden administration have highlighted the crisis at the southern border after development of the border wall was halted in January.
'DEMOCRATS ARE IN DISARRAY': DC LOCALS SHARE HOW THEY FEEL ABOUT PARTY'S DIRECTION
"I don't suppose now we have an immigration coverage if we don't respect the border," Jimenez stated.
WASHINGTON, DC – JANUARY 21: Muriel Bowser attends the Girls's March on Washington on January 21, 2017 in Washington, DC. (Photograph by Theo Wargo/Getty Pictures)
"If anybody who desires to return to this nation — who desires to cross the border — can cross the border illegally, then definitely our immigration coverage is only a bunch of phrases on a chunk of paper that no one respects."
He additionally pointed to the unemployment price, which he stated was at a 50-year low previous to the pandemic. He stated companies in his residence state of Virginia are nonetheless struggling to hire people regardless of practically two years of coping with COVID-19.
'THE FIVE' ON BATTLE OVER 'WOKENESS' DEMOCRATIC PARTY
"I simply received uninterested in the identical rhetoric, and I'm like, 'You recognize what? I'm carried out with this. I can't take it. I should be true to my values."
Jimenez isn't alone in his determination to go away the ever-more-progressive Democratic Social gathering.
Texas State Rep. Ryan Guillen introduced he was leaving the get together in early November, citing "chaos" on the southern border that he stated is disastrous for his constituents.
Jimenez anticipates extra Democrats will swap events or vote Republican within the upcoming elections.
"We noticed a 55% turnout of Hispanic voters in Virginia voting for Glenn Youngkin. And I really feel like we're going to see that in 2022, and we're going to see that in 2024 completely," he stated.
ANDREW YANG EXPLAINS WHY HE'S LEAVING THE DEMOCRATIC PARTY
Migrants are seen on the Rio Grande close to the Del Rio-Acuna Port of Entry in Del Rio, Texas, on September 18, 2021.
(nternational Bridge, whPhoto by Charlie C. Peebles/Anadolu Company by way of Getty Pictures)
Jimenez, who moved to america from the Dominican Republic, additionally weighed in on the Democrats' narrative about their Republican opponents being motivated by racism or white supremacy.
"I ran with the narrative. I assumed Republicans had been the racists, the white folks, the satan as a result of that was the narrative that was being fed to me."
He referred to as out the media for disinformation and stated he noticed the racist narrative each day whereas working for Mayor Bowser.
"We have to struggle towards all that," he stated. "I don't suppose this nation is racist."
"Truthfully, the entire white those who I've encountered have bent over backwards to provide me the chance to succeed, to provide me the alternatives I wanted to be nice on this nation. And so I really feel like I'm the true definition of the American dream."
Previous articlePyrzowice. She slipped out of the covid hospital. She came back with the rescuers on foot, because there was no ambulance
Next articleKerb use behind Qatar GP F1 tyre failures


I'm a die-hard fantasy reader and writer, but I also love space opera, especially in the mold of the Firefly and Farscape TV shows. When I learned that Lindsay Buroker's new novel series in 2016 was space opera adventure, I was there in a heart-beat. I very much enjoyed her rousing story line and her colorful characters.
Then she mentioned Amazon had approached her about creating a "Kindle World" for her Fallen Empire-verse and that she was looking for writers to contribute novels for that setting.
I jumped at the chance to write a novel featuring her hero Alisa Marchenko and the crew of the Star Nomad. I was inspired to create a stand-alone adventure that took place immediately after the end of her series. The story after the story, if you will.
My Fallen Empire novel Spice Crimes was originally published in April 2017, along with works by nine other authors. It garnered some nice reviews, but was limited to only being available in the Amazon US store.
I learned late this spring that Amazon would be closing down their Kindle Worlds program. All the many novels published in different author's settings would be taken down. As the author of Spice Crimes, I had the rights to my story and my characters, but of course Lindsay owned the rights to her characters and the setting.
She wanted to see my book and the other stories and novels set in the Fallen Empire universe republished and encouraged me to do so, allowing us to keep our novels as written, which in my case meant that I could keep the story after the story about her hero Alisa, her friends, crew, and family.
Now, I'd done my best with the novel the first time, but had written it on a very tight deadline. It needed a fresh edit, as a few of the reviews indicated. So, I spent some time this month editing the book again, and feel it's a better book for that.
So, Spice Crimes is now available again. Unlike before, when it was only in the Amazon US store, it's now on all Amazon stores, as well as Apple, Kobo, Google Play, and Nook.


Web Design & SEO | McComb, Inc.
Engage your customers with a compelling web site.
We can help you with your web design and SEO strategies. We employ a variety of talented web designers, SEO gurus and SEM experts. No matter what your needs, we have a plan to fit any budget.


text:
Antonio Gates, Former Chargers Tight End
Roth: CFB playoff format is "a slap in the face to sport"
Yogi Roth has never been a fan of the playoff and believes expansion is not only inevitable, but also necessary
No. 1 Alabama (13-0) capped an undefeated season Monday, beating No. 3 Ohio State (7-1), 52-24, for the national championship.
While it was a wonderful win for the Crimson Tide, Kirk Herbstreit believes that college football's playoff format needs tweaking. In fact, he said in December that the college football postseason is "as bad as there is" due to its predictability.
"I've never been a fan of the playoff," Pac 12 Network analyst Yogi Roth said on The DA Show. "The reason is it makes the focus on four teams and two games at the end of the year and then of course the title game, and it nixes teams based on the narratives. I live that every year. When Washington played Auburn or Oregon played Auburn, if they lost, the whole conference was out. That's not right for the game. That's not what college football is all about."
There is, however, an "easy fix," Roth says: expansion.
"Everyone knows it's going to happen," he said. "They just have to wait until the contract runs out. To me, that is an immature move. . . . There was an opportunity to expand [this year]. This could have been a mulligan year to even test it out and give a team like Cincinnati or give a Pac-12 champ or give somebody from the Big 12 [a chance] and get every Power Five in and expand it."
Over the years, several teams have lost their final game of the season and still made the playoff. Alabama did that in 2017. Notre Dame did it in 2020.
"In all of sports, in my entire life, if you lose your last game, you don't advance," Roth said. "This is the one sport where that is not true in a single-elimination environment. This is not true, and I think that is a slap in the face to sport. Our entire life, we're taught, 'Win and keep going. Lose and go home.' In this sport, that's not always the case because of a lot of the narratives or the realities of these teams, but what happened to the reality of playing? I think that is what kind of gets lost, and I'm with Herbstreit on that."
Yogi Roth Interview
Yogi Roth


text:
Khudian Khas ou Khudian (en ourdou : کھڈیاں) est une ville pakistanaise située dans le district de Kasur, dans la province du Pendjab. C'est la huitième plus grande ville du district.

Khudian est située à proximité de la frontière avec l'Inde et à moins de 80 kilomètres de Lahore, deuxième ville du pays. On trouve une gare dans la ville, étant située sur la ligne de chemin de fer entre Lodhran et Raiwind.

La population de la ville a été multipliée par plus de quatre entre 1972 et 2017 selon les recensements officiels, passant de  habitants à . Entre 1998 et 2017, la croissance annuelle moyenne s'affiche à 2,8 %, supérieure à la moyenne nationale de 2,4 %.

Références

Ville dans la province du Pendjab (Pakistan)


text:
By Ed Driscoll May 29, 2011 5:00 PM ET
Burning down the house:
Ortega y Gasset, the great Spanish philosopher of the 1930s, described what he called the "modern barbarian." "The modern barbarian," he wrote in The Revolt of the Masses, "is a person who looks at the highly complex modern society and takes it to be a natural object." People think that apples and oranges appear in the neighborhood grocery the same way they grow on trees. They do not perceive the highly complex social network that makes these things possible. Nor do they appreciate its fragility. "Whenever there is a shortage of bread," wrote Ortega y Gasset, "the first thing people do is burn down the bakeries."
— William Tucker, "Running America on Hot Air," in the American Spectator, May 30th, 2001. Note that despite a tumultuous decade, in so many ways, little seems to have changed in the preceding interim.
Blogging since 2002, affiliated with PJM since 2005, where he is currently a columnist, Dallas Editor, and founder of PJM's Lifestyle blog. Over the past 15 years, Ed has contributed articles to National Review Online, the Weekly Standard.com, Right Wing News, the New Individualist, Blogcritics, Modernism, Videomaker, Servo, Audio/Video Interiors, Electronic House, PC World, Computer Music, Vintage Guitar, and Guitar World. As an Amazon Associate, he earns from qualifying purchases. For media inquiries, please contact [email protected].
Read more by Ed Driscoll
Oh Liberals, Spare Me Your Fake Outrage About Mitch McConnell's Non-Racist Remark


CNBP Director, Professor Mark Hutchinson, has presented a talk at the American Chamber of Commerce (AmCham) Event on Nanotechnology held at the Intercontinental Hotel in Adelaide on the 3rd November 2016.
Attendees at the event, primarily a business audience, heard from three speakers about the latest in nano technology trends, the potential for business model disruption and business opportunities of the future.
Topics covered included nanomaterials being tested for use in food packaging to greatly improve shelf life and safety, and nanosensors being developed to detect food-borne pathogens for food packaging.
Professor Mark Hutchinson, CNBP Director has spoken at the inaugural South Australian Cattle Producers Forum on Friday, 16 September 2016, at The Carlton Club in Hahndorf.
The forum was coordinated by Livestock SA, with support from the Cattle Council of Australia (CCA) and sponsorship from Meat & Livestock Australia (MLA).
Prof Hutchinson's talk was titled 'Measurement Technology and Potential Applications for Agriculture in the Next Five Years'. Discussed was CNBP science and the measurement of all things biological at the nanoscale. Of specific focus was the potential of CNBP tools and technology for applications involving livestock. This including developing methods to measure novel traits on animals and on carcasses, including for key eating quality traits such as intramuscular fat.


The Linborg Residence located in Livonia, New York, has earned the ColorBrightonGreen.org Green House Award for October 2010 due to the homeowners' strong commitment to strategies of alternative energy generation.
Small-wind generating system: installed a WindTamer, 3.5 kW wind turbine. The first week of wind generation generated 30 kW of electricity. The owner researched wind generation and determined that WindTamer Corporation, a local company, has a small-scale turbine with the ability to generate enough power to run a normal home and approximately half the cost of conventional wind turbines to buy and install.
The owner is researching solar photovoltaic installation to supplement other systems.
The company has put nearly 50 different turbines in various locations across the Rochester area and sees small wind turbines, those that produce 100 kilowatts of power or less, as a viable space for commercial, residential and agricultural growth.


Amplify your outdoor pool and pool area with our unique decorative pool surround designs and installations. Make hanging out by the pool more inviting to your family and friends with our one of a kind custom creations. We will work with you on the design and choose the best layout for your pool area.
We specialize in all types of pool surrounds. Examples would include concrete, natural stone, brick Pavers, and Tile. We also install Pool copings as well as interior pool tile.
Glass block windows add to the security of your home. They also create a very nice look and tend to correspond well.
Some examples of masonry fountains would be: a wall bordering a pond or swimming pool with a slot left open or a limestone carving with a spout. A pump would then send water from the source through the outlet on the wall, so it can be returned to the source. Another example would be a masonry structure containing an elevated body of water. A fountain of one's personal liking can be placed in the center of the body of water. Fountains create a wonderfully calming environment – a perfect addition to a professionally landscaped yard!
This is essentially a retaining wall that is built to encase the dirt necessary to grow an elevated flower or vegetable garden. These can be built with a height as small as 3" and can be as tall as your local building code will allow.
A masonry mailbox not only has an extremely high lifespan, but it is also sort of a masonry bonsai tree. You can add so much design detail to your mailbox it could literally become a scale model of your home!


text:
NYIT Students in Costa Rica
Students do work in Costa Rica as part of a design-build initiative.
By: Tobias Holler
NYIT student volunteer working on construction site of Nosara Recycling Center, August 2012
Earlier this year I wrote a blog post about sLAB Costa Rica, the design-build initiative at the School of Architecture and Design at the New York Institute of Technology (NYIT), with my studio, Holler Architecture, taking the lead. Back then my students had just finished the design of a much needed Recycling and Education Center for Nosara, a small community in northwestern Costa Rica. This past summer the project made a huge step toward reality. Funded in part through a fundraising campaign on Kickstarter over 30 NYIT architecture students traveled to Costa Rica during July and August and volunteered on the construction site of this important community project. In order not to loose momentum the students have set up a second Kickstarter campaign to help finish the project this coming January.
This past summer under the supervision of local construction professionals we were able to set up the construction site, complete the site grading, concrete foundations, and concrete block walls; and even built the first wooden roof truss.
Assembly of first roof truss, made out of pochote trees sustainably harvested on site, August 2012
The project is far from completed. Much work remains to be done before the building is ready to help with the local waste management problem. Today local workers continue to build the project, but without help from the student volunteers, the pace of construction has slowed considerably. In order not to loose the momentum of this important community project the students hope to return to Nosara for three weeks in January to continue to help. To aid in their expenses for housing and making a documentary by Ayana de Vos they launched another Kickstarter campaign to raise $9,000 by December 13.
Lacking appropriate infrastructure and policies, over sixty percent of Costa Rica's waste is put into open, unregulated dumps
Costa Rica has a severe municipal solid waste management problem that stands in stark contrast with its eco-image. Lacking appropriate infrastructure and policies, over 60 percent of waste is put into open, unregulated dumps and 250 tons daily are dumped illegally into rivers and tropical forests, polluting ground water, threatening the health of local communities, and destroying a fragile ecosystem whose well-being is of critical importance not only locally but to the planet.
Current hazardous and unsanitary working conditions at Nosara dump
The Nosara Recycling Center will collect, compact, and sell recyclables for the future transformation into new uses, greatly reducing the amount of waste currently arriving at the dump, and eliminating the unsanitary, hazardous, and inefficient recycling practices currently in place. The center will also provide communal education on proper waste management. The project has the potential to become a model of sustainable waste management practices for communities in all of Costa Rica, and other tropical countries. In the weeks leading up to our first trip to Nosara, I have to admit I was worried at times about the progress we would be able to make during our stay. As a practicing architect I knew that there are a million things that can prevent any building project from being built on schedule, let alone one in a foreign country, in a rural area that's lacking many basic infrastructural services. Would our client, the non-profit Nosara Waste and Recycling Association, really come through with providing the funds, building materials, and permits required to begin construction…? According to my friends in Costa Rica, building in this country requires time and patience, above all. What if my students arrived in Nosara, eager and ready to work, and there would be nothing to do for us? Well, we remained optimistic, continued to push the project forward, and it worked out wonderfully. As soon as the first group of students arrived, we were able to set up the construction site, complete the site grading, concrete foundations, and concrete block walls, and even built the first wooded roof truss, made from pochote wood harvested from our building site several weeks earlier. The students gained invaluable construction site experience, working under the supervision of local construction professionals.
NYIT student volunteers with local workers Daniel, Gustavo, Marvin and Pablo, August 2012
This would not have been possible without the amazing support we had in Nosara. Our clients devoted much of their time to get the construction process underway. A local architect, Lucca donated his time and expertise for design consultation, permit drawings, and now the site supervision. Many construction professionals donated time and equipment to the project. Those and many others helped make this past summer's success possible. While the students worked on site German filmmaker Ayana de Vos documented every one of their moves for her film project about waste management and sustainability in Costa Rica, shooting over 60 hours of footage, with multiple cameras, and conducting countless interviews with the participants. Since we now have this incredible local support system in place, we are confident that our next trip in January 2013 will be also be a success. Please help us help Nosara! Pura Vida! The building design
The final design is decidedly modern, but inspired by local passive tropical design strategies. An elongated building form, consisting of three zones (a sorting facility, an open lobby, and support spaces) under a common roof is placed horizontally along the existing slope of the site, minimizing excavation, and impact to the site. An open entry lobby with a wall made out of up-cycled aluminum cans, and a landscaped seating area with views into the recycling area will enable the community to engage with and become knowledgeable in the process of recycling.
The building's narrow plan is oriented to maximize passive cooling through cross ventilation. The roof geometry is optimized to capture prevailing breezes but protect building from the Papagayos, seasonal gale-force winds. The high ceilings and reflective roofing materials will further reduce heat buildup. The building's structure is made from local pochote sustainably grown on the project site, and nearby. During the wet season, rainwater will be collected on the large roof, and stored in cisterns, for 100 percent of the facility's water needs.
Follow the project on facebook and twitter.
Tobias Holler, AIA, LEED AP, is an assistant professor of architecture at the New York Institute of Technology where he teaches environmental design and technology. A registered architect in Germany and New York, he is also the principal of HOLLER architecture, an independent design practice in Brooklyn, New York. In his research and design practice he is interested in the relationship between architecture, urbanism, landscape, and technology with an emphasis on using environmental performance as a generator for architectural form. HOLLER architecture is one of seven firms chosen for NPNY 2012 (New Practices New York) through the AIA New York, an award that recognizes and promotes innovative and emerging architecture firms within the city.
First Concrete pour, July 2012


Moments ago, Google unveiled a security service that has been working behind the scenes on Android for a few months now, codenamed Bouncer. The service allows the Android Market to scan apps that have been uploaded, analyze them for trojans or other malware, and then determine if they have tendencies that would lead them to misbehave. Again, this has been going on for months to protect you, Google is just now letting you know about how successful it has been.
Also in this announcement for Bouncer, Google managed to take a shot at the anti-spyware and security companies that you hear from constantly in the Android world. During their testing of this new security service, Android Market stats showed a 40% drop in potentially malicious apps being downloaded during 2011. That comes on the heels of numerous reports from anti-spyware companies that malware is constantly on the rise, something many of us have questioned all along.
The service has been looking for malicious apps in Market for a while now, and between the first and second halves of 2011, we saw a 40% decrease in the number of potentially-malicious downloads from Android Market. This drop occurred at the same time that companies who market and sell anti-malware and security software have been reporting that malicious applications are on the rise. While it's not possible to prevent bad people from building malware, the most important measurement is whether those bad applications are being installed from Android Market – and we know the rate is declining significantly.
Cheers for the pic MrChips!


text:
Jacek Czerniak (born 30 August 1964) is a Polish politician and political scientist. Member of the Sejm representing Democratic Left Alliance (SLD) and the New Left (after SLD merged with Spring into a new party in 2021).

Electoral history

References

1964 births
Living people
People from Świdnik
Democratic Left Alliance politicians
Members of the Polish Sejm 2011–2015
Members of the Polish Sejm 2019–2023


text:
Update: more than 60 Nigerian girls and women escape kidnappers
More than 60 Nigerian girls and women who were kidnapped by Islamic extremists two weeks ago have managed to escape.
From Associated Press:
Nigerian security forces and federal government officials had denied reports of the mass abduction from three villages in the northeast state of Borno on June 22.
Chibok local government chairman Pogu Bitrus said Monday he had verified that about 60 women and girls escaped on Thursday and Friday by sending a representative who met with some of the escapees and their families at the hospital in Lassa, a town in the neighboring Damboa local government area.
Vigilante leader Abbas Gava in Maiduguri, capital of Borno state, said Sunday that vigilantes in the area told him 63 women and girls escaped Friday while their captors were engaged in a major attack on a military barracks and police headquarters in Damboa town.
Read more at Associated Press
For months, Boko Haram extremists had been conducting small-scale kidnappings. The kidnapping of more than 200 women in April drew international condemnation of Nigeria's government handling, or lack of, of the kidnappings.
At least 219 of those girls are still missing. The Nigerian government has closed the case.
Check back for updates.
Boko Haram, escape, extremists, Girls, missing, Nigerian, terrorists, Women


Doc Swan's show begins with a fast and furious juggling act full of comedy and set to music. He then shows off his award-winning fire-eating skills, along with chapaugraphy, an old, old act made new by Doc, where he tells his life story while making 13 different hats out of one piece of felt. Escaping from handcuffs is not as easy as Doc may have thought, and the audience is delighted by his unexpected methods. During audience participation, a volunteer becomes the star of (and usually steals) the show. Demonstrating his powers of ESP, Doc has the audience laughing and scratching their heads. A contemporary version of a Houdini favorite, escaping from a strait jacket is performed as Doc dances his way out in record time. The barefoot walk on broken bottles is presented in Doc's own unique way … with one audience member riding piggy-back (and the rest howling with laughter)! MUSICAL SAW PLAYING … ORIGAMI … HAND SHADOWS … LARIAT SPINNING … there is no telling what might pop up in Doc's show! Punctuated with puns, sight-gags and tons of tongue-in-cheek humor, no two shows are exactly alike.


text:
Q: Change font only for numeral in text mode I want to change the font used in 0123456789 to the same as defined in $0123456789$. I know that I can do it to math mode with this command:
\DeclareMathSymbol{8}{\mathalpha}{mymathnumerals}{`8}

Is there a way to do with text mode?