text:
using InfoCaster.Umbraco.UrlTracker.Extensions;
using InfoCaster.Umbraco.UrlTracker.Helpers;
using InfoCaster.Umbraco.UrlTracker.Models;
using InfoCaster.Umbraco.UrlTracker.Repositories;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Net;
using System.Text.RegularExpressions;
using System.Web;
using umbraco.BusinessLogic;
using umbraco.cms.businesslogic.web;
using Umbraco.Core;
using Umbraco.Core.Persistence;
using umbraco.DataLayer;
using umbraco.interfaces;
using umbraco.NodeFactory;
using Umbraco.Web;
using UmbracoHelper = InfoCaster.Umbraco.UrlTracker.Helpers.UmbracoHelper;
using InfoCaster.Umbraco.UrlTracker.UI.Installer;
using InfoCaster.Umbraco.UrlTracker.Exceptions;

namespace InfoCaster.Umbraco.UrlTracker.Modules
{
    public class UrlTrackerModule : IHttpModule
    {
        static ISqlHelper _sqlHelper { get { return Application.SqlHelper; } }
        static Regex _capturingGroupsRegex = new Regex("\\$\\d+");
        static readonly object _lock = new object();
        static bool _urlTrackerInstalled;
        static bool _execute = true;

        #region IHttpModule Members
        public void Dispose() { }

        public void Init(HttpApplication context)
        {
            context.AcquireRequestState += context_AcquireRequestState;
            context.PostRequestHandlerExecute += context_PostRequestHandlerExecute;

            LoggingHelper.LogInformation("UrlTracker HttpModule | Subscribed to AcquireRequestState and EndRequest events");
        }
        #endregion

        void context_AcquireRequestState(object sender, EventArgs e)
        {
            try
            {
                if (!_urlTrackerInstalled && Application.SqlHelper != null)
                {
                    lock (_lock)
                    {
                        _urlTrackerInstalled = UrlTrackerRepository.GetUrlTrackerTableExists();
                        if (!_urlTrackerInstalled)
                        {
                            UrlTrackerRepository.CreateUrlTrackerTable();
                            UrlTrackerInstallerService installer = new UrlTrackerInstallerService() { DontWait = true };
                            try
                            {
                                installer.InstallDashboard();
                            }
                            catch (DashboardAlreadyInstalledException) { }
                        }
                        UrlTrackerRepository.UpdateUrlTrackerTable();
                    }
                }
            }
            catch (ArgumentNullException) // Thrown if the umbraco connectionstring is empty
            {
                _execute = false;
            }

            if (_execute)
                UrlTrackerDo("AcquireRequestState", ignoreHttpStatusCode: true);
        }

        void context_PostRequestHandlerExecute(object sender, EventArgs e)
        {
            if (_execute)
                UrlTrackerDo("EndRequest");
        }

        static void UrlTrackerDo(string callingEventName, bool ignoreHttpStatusCode = false)
        {
            HttpContext context = HttpContext.Current;
            HttpRequest request = context.Request;
            HttpResponse response = context.Response;

            if (!string.IsNullOrEmpty(request.QueryString[UrlTrackerSettings.HttpModuleCheck]))
            {
                response.Clear();
                response.Write(UrlTrackerSettings.HttpModuleCheck);
                response.StatusCode = 200;
                response.End();
                return;
            }

            LoggingHelper.LogInformation("UrlTracker HttpModule | {0} start", callingEventName);

            if (UrlTrackerSettings.IsDisabled)
            {
                LoggingHelper.LogInformation("UrlTracker HttpModule | UrlTracker is disabled by config");
                return;
            }

            string url = request.RawUrl;
            if (url.StartsWith("/") && url != "/")
                url = url.Substring(1);

            LoggingHelper.LogInformation("UrlTracker HttpModule | Incoming URL is: {0}", url);

            if (_urlTrackerInstalled && (response.StatusCode == (int)HttpStatusCode.NotFound || ignoreHttpStatusCode))
            {
                if (response.StatusCode == (int)HttpStatusCode.NotFound)
                    LoggingHelper.LogInformation("UrlTracker HttpModule | Response statusCode is 404, continue URL matching");
                else
                    LoggingHelper.LogInformation("UrlTracker HttpModule | Checking for forced redirects (AcquireRequestState), continue URL matching");

                string urlWithoutQueryString = url;
                if (InfoCaster.Umbraco.UrlTracker.Helpers.UmbracoHelper.IsReservedPathOrUrl(url))
                {
                    LoggingHelper.LogInformation("UrlTracker HttpModule | URL is an umbraco reserved path or url, ignore request");
                    return;
                }

                //bool urlHasQueryString = request.QueryString.HasKeys() && url.Contains('?');
                bool urlHasQueryString = url.Contains('?'); // invalid querystring (?xxx) without = sign must also be stripped...

                if (urlHasQueryString)
                    urlWithoutQueryString = url.Substring(0, url.IndexOf('?'));

                string shortestUrl = UrlTrackerHelper.ResolveShortestUrl(urlWithoutQueryString);

                int rootNodeId = -1;
                List<UrlTrackerDomain> domains = UmbracoHelper.GetDomains();
                if (domains.Any())
                {
                    string fullRawUrl;
                    string previousFullRawUrlTest;
                    string fullRawUrlTest;
                    fullRawUrl = previousFullRawUrlTest = fullRawUrlTest = string.Format("{0}{1}{2}{3}", request.Url.Scheme, Uri.SchemeDelimiter, request.Url.Host, request.RawUrl);

                    UrlTrackerDomain urlTrackerDomain;
                    do
                    {
                        if (previousFullRawUrlTest.EndsWith("/"))
                        {
                            urlTrackerDomain = domains.FirstOrDefault(x => (x.UrlWithDomain == fullRawUrlTest) || (x.UrlWithDomain == fullRawUrlTest + "/"));
                            if (urlTrackerDomain != null)
                            {
                                rootNodeId = urlTrackerDomain.NodeId;
                                urlWithoutQueryString = fullRawUrl.Replace(fullRawUrlTest, string.Empty);
                                if (urlWithoutQueryString.StartsWith("/"))
                                    urlWithoutQueryString = urlWithoutQueryString.Substring(1);
                                if (urlWithoutQueryString.EndsWith("/"))
                                    urlWithoutQueryString = urlWithoutQueryString.Substring(0, urlWithoutQueryString.Length - 1);

                                break;
                            }
                        }
                        previousFullRawUrlTest = fullRawUrlTest;
                        fullRawUrlTest = fullRawUrlTest.Substring(0, fullRawUrlTest.Length - 1);
                    }
                    while (fullRawUrlTest.Length > 0);
                }
                if (rootNodeId == -1)
                {
                    List<INode> children = new Node(rootNodeId).ChildrenAsList;
                    if (children != null && children.Any())
                        rootNodeId = children.First().Id;
                }
                else
                {
                    var rootUrl = "/";
                    try
                    {
                        rootUrl = new Node(rootNodeId).Url;
                    }
                    catch (ArgumentNullException)
                    {
                        // could not get full url for path, so we keep / as the root... (no other way to check, happens for favicon.ico for example)
                    }
                    var rootFolder = rootUrl != @"/" ? new Uri(HttpContext.Current.Request.Url, rootUrl).AbsolutePath.TrimStart('/') : string.Empty;
                    if (shortestUrl.StartsWith(rootFolder, StringComparison.OrdinalIgnoreCase))
                    {
                        shortestUrl = shortestUrl.Substring(rootFolder.Length);
                    }
                }
                LoggingHelper.LogInformation("UrlTracker HttpModule | Current request's rootNodeId: {0}", rootNodeId);

                string redirectUrl = null;
                int? redirectHttpCode = null;
                bool redirectPassThroughQueryString = true;

                if (!ignoreHttpStatusCode)
                {
                    // Normal matching (database)
                    LoadUrlTrackerMatchesFromDatabase(request, urlWithoutQueryString, urlHasQueryString, shortestUrl, rootNodeId, ref redirectUrl, ref redirectHttpCode, ref redirectPassThroughQueryString);
                }
                else
                {
                    // Forced matching (cache)
                    LoadUrlTrackerMatchesFromCache(request, urlWithoutQueryString, urlHasQueryString, shortestUrl, rootNodeId, ref redirectUrl, ref redirectHttpCode, ref redirectPassThroughQueryString);
                }

                string query;
                if (!redirectHttpCode.HasValue)
                {
                    if (!ignoreHttpStatusCode)
                    {
                        // Normal matching (database)
                        // Regex matching
                        query = "SELECT * FROM icUrlTracker WHERE Is404 = 0 AND ForceRedirect = @forceRedirect AND (RedirectRootNodeId = @redirectRootNodeId OR RedirectRootNodeId = -1) AND OldRegex IS NOT NULL ORDER BY Inserted DESC";
                        using (IRecordsReader reader = _sqlHelper.ExecuteReader(query, _sqlHelper.CreateParameter("forceRedirect", ignoreHttpStatusCode ? 1 : 0), _sqlHelper.CreateParameter("redirectRootNodeId", rootNodeId)))
                        {
                            Regex regex;
                            while (reader.Read())
                            {
                                regex = new Regex(reader.GetString("OldRegex"));
                                if (regex.IsMatch(url))
                                {
                                    LoggingHelper.LogInformation("UrlTracker HttpModule | Regex match found");
                                    if (!reader.IsNull("RedirectNodeId"))
                                    {
                                        int redirectNodeId = reader.GetInt("RedirectNodeId");
                                        LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect node id: {0}", redirectNodeId);
                                        Node n = new Node(redirectNodeId);
                                        if (n != null && n.Name != null && n.Id > 0)
                                        {
                                            redirectUrl = UmbracoHelper.GetUrl(redirectNodeId);
                                            LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect url set to: {0}", redirectUrl);
                                        }
                                        else
                                            LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect node is invalid; node is null, name is null or id <= 0");
                                    }
                                    else if (!reader.IsNull("RedirectUrl"))
                                    {
                                        redirectUrl = reader.GetString("RedirectUrl");
                                        LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect url set to: {0}", redirectUrl);

                                        if (_capturingGroupsRegex.IsMatch(redirectUrl))
                                        {
                                            LoggingHelper.LogInformation("UrlTracker HttpModule | Found regex capturing groups in the redirect url");
                                            redirectUrl = regex.Replace(url, redirectUrl);

                                            LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect url changed to: {0} (because of regex capturing groups)", redirectUrl);
                                        }
                                    }

                                    redirectPassThroughQueryString = reader.GetBoolean("RedirectPassThroughQueryString");
                                    LoggingHelper.LogInformation("UrlTracker HttpModule | PassThroughQueryString is enabled");

                                    redirectHttpCode = reader.GetInt("RedirectHttpCode");
                                    LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect http code set to: {0}", redirectHttpCode);
                                }
                            }
                        }
                    }
                    else
                    {
                        // Forced matching (cache)
                        List<UrlTrackerModel> forcedRedirects = UrlTrackerRepository.GetForcedRedirects().Where(x => !string.IsNullOrEmpty(x.OldRegex)).ToList();
                        if (forcedRedirects == null || !forcedRedirects.Any())
                            return;

                        foreach (var match in forcedRedirects.Select(x => new { UrlTrackerModel = x, Regex = new Regex(x.OldRegex) }).Where(x => x.Regex.IsMatch(url)))
                        {
                            LoggingHelper.LogInformation("UrlTracker HttpModule | Regex match found");
                            if (match.UrlTrackerModel.RedirectNodeId.HasValue)
                            {
                                LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect node id: {0}", match.UrlTrackerModel.RedirectNodeId.Value);
                                Node n = new Node(match.UrlTrackerModel.RedirectNodeId.Value);
                                if (n != null && n.Name != null && n.Id > 0)
                                {
                                    redirectUrl = UmbracoHelper.GetUrl(match.UrlTrackerModel.RedirectNodeId.Value);
                                    LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect url set to: {0}", redirectUrl);
                                }
                                else
                                    LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect node is invalid; node is null, name is null or id <= 0");
                            }
                            else if (!string.IsNullOrEmpty(match.UrlTrackerModel.RedirectUrl))
                            {
                                redirectUrl = match.UrlTrackerModel.RedirectUrl;
                                LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect url set to: {0}", redirectUrl);

                                if (_capturingGroupsRegex.IsMatch(redirectUrl))
                                {
                                    LoggingHelper.LogInformation("UrlTracker HttpModule | Found regex capturing groups in the redirect url");
                                    redirectUrl = match.Regex.Replace(url, redirectUrl);

                                    LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect url changed to: {0} (because of regex capturing groups)", redirectUrl);
                                }
                            }

                            redirectPassThroughQueryString = match.UrlTrackerModel.RedirectPassThroughQueryString;
                            LoggingHelper.LogInformation("UrlTracker HttpModule | PassThroughQueryString is enabled");

                            redirectHttpCode = match.UrlTrackerModel.RedirectHttpCode;
                            LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect http code set to: {0}", redirectHttpCode);
                        }
                    }
                }

                if (redirectHttpCode.HasValue)
                {
                    string redirectLocation = string.Empty;

                    if (!string.IsNullOrEmpty(redirectUrl))
                    {
                        if (redirectUrl == "/")
                            redirectUrl = string.Empty;
                        Uri redirectUri = new Uri(redirectUrl.StartsWith(Uri.UriSchemeHttp, StringComparison.OrdinalIgnoreCase) ? redirectUrl : string.Format("{0}{1}{2}{3}/{4}", request.Url.Scheme, Uri.SchemeDelimiter, request.Url.Host, request.Url.Port != 80 && UrlTrackerSettings.AppendPortNumber ? string.Concat(":", request.Url.Port) : string.Empty, redirectUrl.StartsWith("/") ? redirectUrl.Substring(1) : redirectUrl));
                        if (redirectPassThroughQueryString)
                        {
                            NameValueCollection redirectQueryString = HttpUtility.ParseQueryString(redirectUri.Query);
                            NameValueCollection newQueryString = HttpUtility.ParseQueryString(request.Url.Query);
                            if (redirectQueryString.HasKeys())
                                newQueryString = newQueryString.Merge(redirectQueryString);
                            string pathAndQuery = Uri.UnescapeDataString(redirectUri.PathAndQuery) + redirectUri.Fragment;
                            redirectUri = new Uri(string.Format("{0}{1}{2}{3}/{4}{5}", redirectUri.Scheme, Uri.SchemeDelimiter, redirectUri.Host, redirectUri.Port != 80 && UrlTrackerSettings.AppendPortNumber ? string.Concat(":", redirectUri.Port) : string.Empty, pathAndQuery.Contains('?') ? pathAndQuery.Substring(0, pathAndQuery.IndexOf('?')) : pathAndQuery.StartsWith("/") ? pathAndQuery.Substring(1) : pathAndQuery, newQueryString.HasKeys() ? string.Concat("?", newQueryString.ToQueryString()) : string.Empty));
                        }

                        if (redirectUri == new Uri(string.Format("{0}{1}{2}{3}/{4}", request.Url.Scheme, Uri.SchemeDelimiter, request.Url.Host, request.Url.Port != 80 && UrlTrackerSettings.AppendPortNumber ? string.Concat(":", request.Url.Port) : string.Empty, request.RawUrl.StartsWith("/") ? request.RawUrl.Substring(1) : request.RawUrl)))
                        {
                            LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect URL is the same as Request.RawUrl; don't redirect");
                            return;
                        }
                        if (request.Url.Host.Equals(redirectUri.Host, StringComparison.OrdinalIgnoreCase))
                        {
                            redirectLocation = redirectUri.PathAndQuery + redirectUri.Fragment;
                        }
                        else
                        {
                            redirectLocation = redirectUri.AbsoluteUri;
                        }
                        LoggingHelper.LogInformation("UrlTracker HttpModule | Response redirectlocation set to: {0}", redirectLocation);
                    }

                    response.Clear();
                    response.StatusCode = redirectHttpCode.Value;
                    LoggingHelper.LogInformation("UrlTracker HttpModule | Response statuscode set to: {0}", response.StatusCode);

                    if (!string.IsNullOrEmpty(redirectLocation))
                    {
                        response.RedirectLocation = redirectLocation;
                    }

                    response.End();
                }
                else if (!ignoreHttpStatusCode)
                {
                    // Log 404
                    if (!UrlTrackerSettings.IsNotFoundTrackingDisabled && !UrlTrackerSettings.NotFoundUrlsToIgnore.Contains(urlWithoutQueryString) && !UmbracoHelper.IsReservedPathOrUrl(urlWithoutQueryString) && request.Headers["X-UrlTracker-Ignore404"] != "1")
                    {
                        bool ignoreNotFoundBasedOnRegexPatterns = false;
                        foreach (Regex regexNotFoundUrlToIgnore in UrlTrackerSettings.RegexNotFoundUrlsToIgnore)
                        {
                            if (regexNotFoundUrlToIgnore.IsMatch(urlWithoutQueryString))
                            {
                                ignoreNotFoundBasedOnRegexPatterns = true;
                                break;
                            }
                        }

                        if (!ignoreNotFoundBasedOnRegexPatterns)
                        {
                            LoggingHelper.LogInformation("UrlTracker HttpModule | No match found, logging as 404 not found");
                            query = "INSERT INTO icUrlTracker (OldUrl, RedirectRootNodeId, ";
                            if (urlHasQueryString)
                                query += "OldUrlQueryString, ";
                            query += "Is404, Referrer) VALUES (@oldUrl, @redirectRootNodeId, ";
                            if (urlHasQueryString)
                                query += "@oldUrlQueryString, ";
                            query += "1, @referrer)";
                            _sqlHelper.ExecuteNonQuery(query, _sqlHelper.CreateParameter("oldUrl", urlWithoutQueryString), _sqlHelper.CreateParameter("redirectRootNodeId", rootNodeId), _sqlHelper.CreateParameter("oldUrlQueryString", request.QueryString.ToString()), _sqlHelper.CreateParameter("referrer", request.UrlReferrer != null && !request.UrlReferrer.ToString().Contains(UrlTrackerSettings.ReferrerToIgnore) ? (object)request.UrlReferrer.ToString() : DBNull.Value));
                        }
                    }
                    if (UrlTrackerSettings.IsNotFoundTrackingDisabled)
                        LoggingHelper.LogInformation("UrlTracker HttpModule | No match found and not found (404) tracking is disabled");
                    if (UrlTrackerSettings.NotFoundUrlsToIgnore.Contains(urlWithoutQueryString))
                        LoggingHelper.LogInformation("UrlTracker HttpModule | No match found, url is configured to be ignored: {0}", urlWithoutQueryString);
                    else if (UmbracoHelper.IsReservedPathOrUrl(urlWithoutQueryString))
                        LoggingHelper.LogInformation("UrlTracker HttpModule | No match found, url is ignored because it's an umbraco reserved URL or path: {0}", urlWithoutQueryString);
                    else if (request.Headers["X-UrlTracker-Ignore404"] == "1")
                        LoggingHelper.LogInformation("UrlTracker HttpModule | No match found, url is ignored because the 'X-UrlTracker-Ignore404' header was set to '1'. URL: {0}", urlWithoutQueryString);
                }
                else
                    LoggingHelper.LogInformation("UrlTracker HttpModule | No match found in {0}", callingEventName);
            }
            else
                LoggingHelper.LogInformation("UrlTracker HttpModule | Response statuscode is not 404, UrlTracker won't do anything");

            LoggingHelper.LogInformation("UrlTracker HttpModule | {0} end", callingEventName);
        }

        static void LoadUrlTrackerMatchesFromDatabase(HttpRequest request, string urlWithoutQueryString, bool urlHasQueryString, string shortestUrl, int rootNodeId, ref string redirectUrl, ref int? redirectHttpCode, ref bool redirectPassThroughQueryString)
        {
            string query = "SELECT * FROM icUrlTracker WHERE Is404 = 0 AND ForceRedirect = 0 AND (RedirectRootNodeId = @redirectRootNodeId OR RedirectRootNodeId IS NULL OR RedirectRootNodeId = -1) AND (OldUrl = @url OR OldUrl = @shortestUrl) ORDER BY CASE WHEN RedirectHttpCode = 410 THEN 2 ELSE 1 END, OldUrlQueryString DESC";
            using (IRecordsReader reader = _sqlHelper.ExecuteReader(query, _sqlHelper.CreateParameter("redirectRootNodeId", rootNodeId), _sqlHelper.CreateParameter("url", urlWithoutQueryString), _sqlHelper.CreateParameter("shortestUrl", shortestUrl)))
            {
                while (reader.Read())
                {
                    LoggingHelper.LogInformation("UrlTracker HttpModule | URL match found");
                    if (!reader.IsNull("RedirectNodeId") && reader.GetInt("RedirectHttpCode") != (int)HttpStatusCode.Gone)
                    {
                        int redirectNodeId = reader.GetInt("RedirectNodeId");
                        LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect node id: {0}", redirectNodeId);
                        Node n = new Node(redirectNodeId);
                        if (n != null && n.Name != null && n.Id > 0)
                        {
                            string tempUrl = UmbracoHelper.GetUrl(redirectNodeId);
                            redirectUrl = tempUrl.StartsWith(Uri.UriSchemeHttp) ? tempUrl : string.Format("{0}{1}{2}{3}{4}", HttpContext.Current.Request.Url.Scheme, Uri.SchemeDelimiter, HttpContext.Current.Request.Url.Host, HttpContext.Current.Request.Url.Port != 80 && UrlTrackerSettings.AppendPortNumber ? string.Concat(":", HttpContext.Current.Request.Url.Port) : string.Empty, tempUrl);
                            if (redirectUrl.StartsWith(Uri.UriSchemeHttp))
                            {
                                Uri redirectUri = new Uri(redirectUrl);
                                string pathAndQuery = Uri.UnescapeDataString(redirectUri.PathAndQuery) + redirectUri.Fragment;
                                /*redirectUrl = pathAndQuery.StartsWith("/") && pathAndQuery != "/" ? pathAndQuery.Substring(1) : pathAndQuery;

                                if (redirectUri.Host != HttpContext.Current.Request.Url.Host)
                                {
                                    redirectUrl = new Uri(redirectUri, pathAndQuery).AbsoluteUri;
                                }*/
                                redirectUrl = GetCorrectedUrl(redirectUri, rootNodeId, pathAndQuery);
                            }
                            LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect url set to: {0}", redirectUrl);
                        }
                        else
                        {
                            LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect node is invalid; node is null, name is null or id <= 0");
                            continue;
                        }
                    }
                    else if (!reader.IsNull("RedirectUrl"))
                    {
                        redirectUrl = reader.GetString("RedirectUrl");
                        LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect url set to: {0}", redirectUrl);
                    }

                    redirectPassThroughQueryString = reader.GetBoolean("RedirectPassThroughQueryString");
                    LoggingHelper.LogInformation("UrlTracker HttpModule | PassThroughQueryString is {0}", redirectPassThroughQueryString ? "enabled" : "disabled");

                    NameValueCollection oldUrlQueryString = null;
                    if (!reader.IsNull("OldUrlQueryString"))
                    {
                        oldUrlQueryString = HttpUtility.ParseQueryString(reader.GetString("OldUrlQueryString"));
                        LoggingHelper.LogInformation("UrlTracker HttpModule | Old URL query string set to: {0}", oldUrlQueryString.ToQueryString());
                    }

                    if ((urlHasQueryString || oldUrlQueryString != null) && (oldUrlQueryString != null && !request.QueryString.CollectionEquals(oldUrlQueryString)))
                    {
                        LoggingHelper.LogInformation("UrlTracker HttpModule | Aborting; query strings don't match");
                        continue;
                    }

                    redirectHttpCode = reader.GetInt("RedirectHttpCode");
                    LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect http code set to: {0}", redirectHttpCode);

                    break;
                }
            }
        }

        private static string GetCorrectedUrl(Uri redirectUri, int rootNodeId, string pathAndQuery)
        {
            string redirectUrl = pathAndQuery;
            if (redirectUri.Host != HttpContext.Current.Request.Url.Host)
            {
                // if site runs on other domain then current, check if the current domain is already a domain for that site (prevent unnessecary redirect to primary domain)
                List<UrlTrackerDomain> domains = UmbracoHelper.GetDomains();
                List<UrlTrackerDomain> siteDomains = domains.Where(x => x.NodeId == rootNodeId).ToList();
                List<string> hosts =
                    siteDomains
                    .Select(x => new Uri(x.UrlWithDomain).Host)
                    .ToList();
                if (!hosts.Contains(redirectUri.Host))
                {
                    // if current domain is not related to target domain, do absoluteUri redirect
                    redirectUrl = new Uri(redirectUri, '/' + pathAndQuery.TrimStart('/')).AbsoluteUri;
                }
            }
            return redirectUrl;
        }

        static void LoadUrlTrackerMatchesFromCache(HttpRequest request, string urlWithoutQueryString, bool urlHasQueryString, string shortestUrl, int rootNodeId, ref string redirectUrl, ref int? redirectHttpCode, ref bool redirectPassThroughQueryString)
        {
            List<UrlTrackerModel> forcedRedirects = UrlTrackerRepository.GetForcedRedirects();
            if (forcedRedirects == null || !forcedRedirects.Any())
                return;

            foreach (UrlTrackerModel forcedRedirect in forcedRedirects.Where(x => !x.Is404 && (x.RedirectRootNodeId == rootNodeId || x.RedirectRootNodeId == -1) && (string.Equals(x.OldUrl, urlWithoutQueryString, StringComparison.CurrentCultureIgnoreCase) || string.Equals(x.OldUrl, shortestUrl, StringComparison.CurrentCultureIgnoreCase))).OrderBy(x => x.RedirectHttpCode == 410 ? 2 : 1).ThenByDescending(x => x.OldUrlQueryString))
            {
                LoggingHelper.LogInformation("UrlTracker HttpModule | URL match found");
                if (forcedRedirect.RedirectNodeId.HasValue && forcedRedirect.RedirectHttpCode != (int)HttpStatusCode.Gone)
                {
                    LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect node id: {0}", forcedRedirect.RedirectNodeId.Value);

                    Node n = new Node(forcedRedirect.RedirectNodeId.Value);
                    if (n != null && n.Name != null && n.Id > 0)
                    {
                        string tempUrl = UmbracoHelper.GetUrl(forcedRedirect.RedirectNodeId.Value);
                        redirectUrl = tempUrl.StartsWith(Uri.UriSchemeHttp) ? tempUrl : string.Format("{0}{1}{2}{3}{4}", HttpContext.Current.Request.Url.Scheme, Uri.SchemeDelimiter, HttpContext.Current.Request.Url.Host, HttpContext.Current.Request.Url.Port != 80 && UrlTrackerSettings.AppendPortNumber ? string.Concat(":", HttpContext.Current.Request.Url.Port) : string.Empty, tempUrl);
                        if (redirectUrl.StartsWith(Uri.UriSchemeHttp))
                        {
                            Uri redirectUri = new Uri(redirectUrl);
                            string pathAndQuery = Uri.UnescapeDataString(redirectUri.PathAndQuery);
                            //redirectUrl = pathAndQuery.StartsWith("/") && pathAndQuery != "/" ? pathAndQuery.Substring(1) : pathAndQuery;
                            redirectUrl = GetCorrectedUrl(redirectUri, forcedRedirect.RedirectRootNodeId, pathAndQuery);

                        }
                        LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect url set to: {0}", redirectUrl);
                    }
                    else
                    {
                        LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect node is invalid; node is null, name is null or id <= 0");
                        continue;
                    }
                }
                else if (!string.IsNullOrEmpty(forcedRedirect.RedirectUrl))
                {
                    redirectUrl = forcedRedirect.RedirectUrl;
                    LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect url set to: {0}", redirectUrl);
                }

                redirectPassThroughQueryString = forcedRedirect.RedirectPassThroughQueryString;
                LoggingHelper.LogInformation("UrlTracker HttpModule | PassThroughQueryString is {0}", redirectPassThroughQueryString ? "enabled" : "disabled");

                NameValueCollection oldUrlQueryString = null;
                if (!string.IsNullOrEmpty(forcedRedirect.OldUrlQueryString))
                {
                    oldUrlQueryString = HttpUtility.ParseQueryString(forcedRedirect.OldUrlQueryString);
                    LoggingHelper.LogInformation("UrlTracker HttpModule | Old URL query string set to: {0}", oldUrlQueryString.ToQueryString());
                }

                if ((urlHasQueryString || oldUrlQueryString != null) && (oldUrlQueryString != null && !request.QueryString.CollectionEquals(oldUrlQueryString)))
                {
                    LoggingHelper.LogInformation("UrlTracker HttpModule | Aborting; query strings don't match");
                    continue;
                }

                redirectHttpCode = forcedRedirect.RedirectHttpCode;
                LoggingHelper.LogInformation("UrlTracker HttpModule | Redirect http code set to: {0}", redirectHttpCode);

                break;
            }
        }
    }
}

redpajama_set_name: RedPajamaGithub


text:
P-05-910 Make thrombectomy available 24-7 for Welsh patients
Patients such as Colin Rogers are literally dying. He was 55 when he died. He was denied treatment because it was a Sunday and there was no agreement to allow him to be sent to England. Whilst there was no guarantee he would have been saved, it is estimated that over 500 people in Wales could be helped by this treatment. We do not want people who could be saved to die like Colin, or be left profoundly disabled.
South Wales Central

redpajama_set_name: RedPajamaCommonCrawl


Sharing with you a condensed and combined version of Jed Velarde's and Marvin Fausto's talk during the COL Financial Smart Investing 2016 Summit. Plus some of my additional inputs.
To safeguard your money against inflation (which erodes your money's purchasing power over time).
To let money work for you. We only have a limited time to work for money, at some point, our money should also work for us to create more money (interest, dividends, capital appreciation etc). At some point, our money should work harder than us.
To be financially free. To secure a comfortable future. To have a richer life. To use our God-given resources and talents. To have more than enough to share with other people and bless them with richer lives as well.
This means as much as possible, part of your savings (or assets) remains invested at any given time. From your first pay check up to past your retirement years. Which means you should not invest all of your money. You should not invest part of your money which you think you will need in the short to medium term. Hence, you start first with building your emergency funds and leave a certain amount in a liquid deposit account for your daily needs. Then invest the rest. Staying invested also means investing in the long run, for the long-term. Through the market ups and downs.
Warren Buffet's rule #1 is: "Do not lose money." Don't be reckless in investing. Since there is opportunity to gain in investing, there is also opportunity to lose. That's why many people don't like to invest because of fear of losing money. But if risk is properly managed, the chances of your investments growing outweigh the downside risks. Besides, not investing your money is a sure way to lose money (due to inflation). Here in investmentjuan01, we always ask you to pair each of your investments with O-H-A (Objectives, Horizon, Appetite). Invest according to your goal and objectives. You manage risks by educating yourself of the various investments (like which stocks you purchase), or letting experts do the investing or you (like buying various mutual funds or UITF, which suits your OHA). As others say, Aral muna bago invest. You manage risks by having the proper time horizon.
Part of managing risks of your investments is asset allocation. Diversification. Investments are governed with cycles just like in business, there will be good years and not-so-good years. Invest in various vehicles so that you minimize concentration risk, so that you allow good performing investments to compensate for not-so-good performing ones. Click here for various investment options we cover.
John Bogle, founder of Vanguard Group (among the largest fund houses in the world) says that you allocate your age in bonds, the rest in stocks. So if you're 30 years old, he says 30% of your investable funds should be in bonds (or money markets / fixed income), 70% in stocks. Of course there are no hard and fast rules. Marvin Fausto recommends below asset allocation depending on your age and phase in life. Blue slice is stocks, gray slice is bonds.
Aside from staying invested, a smart investing technique is to invest regularly, in fixed intervals. Not one time big time, but regularly, in comfortable amounts. This makes Juan disciplined in handling his monthly paycheck and later on he won't even feel the amount he invests, the amount leaving his salary for a good cause. Through investing regularly, Juan is able to take advantage of cost-averaging, being able to buy in the highs and lows of the market, hopefully to end up with a lower average price than market value (hence a gain).
Seasoned traders and investors might have reservations with regards to this because they themselves are more familiar in timing the markets (position trading), and because they can outperform the returns of cost-averaging. But not everyone can be like them. For newbies (or those who neither have the time to monitor the markets nor the skills and confidence to frequently buy and sell), cost-averaging through regular investing is highly recommended. Personally I do this for my VUL and UITF, then I do position trading in stocks. Online brokers (COL Financial, among others), mutual funds, and banks (UITF) also have programs to cater to regular investing (easy investment plan, monthly investments plan, whatever they are called), some even through salary deduction. They want to make investing easier for every Juan so do take advantage of those.
We have also seen that investing as early as possible (no matter how small the amount is) can yield to a bigger fund in the long run (thanks to the power of compounding) compared to those who start investing late. What matters more is the length of time you allow your investments to grow, than waiting for yourself to have a bigger salary but starting much later on in life.
As mentioned, your investments should be paired with objectives. As such, you must set aside a time each month or at least each year to assess whether your investments are trending according to your targets. Likewise, a re-allocation may also be done to adjust your asset allocation according to your age and changing needs. This is especially true if Juan is nearing retirement, then Juan must slowly bring down his exposure to stocks and shift these to lower risk bonds and money markets. Again, your age in bonds as Bogle says. It is also good to set aside specific times to assess other investment options as you grow your portfolio.
If you care about your future, if you want a richer life for you and your future family, invest. Invest the smart way.
For highlights and notes on the COL Financial SMart Investing 2016 summit, click here.
Share this article with a friend and help them in their own investments. Follow us on Facebook, Instagram and Twitter. Join our growing subscriber base for free.
Check out Bo Sanchez's Truly Rich Club and the many financial and spiritual benefits that we enjoy as members. Support our cause, donate through Paypal.


All images and work contained in this website are protected by international copyright. All photographs displayed on this web site belong to RJ Lam and Lux Camera UK.
Requests for reproduction may be directed to the photographer.


Living Room — This living room, is one of the 23 designs published under the gallery: Artfurniture Sears Living Room Furniture. In the next page, we have the large space living room furniture ashley in arrangement examples living room ideas amazing living sears couches on sale [ ... ]. While in	the previous page, we have the living room large size home furniture decoration living room collections sofas sears living room furniture sears living room chairs [ ... ].


"What kind of music do you use?"
We will sing the best of contemporary songs that richly express gospel truth along with great hymns of the faith that have served God's people well over generations. In all our music, our various praise bands work hard to use great music to lead us to worship, meditate, and celebrate and enjoy the greatness of our God and the wonder of His love.
"How do people dress for your services?"
Our services are not "a put on your Sunday best" affair, and, while diverse, most are dressed fairly casual. What should make us uncomfortable should be the holiness of God and not what you are wearing! So come as you are. Become undone before the holiness of God, and then find amazing joy in His loving grace to us in Christ!
"How does being a "Reformed church" affect your worship?"
Our faith isn't new: it comes from Scripture and its major teachings are summed up in the Westminster Confession of Faith and Catechisms. This ancient faith shapes everything we do including how we worship. Ours is a God-centered faith that's reflected in our worship. And yet its a living faith where our hearts are really engaged as we read the Bible, pray the Bible, and sing the Bible through many different forms and expressions.
"What are your Passions in Worship?"
Our weekly service is designed to call us out of the dream world for the real world of living in light of the reality of God's grace to us in Jesus! We believe that our gathering together for worship is about loving God with all that we are for all that He is to us in Christ. Such worship must be both rooted and relevant.
Rooted in Scripture- we seek to read, pray, preach, and sing the truths of Scriptures to our God and to our hearts.
Rooted in Christ- celebrating God's sovereign grace to us in Christ is central in all we do, and all we do becomes pleasing to God not through our sincerity or theological precision, but through Jesus' sacrifice purifying even our passionate and theologically rich worship.
Relevant to our real needs- we believe God desires to be glorified by enabling His people to be cared for and equipped as we gather together in worship.
Relevant to our whole lives- worship must call us to see our lives in the present in light of our eternal destiny, and so help us live all our lives in the present for what matters for all eternity.
Relevant to our world- worship is about proclaiming and celebrating the glory of God through which our neighbors should come to hear and be embraced by the grace of God in the gospel of Christ.
We believe that, when such worship takes place, God is glorified, the Church is edified, and the gospel is proclaimed to those who don't know Christ. These are our passions in worship.
"What does a typical service look like?"
We believe that corporate worship is a conversation between God and His people through which the gospel is represented to us each week. Our order of worship is designed as a conversation much like Isaiah 6 in which we encounter Christ in the gospel through each activity of worship. Typically, our services last about an hour and a quarter.
We believe that Christ-centered, expositional preaching of God's Word best fulfills the passions we shared. Even when we have a topical series, each sermon is foremost an explaining of a passage of God's Word, the Bible. Normally, we work our way through whole books of the Bible consecutively, which allows God speaks to us on His terms and topics and not just our interests. Amazingly, as we let God set the agenda for the conversation, we find our real questions and needs best addressed and answered.
We believe there is value in the historical music of the Church as well in as new music. Drawing from a long, deep wealth of song, in both music and text, we connect and worship with the Church historical, our spiritual ancestors. But we also draw from the large body of newer music, speaking into our current life and culture. Our praise bands use a whole range of instruments to help lead us from guitars and pianos to drums, beat box, and banjo!


Loading..익스프레션 인코더 2 SP1의 H.264 지원..
ffmpeg -i "INPUT.avi" -acodec libfaac -ab 128k -s 480x320 -vcodec mpeg4 -b 0.5M -flags +aic+cbp+mv0+mv4 -trellis 1 -mbd 2 -cmp 2 -subcmp 2 -g 250 -maxrate 0.8M -bufsize 2M -metadata "title=제목" -f ipod "OUTPUT.mp4"
알고 봤더니 아래와 같이 faac 옵션이 빠져있었다.
FFmpeg version SVN-r20372, Copyright (c) 2000-2009 Fabrice Bellard, et al.
MS의 Expression Encoder 3 가 Expression 1,2,와 달리 가격 정책이 무료로 바뀌었군요.
이제는 조금 더 빠른 속도로 Windows Media Encoder를 대체 할 수 있을 것 같네요.
이전과 달리 Expression Encoder SDK가 기본으로 포함되어 있구요.
Microsoft Expression 3 Screen Capture 란 녀석이 있는데요.
예전에 WME 보다 더 편리하게 화면 캡쳐를 할 수 있는 녀석인 것 같아 맘에 듭니다.
윈도우 미디어에 관심 있으신 분은 꼭 설치 해보세요.
3의 화면 캡처 프로그램은 SDK도 제공하지 않고, 심지어 WME와 달리 캡처 완료 후 다시 인코딩하는 방식을 씁니다. 그래서쓸 수가 없어요 ㅜ.ㅜ 4에서는 좀 달라졌으려나.
갑자기 MS의 링크가 전혀 다운로드 되지 않아서 올려봅니다.
다윈 퀵타임 스트리밍 서버를 현재 쓰고 있는 리눅스(Fedora 10)에 깔아 보려고 만만한 문서를 검색해 보았다. 아래와 같이 CentOS에 설치하는 문서를 발견.
RPM 시스템이니 약간의 경로만 바꾸니 바로 설치가 가능했다.
This tutorial will run you through the installation, configuration and preparation of media for Apple's Darwin QuickTime Streaming Server on Centos/RHEL 5.2. Darwin QuickTime Streaming Server is capable of serving H.264 and mpeg4 file formats via the RTP/RTSP streaming protocols.
Currently there are no official binary packages of the current version so we will grab a source RPM. Apple's current source package dose not compile on a Linux system without being patched. Enter the following command by command!
미디어 스트리밍을 하는 서버들을 찾아봤더니 WMS 말고도 여러 가지가 있었다.
물론 여기에 포함 안 되는 것들도 있겠으니 검색해서 많이 나오는 제품들은 표와 같다.
테스트용으로 H.264로 트랜스코딩을 부탁 받았다.
VLC 쉘… 괜찮은데? 이용해서 배치 트랜스코더를 만들어볼까?
윈도우 2008에는 2003과 다르게 기본적으로 미디어 서비스가 설치되어 있지 않습니다.
한글 버전의 다운로드는 아래의 링크를 클릭하여 다운 받아 주십시오.
이 중에서 서버의 CPU에 맞는 Server.msu (통합본)를 설치해 주십시오.
MMS가 빠져 있는 것을 보니 Media Player 11 처럼 MMS 프로토콜이 아예 빠진 것 같네요.
익스프레션 인코더 2 SP1의 H.264 지원..
실버라이트의 H.264 지원 계획 글 이후로….
관심 있으신 분은 아래의 글을 확인해 보시기 바랍니다.
요즘에는 어둠의 경로에서 HD 동영상을 구하다 보면 문득 MKV라는 확장자가 많은것 같다.
다운받지 않고 스트리밍으로 보는 방법이 없을까?
웹서버 + MKV + VLC 조합에서 놀라운 결과를 보여주었다.
생각도 안했던 동영상 스킵(동영상 위치 점프), 1~2초가 안되는 버퍼링... 등이 가능했다.
어쨌든 당분간은 이조합으로 HD영화를 봐야겠다.
그런데 일단 영어의 압박이 있으니 그림만이라도 자세히 보자!!


The BetaFPV Beta65s is currently the world's most popular 65mm tiny whoop. It features bigger upgraded 7×16 17500kv motors with 31mm tri blade props. It runs on BetaFlight firmware so it's super east to setup.
It has prop guards and only weighs 34g with battery so it's safe enough to fly inside your house but powerful enough to fly outside too.


Poor, Elsa! She has some severe tooth problems, but she's too afraid of dentists to make an appointment and get hem fixed. If only you agreed to be her doctor and, using all those dental instruments, one by one, and then applying all those lovely dental stickers, as well, get her teeth from awfully looking to... fabulous!


text:
Missoula's drinking water: The cast of characters for city's condemnation trial (March 15, 2015)
A lawyer who fought to get Osama bin Laden's driver out of Guantanamo Bay prison is among the cast of characters who will appear this week in Missoula County District Court.
Attorneys, witnesses, law students and members of the public will descend Wednesday upon Judge Karen Townsend's courtroom to hear the city of Missoula argue its eminent domain case against Mountain Water Co. and The Carlyle Group.
Here's a look at some of the main players who will appear in court during the trial, scheduled to last through April 2.
CITY OF MISSOULA
John Engen
When he first ran to head the city of Missoula, John Engen's campaign mantra was that he wanted to be the mayor of his hometown. Engen, a native of Missoula, is now in his third term as mayor. In 2011, when The Carlyle Group bought Mountain Water Co., Engen announced he wanted to put the water company under public ownership. He later assembled a high-powered team to lead the city through the acquisition. In 2014, when it was clear a sale would not take place amicably, the city of Missoula took Carlyle and the water company to court. The condemnation case is Engen's most aggressive initiative to date. The hometown mayor's legacy is tied to the outcome, either a colossal win or devastating loss for the city of Missoula.
Harry Schneider
Harry Schneider is one of the lawyers who represents the city of Missoula in the eminent domain case. He works at Perkins Coie, a firm based in Seattle, and he has a roster of corporate clients including Boeing Co. and Nintendo. His work took a different turn when he was asked to help defend the man who had worked as a driver and bodyguard for Osama bin Laden. In Hamdan v. Rumsfeld, et al, Schneider worked pro bono to obtain a ruling from the U.S. Supreme Court striking down military commissions to try detainees held at Guantanamo Bay, Cuba, according to his bio. Salim Hamdan was released from Guantanamo in 2008, according to a court document. The Yemeni man continued to fight his war crimes conviction, and in 2012, an appeals court vacated the order with support from Schneider.
Steven Running
A man who shared in the 2007 Nobel Peace Prize for his work on climate change is on the witness list for the city of Missoula. Steve Running, a leading climate scientist and ecology professor at the University of Montana, has predicted drought in the northern Rocky Mountains. In a study released in 2010, Running noted the region would see shortened winters and two additional months of summer drought. The real impacts on Montana are really all about the water, Running said at the time.
Robert Dove
Robert Dove is the managing director of infrastructure at The Carlyle Group. He appears to excel at sealing the deal. To stave off a possible protest against a sale of Mountain Water to Carlyle, he convinced the Missoula mayor to back the transfer. In exchange, he signed a letter saying Carlyle would consider in good faith any offer the city of Missoula made for Mountain. Since then, Carlyle rejected at least two offers from the city, and the city took Carlyle to court, alleging a bait and switch. Dove appears to be the heavyweight who subsequently convinced a Canadian corporation to buy Carlyle's Western Water Holdings, which includes Mountain Water, despite the condemnation quagmire already entangling the local utility. The Missoula case isn't the only one that links Dove to an embattled water system. In 1996, Dove joined Bechtel Enterprises, and he served on the board of directors of a Bechtel venture called International Water from 2000 to 2006. In 2000, the company's dealings in Bolivia led to an uprising known as the Cochabamba Water Wars and at least three deaths, according to the Democracy Center, which chronicled the wars. One year earlier, Bolivia had granted a privatization lease to a Bechtel offshoot, giving it control over the water on which more than half a million people survive, the Center said. Immediately the company raised rates by an average of 50 percent. After the riots, Bolivia cancelled the contract with the Bechtel company, and Bechtel and another investor sued the government for lost earnings. The case was settled in 2006, and Dove represented International Water in the signed agreement, according to Bolivian newspaper Los Tiempos.
Bill Mercer
Former U.S. Attorney for Montana Bill Mercer is one of the lawyers representing Carlyle. In 2006, Mercer earned the harsh critique of U.S. District Judge Donald Molloy for being overly zealous with federal charges in state matters: Do you ever concern yourself with justice? Molloy asked. One year later, Montana's embattled U.S. attorney was asked to resign by U.S. Sen. Jon Tester, D-Montana, after a report accused Mercer of changing federal law so he could live outside his district and hold a separate post in Washington, D.C. A Republican appointed by President Bush, Mercer filled out his term through 2009. He served in the U.S. Attorney's Office for 15 years, including more than eight in the top spot. He's a lawyer with Holland & Hart in Billings.
MOUNTAIN WATER CO.
Joe Conner of Baker Donelson is a lawyer representing Mountain Water Co. According to his bio, his eminent domain practice is national in scope. Conner, of Tennessee, brings the only Southern accent the courtroom likely will hear during trial. He presents a track record of getting his clients a lot more money than they originally demand. In his online bio, he ticks off his representation of Illinois American Water as among his accomplishments: The city (of Peoria, Illinois) placed the value (of the company) at $95 million. The issue of fair market value was arbitrated before a panel of three appraisers in January 2005. Result: Company valued at $220 million; city then ended its efforts to buy the IAW assets in Peoria District.
John Kappes
At the helm of Mountain Water Co., John Kappes is another native son involved in the dispute. He's a graduate of the University of Montana who joined the water company in 1990, just a few years after the utility won an earlier eminent domain proceeding the city of Missoula filed in the 1980s. Kappes, now president of the company, came up through the ranks at the utility. He worked as a coordinator of rates, was promoted to assistant general manager in 2001, and became president in 2012. He's a shareholder who stands to gain in a transfer of the company.
MISSOULA COUNTY DISTRICT COURT
Judge Karen Townsend
Judge Karen Townsend has presided over the eminent domain case since it was filed in April 2014, and she already has ruled on numerous motions. The most recent high-profile case to come before her was the rape trial of former University of Montana Grizzlies quarterback Jordan Johnson, who was acquitted in 2013. The judge, who took office in 2011, is personable with the lawyers who appear before her and persistent in questioning their arguments. Townsend was the first female prosecutor to handle criminal cases for Missoula County and first woman to serve as a judge in Missoula County District Court. Gender arose in the current case when one of the lawyers acknowledged some of the differences in play now compared to the city's eminent domain case in the 1980s. The lawyer noted the judge was different, and the judge agreed. Even a girl, she said. When she took office, she said people expected her to be unbiased and come prepared, and she, in turn, had expectations of lawyers. I expect I will be getting excellence from lawyers who appear in front of me, Townsend said at the time.
Source: Keila Szpaller, Missoulian


text:
Balance, Not Symmetry
Director Jamie Adams collaborates with Biffy Clyro for Glasgow-set drama Balance, Not Symmetry, an unbearable film marred by clichés and an inconsistent structure
Film Review by Maria Kamińska | 27 Jun 2019
Film title: Balance, Not Symmetry
Director: Jamie Adams
Starring: Laura Harrier, Bria Vinaite, Lily Newmark, Scott Miller
Balance, Not Symmetry is unbearable. Directed and co-written by Jamie Adams, this aimless and inconclusive drama about a young woman processing a deep loss recycles clichés and wallows in narrative shallows without a hint of self-awareness. Laura Harrier (Spider-Man: Homecoming) plays Caitlin Walker, a disturbed British-American art student living in Glasgow who tries to take back control of her life after her father's death. Torn between supporting her mourning mother (Kate Dickie) and fulfilling art school duties, this young woman attempts to overcome a creative blockage and finally figure out who she really is.
Almost every part of this setup could have been successful. The idea of depicting the experience of loss from the perspective of a young person is refreshing and needed but the inconsistent writing crushes hopes for a solid and smartly-structured story. Random and sketchy plots appear suddenly and then disappear without a word of explanation. The mother's fledgeling addiction miraculously stops being an issue, while Caitlin's edgy affair with Rory (Scott Miller) – a self-proclaimed artist – disappears from the director's interest as soon as it occurs. The film generates some energy through the presence of The Florida Project's Bria Vinaite as Hannah, Caitlin's flatmate, but her spiky performance alone can't cover the narrative gaps.
Balance, Not Symmetry's most striking flaw, however, is the clumsy filmmaking. Frankly speaking, it looks as if Adams has squished together an intimate family vivisection, MTV-styled teen drama and a bunch of video clips for Scottish rockers Biffy Clyro into one storyline. Even the song choices don't appear to correspond with the plot, accentuating the sense of narrative confusion.
Overall, Balance, Not Symmetry is devoid of fully-formed characters or ideas. The film's narrative patchwork, with its inconsistent structure, offers its audience neither a sense of balance nor symmetry.
Balance, Not Symmetry had its world premiere at Edinburgh International Film Festival
Maria Kamińska is a student at the University of Warsaw and part of Edinburgh International Film Festival's Student Critics Programme. For more on EIFF's Student Critics Programme, click here


Oil investors rattled by the threat of U.S. output can find some cheer from diesel demand in Asia.
Strong consumption of the fuel -- used to power everything from trucks to ships and factories -- underpinned crude's bull run last year, a rally that's now being threatened by surging American production. Still, while the risk of a crude glut looms, refineries being shut for spring-season maintenance is set to squeeze diesel supplies in the Asian market at a time when demand is being boosted by healthy economic growth.


Dan Master's Triumph TR6 Ford 302 V8 Conversion. A tight fit, but a fit never the less. This is a shot of a later stage of installation fitment.
Buy ATK Engines HP99FPAK at JEGS: ATK Engines Ford 302 Engine and Transmission Kit. Guaranteed lowest price!


magnetic emergency vehicle lights drill doctor 7406 emergency car magnetic light with cigarette plug universal car v lamps led magnet car emergency lights lighter universal car v lamps led magnet car emergency lights lighter magnetic auto car repair work light.
magnetic emergency vehicle lights magnetic beacons xenon amber beacon magnetic commercial vehicle flashing emergency warning lighting truck car magnetic emergency vehicle lights.
magnetic emergency vehicle lights 6 34 amber led strobe light beacon with 15 leds magnetic base strobe shown on full sized truck with power outlet extension cable vpa ext2 magnetic emergency vehicle lights.
magnetic emergency vehicle lights magnetic mounting base led emergency vehicle strobe lights magnetic emergency vehicle lights.
magnetic emergency vehicle lights magnetic emergency led light bar with toggle switch 360 degree strobing led mini lightbar magnetic emergency vehicle lights.
magnetic emergency vehicle lights emergency warning lighting amazoncom led strobe lightemergency beacon amber light watt led strobe lightemergency beacon amber light watt modes powerful magnet warning flashing.
magnetic emergency vehicle lights 32 watts 32 led amber yellow emergency vehicle stroble light construction warning flashing lights beacon magnetic .
magnetic emergency vehicle lights 12 led magnetic emergency lightremovable work light with 5v rechargeable battery charger 4 heavy duty magnets dual flash modes emergency vehicle light kits magnetic amber led strobe light revolving emergency lights for magnetic amber led strobe light revolving emergency lights for truck vehicle.
magnetic emergency vehicle lights led strobe lightemergency beacon amber light 40 watt 10 modes powerful magnet warning flashing magnetic emergency vehicle lights.
magnetic emergency vehicle lights categories emergency lights vehicle equipment magnetic emergency vehicle lights.
magnetic emergency vehicle lights 240 led amber car roof magnetic emergency hazard warning flash strobe light car door led emergency lights universal auto traffic warning lamp led emergency lights materialplasticmagnet colorred weightg sizemm packagebox.
magnetic emergency vehicle lights emergency strobe led beacon light 12 watt 14 modes powerful magnet magnetic emergency vehicle lights.
magnetic emergency vehicle lights 8 led flashing mode car auto beacon lights emergency hazard police warning strobe light strong magnetic base amber red blue car lights www8 magnetic emergency vehicle lights.
magnetic emergency vehicle lights magnetic emergency light amber yellow led magnetic base car roof flashing strobe emergency light led police magnetic emergency magnetic emergency vehicle lights.
magnetic emergency vehicle lights why do you need to install emergency lights emergency warning lighting beacon strobe lights bars caridcom emergency warning lighting.
magnetic emergency vehicle lights magnetic emergency lights magnetic base amber led strobe light beacon lighting flash warning light blue spot up to off on drill doctor emergency c groupon goods drill doctor emergency car magnetic light with cigarette plug.
magnetic emergency vehicle lights finether 24 leds emergency vehicle light bar strobe light hazard police warning flash flashlight enforcement magnetic emergency vehicle lights.
magnetic emergency vehicle lights 24 amber white led rooftop strobe light with magnetic base turned amazoncom led strobe lightemergency beacon amber light watt led strobe lightemergency beacon amber light watt modes powerful magnet warning flashing.
magnetic emergency vehicle lights led warning work lighting sirens magnetic emergency vehicle lights.
magnetic emergency vehicle lights rechargeable led road flares led beacon vehicle top magnetic emergency warning strobe lights led beacon vehicle top magnetic emergency warning strobe lights amber v.
magnetic emergency vehicle lights 240 led strobe light beacon 14 patterns car truck construction car vehicle safety warning magnetic emergency vehicle lights.
magnetic emergency vehicle lights magnetic emergency lights led car vehicle truck magnetic mounted led flashing strobe emergency light beacon lamp magnetic emergency lights shop our security led strobe lights sirens xprite usa blue w led magnetic mount beacon strobe light.
magnetic emergency vehicle lights magnetic magnetic emergency vehicle lights.
magnetic emergency vehicle lights china magnetic rechargeable car emergency work light with rotary handle for free angle lighting magnetic emergency vehicle lights.


text:
Q: In which criteria separate code into packages in an Android Application I am developing an Android application using eclipse which has totally 29 classes in a package called com.companyname.appname.This 29 classes includes Activities,List Fragments,Loaders,Service, DbHelper,Jsonparser,Adapter and NetworkConnection classes.
I plan to separate packages like below,
Method 1:

*

*com.companyname.appname.activities (includes all activity class of application)

*com.companyname.appname.services (includes all service class of application)

*com.companyname.appname.loaders (includes all loader class of application)

*com.companyname.appname.fragments (includes all fragment class of application)

*com.companyname.appname.database (includes all database helper class of application)

*com.companyname.appname.utilities (includes other utility classes(Jsonparser,Netwrok connection detection,SimpleCursorAdapter) of application)

Method 2:

*

*Separate each package for each Activity(it includes the associated fragments,loaders,utilities,services,etc)

Which is the efficient method? Or I need to separate packages in different method efficiently?
What are all the best practices of package separation in android code design?

A: packages purpose is just for organization. The first method will allow you without thinking too much to place new classes and find them easily.
The second method will be harder sometime, because some classes can be classified in several packages.

A: To a great extent, it's a matter of taste.  As to some criteria , like with other kinds of encapsulation,  the following can be applied :

*

*Loose coupling

*Tight cohesion
In other words, avoid unnecessary dependencies among unrelated parts and group together what belongs together.
Think of your packages potentially reused in another application or another type of build: phone/tablet, Google / Amazon.  Or, contrary,  ones too specific to a particular case to be ever reused.
That or other  kind of reasoning will help you structure your code based on some needs rather than an arbitrary choice.
Edit: An anecdotal analogy.  Recommendations on arranging files into folders, AFAIK, from Microsoft once explaining their "object oriented" UX.  One way: have folders like Word Documents, Excel Spreadsheets, etc.  And the other like Business, Entertainment, etc.  Same approach applies to any packaging.

redpajama_set_name: RedPajamaStackExchange


text:
Introduction to History's Greatest Deceptions and Confidence Scams
The term "scam" is really a new word in the English lexicon and has come to supersede its older and more distinguished original cousin, "the confidence game" or "con game", as it became popularly known at the time. One constant in human history is the tendency to want to shorten and simplify some of the most descriptive concepts we have, to anything that can be mumbled as a single syllable mouthful.
Throughout history, there have always been fraudsters and tricksters ready and willing to part people from their money with smooth talking and tall tales, but the first formally recorded "confidence trick" was uniquely American in its origins and set the bar for both simplicity and sheer guts, both hallmarks of the most successful frauds ever perpetrated.
In the late 1840's the east coast of the United States was awash with the nouveau riche, and men wearing top hats to look important. Good manners and polite society were everything unless you were a slave in which case the top hat was entirely optional. It was the age of Jane Austen, white gloves, carriages and over-the-top manners. It was also the time of pocket watches, dangling from gold chains. Victorian sensibilities dictated that the bigger and shinier the watch, the bigger and shinier the man.
Enter one William Thompson, arguably the originator of the term "confidence man", a genius operator and a personal hero to the career grifter. Little is known about where he came from, but what is certain is that he had his finger on the pulse of well-heeled suckers strolling the walkways and avenues of Manhattan in the mid-nineteenth century.
Meeting someone was a rigid, formal affair with protocol and procedures; the handshake, tip of the hat and bow were rigidly choreographed. Failure to introduce oneself properly or be introduced according to accepted custom was seen as an embarrassment to both parties – and embarrassment was worse than a bleeding head wound, to be avoided at all costs. Operating in New York in the 1840s, William was a keen observer of human behaviour. He realized that, with such pomp and ceremony surrounding every introduction, it was considered the ultimate in bad manners not to remember people that one might have been acquainted with – he calculated that when confronted with a stranger that said he was a friend, most men would likely act as though they remembered a meeting that had never happened.
William thought he might be able to leverage this, and so would often stroll along the city streets, until he spotted an upper-class sucker, at which time he would approach and pretend to know them and be a past acquaintance, someone that they had met before. Rather than be embarrassed, the mark would usually smile, nod and pretend that he knew who William was – better that than risk dishonour, or a pistol duel – which was how some matters of honour were settled at the time.
After some friendly chatting, and a little trust-gaining, Thompson would throw out his hook, asking "Have you confidence in me to trust me with your watch until tomorrow?" He wasn't all about watches – sometimes he would ask for money. It's good to diversify. More often than not, the mark would part with the watch or the money (or sometimes both) and William would depart, promising to meet the next day to return the property. Naturally, he didn't keep the next day's appointment and would often stroll away, laughing to himself.
He repeated this game dozens of times until he had the bad luck to happen across a former victim, who promptly summoned a roving policeman who gave chase. After a frantic foot pursuit through Manhattan and a dramatic struggle, William was bodily subdued and arrested. Perhaps he was slowed down by the weight of all those pocket watches; it was reported that he had several on him at the time he was caught.
His arrest and the subsequent article in the New York Herald called "Arrest of the Confidence Man" made headlines across the country; he was headed to trial in 1849. The press noted his specific appeals to victims' "confidence" and thereafter he was known in the press as "The Confidence Man". And so the term was born, and "confidence game" or "con" became part of our vocabulary, and spawned an endless series of quick-buck fraudster copycats that said, "me too"!
This is the story of some of the greatest.
Get your copy here http://bit.ly/2Qj0mVv
Mark Rodger and Steven Lazaroff live in Canada.
lifelong friends and amateur historians, they enjoy discussing matters of historical importance


text:
Not known Facts About Bitcoin Games Online
Home / Not known Facts About Bitcoin Games Online
By roberto February 4, 2021
in 2003 and also keeps in mind all the inconveniences. "You had to go via these systematized processors that would always bend to the will of the government, giving online poker websites a difficult time." A peer-to-peer money that was immune to federal government and also company censorship, one like bitcoin for instance, could have transformed everything about, had it just been all set.
The idea allowed. But the network running it was composed of a handful of highly technological computer fanatics who were done in touch with each various other over email. It was not the bitcoin we understand today. "Bitcoin ought to have come one decade previously," laments Lee. As bitcoin grew, the relations in between the poker industry and also regulators only got worse.
But on April 15, 2011, a day that has actually dropped in the background books as Black Friday, the government little bit back. Sam Feinberg is the founder of a blockchain and cryptocurrency endeavor fund in Los Angeles called Cypher Capital. But in 2011, he was growing as a professional texas hold'em player, enough to ensure that he had actually strolled away from a promising job at Morgan Stanley to seek poker full-time.
Eat breakfast, study up a little, after that visit to play. Yet instead he was flooded by messages from his casino poker close friends. Every person was entirely flipping out telling him to get on-line instantly. When Feinberg drew up the site for Full Tilt casino poker, which by now was the greatest on the planet, up stood out a message from the FBI.
Then, an additional. The domains of all three of the major on the internet poker sites operating in the U.S. had actually been taken as well as their operations stopped, pending examination. In the scorched marsh left behind after Black Friday, an internet site with a really odd name blinked into existence: SealsWithClubs. "It most likely took a good three days for it to resolve in what had actually really occurred," Feinberg says.
Best Crypto Casino Can Be Fun For Everyone
They were additionally where he saved all his jackpots and also together they held about 80 percent of Feinberg's wide range. When the FBI ended, all that cash went away right into a regulatory limbo. It would be years prior to Feinberg would certainly see it once more. "I was one of the lucky ones," he remembers, explaining that a number of his pals lost definitely whatever.
" I was privileged enough to have some truly wonderful close friends in the poker neighborhood, really solid players, as well as a great deal of us simply transitioned to live online poker," he claims. casino satoshi. Other players I spoke to for this piece handled to maintain playing on-line either by connecting to off-shore websites with a VPN or by taking the extreme step of relocating to countries where betting is lawful.
In the scorched wasteland left after Black Friday, a web site with a really unusual name blinked into presence: SealsWithClubs. It was a bare bones poker place as well as had really couple of players initially. But it had one huge point going all out. The website performed all deposits as well as cash-outs in a brand-new electronic currency called bitcoin.
Gox as well as BitInstant (though both those service have actually because risen in fires). Ed Moncada, who was after that playing texas hold'em professionally, bears in mind discovering SealsWithClubs in 2013 on the Facebook page of Bryan Micon, an additional professional player. Micon, it ended up, worked on the project (today he declares he was only accountable of marketing).
Though he wasn't thrilled with the degree of play on the website, which he calls "godawful," as a resident of California, it was excellent sufficient that he might play. Yet the miracle minute came when Moncada went to squander. "At the time, this wasn't real cash to me. It resembled, oh these are just symbols," says Moncada.
Top Guidelines Of Btc Poker Sites
As well as all of an abrupt, that's when the light bulb went off. I resembled, what did I just touch?" The implications for the poker market were immediately clear to him. "I would certainly seen exactly how the UNITED STATE federal government has actually made it so tough for money to move in and out of wagering siteswhen that struck my Chase account in 48 hoursthat was when I started checking out about bitcoin." Moncada would certainly learn that bitcoin worked for avoiding all sort of financial guidelines.
Various other grey markets in porn and also drugs were using it to process transactions. Wikileaks was utilizing it to generate donations, regardless of a corporate-led boycott on the company. Bitcoin might provide these services since it was relatively difficult to close it down. Yet, the sites that utilized it were still prone, as soon became clear.
The original SealsWithClubs web site was confiscated and closed down following costs that Micon was running it without the proper state licenses. Micon, that was advised by his legal representative not to comment for this article, now stays in Antigua in the Caribbean as well as is still heavily included in the cryptocurrency scene.
It took less than a month after the police raid for a reboot of the casino poker site to appear online. Today there's no scarcity of bitcoin and online poker sites, particularly among those abandoners that are still marketing solutions to U.S – cryptocurrency casino no deposit bonus. clients. There are also a handful of sites where gamers can make deposits as well as redemptions in cryptocurrencies like Ether as well as Litecoin.
But various other equally serious problems have been left on the floor. Cryptocurrencies have given a lifeline to live poker gamers over the years as well. Moncada, that now runs a cryptocurrency portfolio tracking app called BlockFolio (together with 7 other ex-pro texas hold'em gamers on his group), discusses that a great deal of poker pros, who normally travel to competitions with large sums of cash money, usage cryptocurrencies when they are going across nationwide boundaries.


text:
Return Man 3: you have to receive the ball and run through the whole field. it becomes more and more harder to reach the finish. Play the free online game
return man playing skills
Be the unsung hero and return the ball all the way back to the end zone in this sports-themed arcade game – Return Man! Avoid the defenders at all costs and show your dedication to the sports!
Created by ESPN arcade, Return Man is a skill-based avoid-type arcade game based on the American Football sports. In this game, you will take control of the return man and your goal is to run the ball all the way back to the end zone. However, your task is not going to be easy as a lot of enemy defenders will try to tackle you down! Make it around the defenders using your team mates. Watch out for the kicker for he will slow you down. The game return man ends if you lose 3 balls!
Return Man 2 Return Man Play Return Man 3 Return Man 3 Game Return Man 3 Online
Return Man 3 發表在 痞客邦 留言(0) 人氣()
個人分類:Return Man on the phone
The new point of return man 3
Following game Return man 3 is final in return man game series, It was released back in 2013 and since that tons of players started to play it, game is created by ESPN and it is all about American football. Except this game ESPN releases different sport games quite often, I believe they even have special arcade site where people can enjoy all different games.
個人分類:Play Return Man
Tips play Return Man 3 efficiency
Return man is controlled with the I (Forward movements ), J ( Left movements), L (Right movements) and K ( Back movements).
You can also use the arrow key to control the return man. You are capable of changing these controls to W, A, S, D in the settings menu.
The stages in the game Return Man 3
ESPN Return Man 3 is one of the best flash games developed by ESPN that focuses on playing the American football, where you have to run the length of the field and touch down without being tackled in order to win. It is the best game you will ever play with lots of action and entertainment.
個人分類:Return Man 3 Online
Return Man Apk
Sports games like Return Man and sports head basketball are video games that simulate the practice of playing actual sports. Many fun online sports gameshave been recreated to feel like the real sport. These include team sports, like soccer games, basketball, football, track and field, extreme sports, wrestling games and other combat sports.
Return moving south on the soccer field
Return Man 3 Game is very interesting and fun return man football game. People of all ages enjoy this football Return Man 3 Game. The Return Man 3 unblocked game is very fun and easy to play. You have to receive the ball and run through the whole field to reach the finish line with the ball in your hands. If you make it then you win the round! If the huge defenders manage to pull you down, you lose. The Return Man game has very good graphics and player movements.
Return Man 3 - American Football game
For the fans of American football, we have an interesting online game Return Man 3. Your role can be defined in one word - a touchdown. For the less savvy, your job will be to get the ball, avoid opponents and get to the end of the field.
Return Man 3 beautiful graphics
Return man American football game is always attracted many plays worldwide. Not only attractive style of play, with beautiful graphics, rich sound has also contributed to the attractiveness of the game.
I also want to mention how great the game sound effects while playing you will experience as if you were in the stadium, all the little details, the sound travels, the sound of the crowd shouting the names of their favorite team, the sound of the whistle, so they add a special atmosphere of the game which is really great.
Return false rules of the game
American Football Fan Come Over Here - Return Man 3 touchdown scoring a job seems easy at first, but had to wait until you reach the higher levels of the game, that's when the fun begins. First of all there is a lot of defense units of the opposing team, the second they are faster and they perform various special moves, it is most likely that you will lose the game at higher levels a few times before you learn how to deal with specific situations. Sometimes you will have to let his teammates clearly for you, sometimes you will have to dodge the attacks on themselves and sometimes you just need to push forward and run as if your life sub attached to it, anyway to make sure that you change your strategy regularly, if one tactic does not work try another.
Download Return Man 3
You can play Return Man 3: Mud Bow free online sports games at fogames. It has tags: Sports,american football,. It has 1140 total plays and has been rated 88.8% (21 like and 0 dislike), find the fun and happy day. If you want to play more sports games, we find some of the game: The Return, Return to Earth, Soccer Balls and Pirate: The Treasures Return. To play other games, go to the sports games page, the american football games page, or just check out the new games or best games page.
Return Man on the phone (3)
Return Man 3 Online (8)
Play Return Man (8)
文章精選 2017 一月 (4) 2016 十二月 (7) 2016 十一月 (2) 2016 十月 (3) 2016 九月 (3)


text:
Science denialism: The problem that just won't go away
Copyright Callan Bentley, 2013
Editor's Note: Traditionally, EARTH has published a "highlights" or "year in review" issue at the end of the year. This year, we decided to try a new approach: We asked our staff and some frequent contributors to write a short commentary on something that grabbed their attention in 2013. We gave everyone carte blanche. What follows is a collection of extremely varied, often very personal insights into how the planet impacted each individual. You can find some online this month, but for the full grouping, you'll have to buy the issue here or subscribe.
We have just finished a year of tremendous scientific achievement. Human organs can be 3-D printed, exoplanets were spotted by the score, robot geologists roam the surface of Mars, and the cells of an extinct frog were brought back to life. We are living in a golden age of insight and technology. Science is changing our perceptions of the natural world and allowing us to do things of which our ancestors could only dream. As a means of sorting the real from the unreal, nothing beats science. Yet the science-deniers persist: It seems they just don't like reality.
I gave a talk recently at a Road Scholars event, a learning experience intended to be intellectually stimulating for senior citizens. I spoke about the "Snowball Earth" hypothesis, an idea that ties together geology, chemistry, climate and the evolution of life into a single compelling story.
Afterward, one man asked what lessons the snowball episodes have to teach us about the current episode of climate change. I answered that it appears that the cold conditions of the snowballs were due to a global carbon dioxide drawdown, and that the current warming is clearly associated with a carbon dioxide buildup. When the carbon cycle gets perturbed, geophysics compels us to expect a change in the heat budget of the planet.
Among my audience were several vocal opponents of the notion that people have been responsible for much of this buildup. And although I spelled out the chain of evidence and asked them to pick out what they felt were the weak links, they were unwilling to accept the answer at the chain's end. They had already embraced an alternate conclusion.
Another person asked about the origins of life. While science explains a few things about the self-organization of chemical components and the spontaneous rise of complexity, I told her, we still don't know exactly how life began. Like the Snowball Earth, it's an area of active research. Afterward, a second woman came up, dismayed by my answer. She wanted to quiz me about "how people could come from frogs." Unsatisfied with my response, she asserted that the Bible was the inerrant word of God and evolution was invalid. She threw up her hands when I pointed out that from a scientific standpoint, biblical stories were in much the same class as Greek mythology or the oral traditions of the Australian Aboriginal dreamtime — ontological stories with no supporting evidence. Their ideas are not disproved by science, but they're certainly extraneous to it. Disgusted, she dismissed me by saying, "I'll be praying for you!"
At the college where I teach, I also routinely encounter students who hold nonscientific worldviews. Those who believe evolution to be false are also quite likely to dismiss humanity's role in changing the global climate, which is part of the reason that the National Center for Science Education, which previously focused mainly on fighting anti-evolution movements, has now also turned its attention to climate change deniers. In both cases, the lack of empirical validation is seen as irrelevant; the conclusion is the cherished thing.
In a recent class, I contrasted catastrophism with uniformitarianism, and noted how science had repeatedly shown religious claims to be untrue: an Earth-centered universe, a global flood, a young Earth, for example. Afterward, a student remained: "I guess it just comes down to faith," she said. "There's a reason they call it faith." In other words, the conclusion is sacrosanct; logic be damned.
Could there be a less compelling argument? Should juries convict people for murder if the prosecuting attorneys said they have faith that the accused were guilty?
Often in our culture, science is rendered disposable if it stomps on a cherished claim; faith trumps reality. This attitude is internally inconsistent: Atomic theory is OK when we use it to X-ray our teeth or build a nuclear power station, but invalid when it comes to assessing the age of the planet. Evolutionary insight is OK when it guides the production of our annual flu shot, but deniers refuse to let it tell them from whence they came. Science is the way forward, but not for people who don't want to go forward.
This year, science has given us new, more precise temperature reconstructions that show unprecedented warming in the past 150 years, and fossils of the oldest-known ape, evidence that confirms molecular estimates of our ancestors' evolutionary split from monkeys about 25 million years ago. The more science examines climate change or evolution, the more solid each idea becomes. Our origins and the repercussions of our acts are important issues. Humanity asks, "What are we doing here? And what are we going to do about it?" Science can aid us in answering these questions — but will we let it?
Callan Bentley
Bentley is a geology professor at Northern Virginia Community College, an avid geo-blogger, a frequent EARTH contributor (both writing and drawing cartoons) and has been known to take on the anti-evolution movement. The views expressed are his own.
Check out our other commentaries too: a personal reflection on the Boulder, Colo., floods; a call to spread geologic literacy by "annoying" your non-geo friends with geologic facts; an essay on how witnessing a rockfall made the author think about geologic time (coming Thursday); and a commentary drawing parallels between the geosciences and zombies (coming Friday).
science denialism
geobloggers
geoblogosphere


text:
Wednesday 7th August
HEADTRIP ACOUSTIC PROJECT
https://www.facebook.com/itsbadforyou
https://www.instagram.com/intelligencec
https://www.twitter.com/CounterIntell14
Counter Intelligence is an Irish / Italian 4 piece Band pioneering the genre Transversal Rock. We met in Dublin, Ireland in 2017 and started rehearsing straight away with a view to recording our first Album. So the first year was spent writing and rehearsing all the songs for the Album, and the next year we spent recording it ourselves with our own equipment in various rehearsal rooms and houses around Dublin. It took a while because we all work day jobs (apart from Zar who is our Full-Time Musician). We met at least once a week and now our debut album "Adapt and Evolve" is finally available in all the major stores.
Major – Lead Vocals
Zar – Guitar & Backing Vox
Ghost – Bass & Backing Vox
Mountain – Drums & Backing Vox
https://www.facebook.com/HeadtripAcousticProject
https://www.instagram.com/headtripacousticproject
https://www.youtube.com/channel/UCdy9d2y0KbOMvfSUW4QF0DQ
Headtrip Acoustic Project is a trio of two acoustic guitars, one cajon and various percussive elements.
Spawned out of busking in the streets of Dublin. It all started when guitarist and vocalist Alessandro Zangrando (aka Zar) and guitarist Giovanni Agostini met for the first time while busking in the streets of Dublin. The two guitar enthusiasts had a natural curiosity to discover what could happen if they mixed their main styles; Lap Tapping & Fingerstyle. As a result of this, the first time they organized a jam session together, they spontaneously composed their first song, which they titled 'The Rising'. They kept rehearsing to both arrange covers in a very unique way and compose original music fusing their different styles. It wasn't until April 2017 that percussionist Niccolò Matterazzo (aka Nik Martken) joined in during an experiment they did in Gorey, co. Wexford, where they went to see guitarist Shane Hennessy play a concert. The trio set up in the main street of the town and eloquently without having ever rehearsed as a trio started playing and improvising songs on the spot, it was then they realized there was a strong musical connection among them and the mix of two acoustic guitars plus one Cajon and small percussive elements met to create a unique atmospheric musical experience. Since then they've kept working hard on composing original music, busking, playing gigs and releasing their first EP of 5 songs called 'The Rising'.
€5 on the door


text:
Wolves Change the rivers
by Highervibrations1 | Dec 31, 2021 | Articles, Law and Current Events | 0 comments
Ecosystems need large predators, like the wolf and whale, to survive and thrive. Here are two videos that demonstrate this balance nature affords. Nature is in balance, naturally. Man has upset this balance. We must restore this balance for our survival. The planet will survive with or without us. Please join me in signing the Change.org petition (link below videos).
I just signed the petition, "Washington state Fish and Wildlife Director Jim Unsworth: Stop the killing of an endangered wolf pack in Washington."
I think this is important. Will you sign it too?
How Wolves Change Rivers
When wolves were reintroduced to Yellowstone National Park in the United States after being absent nearly 70 years, the most remarkable "trophic cascade" occurred. What is a trophic cascade and how exactly do wolves change rivers? George Monbiot explains.
TRANSCRIPT: One of the most exciting scientific findings of the past half-century has been the discovery of widespread trophic cascades. A trophic cascade is an ecological process that starts at the top of the food chain and tumbles all the way down to the bottom. And the classic example is what happened in the Yellowstone National Park in the United States when wolves were reintroduced in 1995. Now, we – we all know that wolves kill various species of animals, but perhaps we're slightly less aware that they give life to many others. Before the wolves turned up – they'd been absent for 70 years – the numbers of deer (because there had been nothing to hunt them) had built up and built up in the Yellowstone Park and despite efforts by humans to control them they'd managed to reduce much the vegetation there to almost nothing. They had just grazed it away. But as soon as the wolves arrived, even though they were few in number they started to have the most remarkable effects. First, of course, they killed some of the deer but that wasn't the major thing. Much more significantly, they radically changed the behavior of the deer. The deer started avoiding certain parts of the park – the places where they could be trapped most easily – particularly the valleys and the gorges and immediately those places started to regenerate. In some areas, the height of the trees quintupled in just six years. Bare valley sides quickly became forests of aspen and willow and cottonwood. And as soon as that happened, the birds started moving in. The number of songbirds and migratory birds started to increase greatly. The number of beavers started to increase because beavers like to eat the trees. And beavers, like wolves, are ecosystem engineers. They create niches for other species. And the dams they built in the rivers provided habitats for otters and muskrats and ducks and fish and reptiles and amphibians. The wolves killed coyotes and as a result of that, the number of rabbits and mice began to rise which meant more hawks more weasels more foxes more badgers. Ravens and bald eagles came down to feed on the carrion that the wolves had left. Bears fed on it, too. And their population began to rise as well partly also because there were more berries growing on the regenerating shrubs. And the bears reinforced the impact of the wolves by killing some of the calves of the deer. But here's where it gets really interesting. The wolves changed the behavior of the rivers. They began to meander less. There was less erosion. The channels narrowed. More pools formed. More riffle sections. All of which were great for wildlife habitats. The rivers changed in response to the wolves. And the reason was that the regenerating forests stabilized the banks so that they collapsed less often. So the rivers became more fixed in their course. Similarly, by driving the deer out of some places, and the vegetation recovering on the valley side, there was less soil erosion because the vegetation stabilized that as well. So the wolves, small in number, transformed not just the ecosystem of the Yellowstone National Park – This huge area of land… but also, its physical geography.
How Whales Change Climate
TRANSCRIPT: One of the most exciting scientific findings of the past half-century has been the discovery of widespread trophic cascades. Atrophic cascade is an ecological process that starts at the top of the food chain and tumbles all the way down to the bottom. We all know that whales eat fish and krill and some people have argued that killing whales is good for human beings as it boosts the food available for us to eat – and so you would think. But as the great whales declined so did the numbers of fish and krill. It seems counterintuitive – surely their numbers would rise as their major predators disappeared – but it now turns out that whales not only eat these animals they also keep them alive. In fact, they help to sustain the entire living system of the ocean. Whales feed a depth in waters that are often pitch dark and then they return to the surface to the photic zone where there's enough light for photosynthesis to happen. There they release what biologists call fecal plumes – vast outpourings of poo – poonamis. These plumes are rich in iron and nitrogen – nutrients that are often very scarce in the surface waters and these nutrients fertilize plant plankton that lives in the only place where plants can survive – the photic zone. Fertilizing the surface waters isn't the only thing the whales do. By plunging up and down through the water column, they also keep kicking the plankton back up into the photic zone giving it more time to reproduce before it sinks into the abyss. Even today, the whale populations have been greatly reduced, the vertical mixing of water caused by movements of animals up and down through the column of the oceans is astonishingly roughly the same as the amount of mixing caused by all the world's wind and waves and tides. More plant plankton means more animal plankton on which larger creatures then feed. In other words, more whales mean more fish and krill. But the story doesn't end here because plant plankton not only feeds the animals of the sea, it also absorbs carbon dioxide from the atmosphere. When eventually it sinks to the ocean floor, it takes this carbon out of circulation down to a place where it remains for thousands of years. The more whales there are, the more plankton there is. The more plankton there is the more carbon is drawn out of the air. When whales were at their historic populations, before great numbers of them were killed, it seems that they might have been responsible for removing tens of millions of tons of carbon from the atmosphere every year. Whales change the climate. The return of the great whales if they're allowed to recover could be seen as a benign form of geoengineering. It could undo some of the damage we've done both to the living systems of the sea and to the atmosphere.
Meet Barry Holstun Lopez


, picks the best libraries together with best image resolution only for you all, and now this pictures is usually among photos choices in your greatest graphics gallery concerning What is A Good Summary for A Customer Service Resume. I'm hoping you can enjoy it.
placed by keepupdated at 2018-07-12 05:48:45. To see all graphics throughout What is A Good Summary for A Customer Service Resume pictures gallery you should comply with that link.
Always remembers to follow the next photo album, which also contains the What Is A Good Summary For A Customer Service Resume With Customer Service Resume Summary New Example Customer Service Resume picture showed above. If you have any thoughts, questions or just want to say hello to other people, please do not hestitate to submit your opinion/ideas via the following comment form.


Waters ticked off a list of Trump transgressions against the LGBTQ community: a ban on transgender service members in the military, proposed budget cuts to programs supporting people living with HIV, and a rather terrifying proposition that Title VII does not include the LGBTQ community. "Well, what do I think about all of this?" she said to roaring applause as she removed her glasses and made a face that left no doubt how she felt about Trump's policies.
With Rep. Waters holding court on the West Coast, President Donald Trump was busy mocking her at his "am I just great or what speech" speech in Pennsylvania Saturday night.
Once again, Trump mocked Waters, saying she had a "very low IQ". Waters has become the source of Trump's incessant ridicule. In early March, Trump proposed at the annual Gridiron Club dinner that the Congresswoman take an IQ test.