<?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>Vexed Logic!?</title>
	<atom:link href="https://vexedlogic.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://vexedlogic.com</link>
	<description>Software Engineering and Life by Austin Rasmussen</description>
	<lastBuildDate>Fri, 02 Oct 2026 13:31:10 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.10</generator>

<image>
	<url>https://vexedlogic.com/wp-content/uploads/2026/10/cropped-VXLfav-1-32x32.png</url>
	<title>Vexed Logic!?</title>
	<link>https://vexedlogic.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Your OpenTelemetry Spans Aren&#8217;t Lost. Your Caller Told You Not to Record Them</title>
		<link>https://vexedlogic.com/2026/10/02/your-opentelemetry-spans-arent-lost-your-caller-told-you-not-to-record-them/</link>
					<comments>https://vexedlogic.com/2026/10/02/your-opentelemetry-spans-arent-lost-your-caller-told-you-not-to-record-them/#respond</comments>
		
		<dc:creator><![CDATA[Austin Rasmussen]]></dc:creator>
		<pubDate>Fri, 02 Oct 2026 13:14:22 +0000</pubDate>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[.net]]></category>
		<guid isPermaLink="false">https://vexedlogic.com/?p=650</guid>

					<description><![CDATA[<p>Our API has OpenTelemetry tracing enabled. Requests sent directly using curl show up in the APM backend as expected. However, requests originating from two internal callers never generated spans, despite returning 200 OK and writing logs with trace IDs attached. The issue was not the OTLP exporter, the collector, or network routing. The API received [&#8230;]</p>
<p>The post <a href="https://vexedlogic.com/2026/10/02/your-opentelemetry-spans-arent-lost-your-caller-told-you-not-to-record-them/">Your OpenTelemetry Spans Aren’t Lost. Your Caller Told You Not to Record Them</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></description>
										<content:encoded><![CDATA[<h1 class="wp-block-heading"></h1>



<p>Our API has OpenTelemetry tracing enabled. Requests sent directly using <code>curl</code> show up in the APM backend as expected. However, requests originating from two internal callers never generated spans, despite returning 200 OK and writing logs with trace IDs attached.</p>



<p>The issue was not the OTLP exporter, the collector, or network routing. The API received incoming W3C <code>traceparent</code> headers with the sampled flag set to <code>00</code>. OpenTelemetry’s default sampler followed the specification and did not record. One caller received the <code>00</code> flag from a third-party proxy. The other had no tracing packages or configuration installed, but generated and forwarded <code>00</code> through default .NET runtime behavior.</p>



<p>Below is why .NET emits these headers by default, how the OpenTelemetry sampler handles them, and how to configure the receiving service to record the spans.</p>



<span id="more-650"></span>



<h2 class="wp-block-heading">The Symptom</h2>



<p>The API is an ASP.NET Core service on .NET 10. It registers the OpenTelemetry .NET SDK with instrumentation for ASP.NET Core, <code>HttpClient</code>, SQL, and the AWS SDK, exporting via OTLP to a shared collector. A filter drops health probes on <code>/</code> and <code>/favicon.ico</code>. No other endpoints are filtered, and no custom sampler was configured.</p>



<p>Two callers produced no spans:</p>



<ol start="1" class="wp-block-list">
<li>A Lambda-hosted .NET API behind a vendor&#8217;s proxy (Envoy with Datadog tracing).</li>



<li>A .NET backend-for-frontend (BFF) for a single-page app with no OpenTelemetry packages and no tracing configuration.</li>
</ol>



<p>Calls from both returned 200, and application logs reached the collector with trace IDs attached. Their spans never appeared in the APM backend.</p>



<h2 class="wp-block-heading">The <code>traceparent</code> Header Format</h2>



<p>The W3C Trace Context specification defines the <code>traceparent</code> header as four fields separated by hyphens:</p>



<figure class="wp-block-image size-full"><a href="https://vexedlogic.com/wp-content/uploads/2026/10/traceparent.png"><img fetchpriority="high" decoding="async" width="598" height="191" src="https://vexedlogic.com/wp-content/uploads/2026/10/traceparent.png" alt="" class="wp-image-657" srcset="https://vexedlogic.com/wp-content/uploads/2026/10/traceparent.png 598w, https://vexedlogic.com/wp-content/uploads/2026/10/traceparent-300x96.png 300w" sizes="(max-width: 598px) 100vw, 598px" /></a></figure>



<ul class="wp-block-list">
<li><strong><code>trace-id</code> (32 hex characters):</strong> The distributed trace ID across all services.</li>



<li><strong><code>parent-id</code> (16 hex characters):</strong> The caller&#8217;s outgoing span ID.</li>



<li><strong><code>trace-flags</code> (8-bit byte):</strong> Bit 0 controls recording. <code>01</code> means sampled; <code>00</code> means not sampled.</li>
</ul>



<p><a target="_blank" rel="noreferrer noopener" href="https://www.w3.org/TR/trace-context/#sampled-flag">Section 3.2.2.5.1 of the W3C spec</a></p>



<p>states:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>&#8220;If a component needs to make a recording decision &#8211; it SHOULD respect the <code>sampled</code> flag value.&#8221;</em></p>
</blockquote>



<p>And when a component starts a trace:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>&#8220;It should be set to <code>0</code> as the default option when the trace is initiated by this component.&#8221;</em></p>
</blockquote>



<p>When these two rules run across uninstrumented and instrumented services, downstream spans are dropped.</p>



<h2 class="wp-block-heading">Testing the Flag with curl</h2>



<p>Sending two requests with different flags isolates the behavior:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
# Sampled flag (01)
curl -H &quot;traceparent: 00-11111111111111111111111111111111-1111111111111111-01&quot; \ 
  https://$API_URL/Version

# Unsampled flag (00)
curl -H &quot;traceparent: 00-33333333333333333333333333333333-3333333333333333-00&quot; \
  https://$API_URL/Version
</pre></div>


<p>Searching the APM backend for <code>11111111111111111111111111111111</code> returns the full trace. Searching for <code>33333333333333333333333333333333</code> returns nothing. The API drops spans on intake whenever the inbound flag is <code>00</code>.</p>



<h2 class="wp-block-heading">Logging Inbound Headers</h2>



<p>To inspect what callers were sending, we added temporary middleware directly after <code>builder.Build()</code>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: csharp; title: ; notranslate">
app.Use(async (context, next) =&gt;
{
    if (context.Request.Path != &quot;/&quot;)
    {
        var activity = System.Diagnostics.Activity.Current;
        app.Logger.LogInformation(
            &quot;TraceContextDiagnostic: Path={Path} TraceparentHeader={TraceparentHeader} TracestateHeader={TracestateHeader} ActivityId={ActivityId} TraceFlags={TraceFlags} Recorded={Recorded} IsAllDataRequested={IsAllDataRequested}&quot;,
            context.Request.Path.Value,
            context.Request.Headers.TryGetValue(&quot;traceparent&quot;, out var tp) ? tp.ToString() : &quot;(none)&quot;,
            context.Request.Headers.TryGetValue(&quot;tracestate&quot;, out var ts) ? ts.ToString() : &quot;(none)&quot;,
            activity?.Id ?? &quot;(none)&quot;,
            activity?.ActivityTraceFlags.ToString() ?? &quot;(none)&quot;,
            activity?.Recorded,
            activity?.IsAllDataRequested);
    }
    await next(context);
});

</pre></div>


<p>Because application logs export independently of tracing spans, this captures the inbound headers for dropped requests.</p>



<h3 class="wp-block-heading">Caller 1: Behind the Vendor Proxy</h3>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
TraceparentHeader=00-000000000000000026a47f86228f14d9-17ccb071fcbd6cf5-00
TracestateHeader=dd=s:0;p:11096c07fe427b98;t.dm:-1
TraceFlags=None Recorded=False IsAllDataRequested=False

</pre></div>


<p>The top 64 bits of the trace ID are zeroed out (Datadog&#8217;s 64-bit ID format padded to 128 bits). The <code>tracestate</code> entry <code>dd=s:0</code> is Datadog sampling priority 0 (drop), set by the proxy&#8217;s rate sampler (<code>t.dm:-1</code>). The vendor proxy sampled the request out, the Lambda forwarded the header, and our API honored the <code>00</code>.</p>



<h3 class="wp-block-heading">Caller 2: The Uninstrumented BFF</h3>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
TraceparentHeader=00-79fc7beef2bee9b144fbb8b518fa91ed-14872f7fa3a82616-00
TracestateHeader=(none)
ActivityId=00-79fc7beef2bee9b144fbb8b518fa91ed-154cfc718e60171f-00
TraceFlags=None Recorded=False IsAllDataRequested=False

</pre></div>


<p>The trace ID is fully random across all 128 bits, which matches .NET&#8217;s <code>ActivityTraceId.CreateRandom()</code>. There is no <code>tracestate</code>. The BFF has no tracing packages installed, but the runtime generated and forwarded an unsampled W3C header anyway.</p>



<h2 class="wp-block-heading">Why OpenTelemetry Drops the Trace</h2>



<p>The OpenTelemetry SDK default sampler is <code>ParentBased(root=AlwaysOn)</code>:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Parent State</strong></td><td><strong>Default Delegate</strong></td></tr></thead><tbody><tr><td>None (root)</td><td><code>AlwaysOn</code></td></tr><tr><td>Remote, sampled (<code>01</code>)</td><td><code>AlwaysOn</code></td></tr><tr><td>Remote, not sampled (<code>00</code>)</td><td><code>AlwaysOff</code></td></tr><tr><td>Local, sampled (<code>01</code>)</td><td><code>AlwaysOn</code></td></tr><tr><td>Local, not sampled (<code>00</code>)</td><td><code>AlwaysOff</code></td></tr></tbody></table></figure>



<p>A remote parent with flag <code>00</code> triggers <code>AlwaysOff</code>. The SDK creates an <code>Activity</code> so distributed context propagates downstream, but sets <code>Recorded=False</code> and <code>IsAllDataRequested=False</code>. The exporter ignores it.</p>



<h2 class="wp-block-heading">Why Plain .NET Sends <code>00</code> Without Tracing Configured</h2>



<p>Four runtime defaults combine to produce this:</p>



<h3 class="wp-block-heading">1. ASP.NET Core creates an <code>Activity</code> when logging is enabled</h3>



<p>In <code>HostingApplicationDiagnostics.BeginRequest</code>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
var loggingEnabled = _logger.IsEnabled(LogLevel.Critical);
if (ActivityCreator.IsActivityCreated(_activitySource, loggingEnabled || diagnosticListenerActivityCreationEnabled))
</pre></div>


<p>And <code>ActivityCreator.IsActivityCreated</code> evaluates:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
return activitySource.HasListeners() || diagnosticsOrLoggingEnabled;
</pre></div>


<p>Because <code>LogLevel.Critical</code> is enabled in almost every app, ASP.NET Core creates an <code>Activity</code> for incoming requests even without an <code>ActivityListener</code>. This is why logs contain <code>TraceId</code> and <code>SpanId</code> in applications that do not use OpenTelemetry.</p>



<h3 class="wp-block-heading">2. The ID format defaults to W3C</h3>



<p><code>Activity.Start()</code> falls back to <code>DefaultIdFormat</code>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
#if W3C_DEFAULT_ID_FORMAT
    s_defaultIdFormat = LocalAppContextSwitches.DefaultActivityIdFormatIsHierarchial ? ActivityIdFormat.Hierarchical : ActivityIdFormat.W3C;
#else
    s_defaultIdFormat = ActivityIdFormat.Hierarchical;
#endif

</pre></div>


<p><code>DiagnosticSource.csproj</code> sets <code>W3C_DEFAULT_ID_FORMAT</code> for all modern .NET targets.</p>



<h3 class="wp-block-heading">3. Trace flags remain zero</h3>



<p>Flags are stored in a byte field defaulting to zero (<code>ActivityTraceFlags.None</code>):</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
private byte _w3CIdFlags;

</pre></div>


<p>With no inbound header, <code>_w3CIdFlags</code> stays <code>0</code>. Without an <code>ActivityListener</code> callback returning <code>AllDataAndRecorded</code>, the flag stays unset. When serialized, <code>Activity.Id</code> renders as:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
00-(traceId)-(spanId)-00

</pre></div>


<h3 class="wp-block-heading">4. <code>HttpClient</code> propagates the <code>Activity</code> automatically</h3>



<p><code>SocketsHttpHandler</code> wraps calls in a <code>DiagnosticsHandler</code>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: csharp; title: ; notranslate">
&#x5B;FeatureSwitchDefinition(&quot;System.Net.Http.EnableActivityPropagation&quot;)]
public static bool EnableActivityPropagation { get; } = RuntimeSettingParser.QueryRuntimeSettingSwitch(
    &quot;System.Net.Http.EnableActivityPropagation&quot;,
    &quot;DOTNET_SYSTEM_NET_HTTP_ENABLEACTIVITYPROPAGATION&quot;,
    true);

</pre></div>


<p>This switch defaults to <code>true</code>. <code>DiagnosticsHandler</code> creates a child <code>Activity</code>, inherits the <code>None</code> flags, and writes the <code>traceparent</code> header to outgoing HTTP requests.</p>



<p><strong>The call chain:</strong></p>



<ol start="1" class="wp-block-list">
<li>The browser calls the BFF with no tracing headers.</li>



<li>The BFF starts an <code>Activity</code> with flags <code>None</code> (<code>00</code>).</li>



<li><code>HttpClient</code> sends <code>00-traceid-spanid-00</code> to downstream services.</li>



<li>The receiving API&#8217;s <code>ParentBased</code> sampler sees <code>00</code> and drops the span via <code>AlwaysOff</code>.</li>
</ol>



<h2 class="wp-block-heading">Configuration Fix</h2>



<p>Configure the receiving service to record incoming requests even when an upstream remote parent arrives marked <code>00</code>:</p>



<h3 class="wp-block-heading">Option 1: Configuration via <code>OTEL_TRACES_SAMPLER</code></h3>



<p>Set the sampler in environment variables or <code>appsettings.json</code>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
OTEL_TRACES_SAMPLER: always_on

</pre></div>


<h3 class="wp-block-heading">Option 2: Configuration in Code</h3>



<p>To set the sampler in application startup, configure the tracer builder:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: csharp; title: ; notranslate">
builder.Services.AddOpenTelemetry()
    .WithTracing(tracing =&gt; tracing.SetSampler&lt;AlwaysOnSampler&gt;());

</pre></div>


<p>Any sampler set directly in code takes precedence over configuration files and environment variables. If both exist, the SDK ignores <code>OTEL_TRACES_SAMPLER</code> and writes an override diagnostic message only to its internal <code>EventSource</code>.</p>



<p>What happens after this change:</p>



<ul class="wp-block-list">
<li><strong>Trace ID is preserved:</strong> The span attaches to the caller&#8217;s trace ID. If the caller starts recording later, the traces line up.</li>



<li><strong>Downstream headers become <code>-01</code>:</strong> Once the service records, its outgoing calls set bit 0 on downstream requests, enabling tracing for subsequent hops.</li>



<li><strong><code>tracestate</code> passes through:</strong> Upstream vendor state like <code>dd=s:0</code> remains intact.</li>



<li><strong>Callers are unaffected:</strong> Decisions only travel downstream.</li>
</ul>



<h3 class="wp-block-heading">Trade-Offs</h3>



<p>If every service in your architecture is instrumented and an edge gateway handles head sampling, respecting the caller&#8217;s <code>00</code> flag prevents broken traces and manages ingest volume.</p>



<p>In systems that mix third-party proxies, uninstrumented apps, and multiple frameworks, an incoming <code>00</code> usually means nobody made a sampling decision, not that a service chose to drop the trace. Overriding <code>remoteParentNotSampled</code> at your service boundary and using tail sampling in the collector avoids losing visibility to runtime defaults.</p>



<h3 class="wp-block-heading">Other Options</h3>



<ul class="wp-block-list">
<li><strong>Instrument the caller:</strong> Adding OpenTelemetry causes the caller to record and propagate <code>-01</code> directly. This will not help when the caller forwards a <code>00</code> from an external proxy.</li>



<li><strong>Disable caller propagation:</strong> Set <code>DOTNET_SYSTEM_NET_HTTP_ENABLEACTIVITYPROPAGATION=0</code> or set <code>DistributedContextPropagator.Current = DistributedContextPropagator.CreateNoOutputPropagator()</code> on the caller. The API then starts a fresh trace ID, but you lose trace correlation across the hop.</li>
</ul>



<h2 class="wp-block-heading">Diagnostic Checklist for Missing Spans</h2>



<ol start="1" class="wp-block-list">
<li>Check if application logs reach the collector. If logs arrive and spans do not, your network and collector pipelines are operational.</li>



<li>Send two <code>curl</code> requests to the endpoint, one with <code>-01</code> and one with <code>-00</code>. Search for both trace IDs.</li>



<li>Log inbound headers with diagnostic middleware (<code>traceparent</code>, <code>tracestate</code>, <code>Activity.Recorded</code>).</li>



<li>Read the incoming trace ID:
<ul class="wp-block-list">
<li>64-bit padded trace ID with <code>dd=</code> in <code>tracestate</code>: Datadog proxy or agent dropped the trace.</li>



<li>128-bit random trace ID with no <code>tracestate</code>: Default .NET runtime propagation from an uninstrumented service.</li>
</ul>
</li>



<li>Set <code>remoteParentNotSampled: new AlwaysOnSampler()</code> on receiving APIs.</li>
</ol>



<h2 class="wp-block-heading">References</h2>



<ul class="wp-block-list">
<li><a href="https://www.w3.org/TR/trace-context/#sampled-flag" target="_blank" rel="noreferrer noopener">W3C Trace Context Specification: Sampled Flag</a></li>



<li><a href="https://opentelemetry.io/docs/specs/otel/trace/sdk/#parentbased" target="_blank" rel="noreferrer noopener">OpenTelemetry SDK Specification: ParentBased Sampler</a></li>



<li><a href="https://learn.microsoft.com/dotnet/api/system.diagnostics.activitytraceflags" target="_blank" rel="noreferrer noopener">Microsoft Learn: ActivityTraceFlags Enum</a></li>



<li><a href="https://learn.microsoft.com/dotnet/core/runtime-config/networking#http-activity-propagation" target="_blank" rel="noreferrer noopener">Microsoft Learn: HTTP Activity Propagation Runtime Configuration</a></li>



<li><a href="https://github.com/dotnet/aspnetcore/blob/main/src/Shared/Diagnostics/ActivityCreator.cs" target="_blank" rel="noreferrer noopener">dotnet/aspnetcore: ActivityCreator.cs</a></li>



<li><a href="https://github.com/dotnet/runtime/blob/release/10.0/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs" target="_blank" rel="noreferrer noopener">dotnet/runtime: Activity.cs</a></li>



<li><a href="https://github.com/dotnet/runtime/blob/release/10.0/src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/SocketsHttpHandler.cs" target="_blank" rel="noreferrer noopener">dotnet/runtime: SocketsHttpHandler.cs</a></li>
</ul><p>The post <a href="https://vexedlogic.com/2026/10/02/your-opentelemetry-spans-arent-lost-your-caller-told-you-not-to-record-them/">Your OpenTelemetry Spans Aren’t Lost. Your Caller Told You Not to Record Them</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://vexedlogic.com/2026/10/02/your-opentelemetry-spans-arent-lost-your-caller-told-you-not-to-record-them/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Get Zigbee2MQTT (Z2M) entities in a Home Assistant template</title>
		<link>https://vexedlogic.com/2025/01/09/get-zigbee2mqtt-z2m-entities-in-a-home-assistant-template/</link>
					<comments>https://vexedlogic.com/2025/01/09/get-zigbee2mqtt-z2m-entities-in-a-home-assistant-template/#respond</comments>
		
		<dc:creator><![CDATA[Austin Rasmussen]]></dc:creator>
		<pubDate>Fri, 10 Jan 2025 01:38:49 +0000</pubDate>
				<category><![CDATA[Home Assistant]]></category>
		<category><![CDATA[home assistant]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[z2m]]></category>
		<category><![CDATA[zigbee]]></category>
		<category><![CDATA[zigbee2mqtt]]></category>
		<guid isPermaLink="false">https://vexedlogic.com/?p=623</guid>

					<description><![CDATA[<p>If you&#8217;re using Zigbee2MQTT (Z2M) with Home Assistant, you might need to access your Z2M entities within templates. You can use the following template the get all of the entity_ids provided by Zigbee2MQTT: This will retrieve all of the MQTT entity IDs specifically provided by Zigbee2MQTT and can be used for other automations or scripts. [&#8230;]</p>
<p>The post <a href="https://vexedlogic.com/2025/01/09/get-zigbee2mqtt-z2m-entities-in-a-home-assistant-template/">Get Zigbee2MQTT (Z2M) entities in a Home Assistant template</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>If you&#8217;re using Zigbee2MQTT (Z2M) with Home Assistant, you might need to access your Z2M entities within templates. You can use the following template the get all of the <code>entity_id</code>s provided by Zigbee2MQTT:<br><br><pre class="brush: plain; title: ; notranslate">
{{ integration_entities(&#039;mqtt&#039;)
   | select(&#039;is_device_attr&#039;,&#039;via_device_id&#039;, device_id(&#039;Zigbee2MQTT Bridge&#039;)) }}</pre></p>



<p>This will retrieve all of the MQTT entity IDs specifically provided by Zigbee2MQTT and can be used for other automations or scripts.  You can also use the <code>expand</code> filter to convert all of these entities to objects for even more filtering.</p>



<p>For more information on templating, be sure to check out the <a href="https://www.home-assistant.io/docs/configuration/templating/" target="_blank" rel="noopener" title="">Home Assistant Templating Documentation</a>.</p>



<p></p><p>The post <a href="https://vexedlogic.com/2025/01/09/get-zigbee2mqtt-z2m-entities-in-a-home-assistant-template/">Get Zigbee2MQTT (Z2M) entities in a Home Assistant template</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://vexedlogic.com/2025/01/09/get-zigbee2mqtt-z2m-entities-in-a-home-assistant-template/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to always force cmd/command prompt and Visual Studio to run as Administrator</title>
		<link>https://vexedlogic.com/2016/07/09/how-to-always-force-cmdcommand-prompt-and-visual-studio-to-run-as-administrator/</link>
					<comments>https://vexedlogic.com/2016/07/09/how-to-always-force-cmdcommand-prompt-and-visual-studio-to-run-as-administrator/#respond</comments>
		
		<dc:creator><![CDATA[Austin Rasmussen]]></dc:creator>
		<pubDate>Sat, 09 Jul 2016 15:34:44 +0000</pubDate>
				<category><![CDATA[Windows]]></category>
		<guid isPermaLink="false">http://vexedlogic.com/?p=614</guid>

					<description><![CDATA[<p>Copy the following text to a &#8220;runasadmin.reg&#8221; file on your machine.  Double-click it and confirm that the file will be merged into the registry. The following inserts the default install location for Visual Studio 2015, but can be modified if the install directory is different or you&#8217;re running a different version of Visual Studio. &#160; Windows [&#8230;]</p>
<p>The post <a href="https://vexedlogic.com/2016/07/09/how-to-always-force-cmdcommand-prompt-and-visual-studio-to-run-as-administrator/">How to always force cmd/command prompt and Visual Studio to run as Administrator</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Copy the following text to a &#8220;runasadmin.reg&#8221; file on your machine.  Double-click it and confirm that the file will be merged into the registry.</p>
<p>The following inserts the default install location for Visual Studio 2015, but can be modified if the install directory is different or you&#8217;re running a different version of Visual Studio.</p>
<p>&nbsp;<br />
<code>Windows Registry Editor Version 5.00</p>
<p>[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]<br />
"C:\\Windows\\System32\\cmd.exe"="~ RUNASADMIN"<br />
"C:\\Windows\\SysWOW64\\cmd.exe"="~ RUNASADMIN"<br />
"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\IDE\\devenv.exe"="~ RUNASADMIN"</p>
<p>[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]<br />
"C:\\Windows\\System32\\cmd.exe"="~ RUNASADMIN"<br />
"C:\\Windows\\SysWOW64\\cmd.exe"="~ RUNASADMIN"<br />
"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\IDE\\devenv.exe"="~ RUNASADMIN"<br />
</code><br />
&nbsp;</p><p>The post <a href="https://vexedlogic.com/2016/07/09/how-to-always-force-cmdcommand-prompt-and-visual-studio-to-run-as-administrator/">How to always force cmd/command prompt and Visual Studio to run as Administrator</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://vexedlogic.com/2016/07/09/how-to-always-force-cmdcommand-prompt-and-visual-studio-to-run-as-administrator/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>401.2 Unauthorized &#8211; Invalid Authentication Headers When Using Anonymous Authentication</title>
		<link>https://vexedlogic.com/2013/08/03/401-2-unauthorized-invalid-authentication-headers-when-using-anonymous-authentication/</link>
					<comments>https://vexedlogic.com/2013/08/03/401-2-unauthorized-invalid-authentication-headers-when-using-anonymous-authentication/#respond</comments>
		
		<dc:creator><![CDATA[Austin Rasmussen]]></dc:creator>
		<pubDate>Sun, 04 Aug 2013 03:46:01 +0000</pubDate>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[iis 7]]></category>
		<category><![CDATA[iis 7.5. iis]]></category>
		<category><![CDATA[iis configuration]]></category>
		<guid isPermaLink="false">http://vexedlogic.com/?p=598</guid>

					<description><![CDATA[<p>Nearly all of the posts that I&#8217;ve seen on the &#8220;401.2 Unauthorized&#8221; issue discuss issues with getting Windows Authentication working correctly.  This post is not one of those, and it does not address how to resolve this error message when attempting to use Windows Authentication.  The following post discusses how to get anonymous authentication back [&#8230;]</p>
<p>The post <a href="https://vexedlogic.com/2013/08/03/401-2-unauthorized-invalid-authentication-headers-when-using-anonymous-authentication/">401.2 Unauthorized – Invalid Authentication Headers When Using Anonymous Authentication</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></description>
										<content:encoded><![CDATA[<p style="text-align: left;">Nearly all of the posts that I&#8217;ve seen on the &#8220;401.2 Unauthorized&#8221; issue discuss issues with getting Windows Authentication working correctly.  This post is not one of those, and it does not address how to resolve this error message when attempting to use Windows Authentication.  The following post discusses how to get anonymous authentication back up and running after experiencing this error message.</p>
<p style="text-align: left;"><span id="more-598"></span></p>
<p><div id="attachment_599" style="width: 501px" class="wp-caption aligncenter"><a href="https://vexedlogic.com/wp-content/uploads/2013/08/2013-08-03-11_54_50-IIS-7.0-Detailed-Error-401.2-Unauthorized.png"><img decoding="async" aria-describedby="caption-attachment-599" class=" wp-image-599  " alt="401-2 Unauthorized" src="https://vexedlogic.com/wp-content/uploads/2013/08/2013-08-03-11_54_50-IIS-7.0-Detailed-Error-401.2-Unauthorized-1024x435.png" width="491" height="209" srcset="https://vexedlogic.com/wp-content/uploads/2013/08/2013-08-03-11_54_50-IIS-7.0-Detailed-Error-401.2-Unauthorized-1024x435.png 1024w, https://vexedlogic.com/wp-content/uploads/2013/08/2013-08-03-11_54_50-IIS-7.0-Detailed-Error-401.2-Unauthorized-300x127.png 300w, https://vexedlogic.com/wp-content/uploads/2013/08/2013-08-03-11_54_50-IIS-7.0-Detailed-Error-401.2-Unauthorized.png 1235w" sizes="(max-width: 491px) 100vw, 491px" /></a><p id="caption-attachment-599" class="wp-caption-text">401.2 &#8211; Unauthorized &#8211; You are not authorized to view this page due to invalid authentication headers</p></div></p>
<p>Surprisingly enough, this issue is not directly caused by any of the following issues listed by the error message:</p>
<ul>
<li>No authentication protocol (including anonymous) is selected in IIS.</li>
<li>Only integrated authentication is enabled, and a client browser was used that does not support integrated authentication.</li>
<li>Integrated authentication is enabled and the request was sent through a proxy that changed the authentication headers before they reach the Web server.</li>
<li>The Web server is not configured for anonymous access and a required authorization header was not received.</li>
<li>The &#8220;configuration/system.webServer/authorization&#8221; configuration section may be explicitly denying the user access.</li>
</ul>
<p>It is, however, caused by an incorrectly configured user used during anonymous authentication.  This may due to the user&#8217;s password changing after being configured within IIS or the user account being disabled or deleted.</p>
<p>To resolve this, go to the Internet Information Services (IIS) Manager and navigate to the website that is experiencing the problem.</p>
<p>Click &#8220;Authentication&#8221; under &#8220;IIS&#8221;.</p>
<p><a href="https://vexedlogic.com/wp-content/uploads/2013/08/Post1.png"><img decoding="async" class="aligncenter size-medium wp-image-604" alt="IIS Website Configuration" src="https://vexedlogic.com/wp-content/uploads/2013/08/Post1-300x194.png" width="300" height="194" srcset="https://vexedlogic.com/wp-content/uploads/2013/08/Post1-300x194.png 300w, https://vexedlogic.com/wp-content/uploads/2013/08/Post1.png 527w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Then, click &#8220;Anonymous Authentication&#8221; and click &#8220;Edit&#8230;&#8221; on the right sidebar.</p>
<p><a href="https://vexedlogic.com/wp-content/uploads/2013/08/Post2.png"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-605" alt="IIS Authentication" src="https://vexedlogic.com/wp-content/uploads/2013/08/Post2-300x59.png" width="300" height="59" srcset="https://vexedlogic.com/wp-content/uploads/2013/08/Post2-300x59.png 300w, https://vexedlogic.com/wp-content/uploads/2013/08/Post2-1024x203.png 1024w, https://vexedlogic.com/wp-content/uploads/2013/08/Post2.png 1124w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Select the appropriate option from the dialog and enter the correct credentials (if required) and click &#8220;OK&#8221;.</p>
<p>Refresh your website and your problem should be resolved.</p><p>The post <a href="https://vexedlogic.com/2013/08/03/401-2-unauthorized-invalid-authentication-headers-when-using-anonymous-authentication/">401.2 Unauthorized – Invalid Authentication Headers When Using Anonymous Authentication</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://vexedlogic.com/2013/08/03/401-2-unauthorized-invalid-authentication-headers-when-using-anonymous-authentication/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>RESOLVED: The Steam servers are too busy to handle your request. Error Code (2)</title>
		<link>https://vexedlogic.com/2013/07/13/resolved-the-steam-servers-are-too-busy-to-handle-your-request-error-code-2/</link>
					<comments>https://vexedlogic.com/2013/07/13/resolved-the-steam-servers-are-too-busy-to-handle-your-request-error-code-2/#respond</comments>
		
		<dc:creator><![CDATA[Austin Rasmussen]]></dc:creator>
		<pubDate>Sat, 13 Jul 2013 20:06:17 +0000</pubDate>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[steam]]></category>
		<guid isPermaLink="false">http://vexedlogic.com/?p=594</guid>

					<description><![CDATA[<p>So&#8230; I&#8217;ve been experiencing issues with installing new Steam games for a while now.  I&#8217;ve found a bunch of posts that seem to suggest the typical solutions where you rename the ClientRegistry.blob, verify the game cache, re-install steam, etc.  None of these seem to resolve the issue where you attempt to launch a game for [&#8230;]</p>
<p>The post <a href="https://vexedlogic.com/2013/07/13/resolved-the-steam-servers-are-too-busy-to-handle-your-request-error-code-2/">RESOLVED: The Steam servers are too busy to handle your request. Error Code (2)</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>So&#8230; I&#8217;ve been experiencing issues with installing new Steam games for a while now.  I&#8217;ve found a bunch of posts that seem to suggest the typical solutions where you rename the ClientRegistry.blob, verify the game cache, re-install steam, etc.  None of these seem to resolve the issue where you attempt to launch a game for the first time, the &#8220;completing installation&#8230; 0%&#8221; window appears and then you receive a message box that says, &#8220;The Steam servers are currently too busy to handle your request. Error Code (2).&#8221;</p>
<p>There&#8217;s two things I found that may be connected to this, and both seem to involve having Visual Studio installed on this machine.</p>
<p>After installing the two following Microsoft updates, the installation was able to complete without issue:</p>
<ul>
<li>Visual C++ Redistributable for Visual Studio 2012 Update 3
<ul>
<li><a href="http://www.microsoft.com/en-us/download/details.aspx?id=30679">http://www.microsoft.com/en-us/download/details.aspx?id=30679</a></li>
</ul>
</li>
<li>Visual Studio 2010 SP1 SDK
<ul>
<li><a href="http://www.microsoft.com/en-us/download/details.aspx?id=21835">http://www.microsoft.com/en-us/download/details.aspx?id=21835</a></li>
</ul>
</li>
</ul><p>The post <a href="https://vexedlogic.com/2013/07/13/resolved-the-steam-servers-are-too-busy-to-handle-your-request-error-code-2/">RESOLVED: The Steam servers are too busy to handle your request. Error Code (2)</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://vexedlogic.com/2013/07/13/resolved-the-steam-servers-are-too-busy-to-handle-your-request-error-code-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Retrieving the COM class factory for component with CLSID {C1F400A0-3F08-11D3-9F0B-006008039E37} failed due to the following error: 80040154 Class not registered</title>
		<link>https://vexedlogic.com/2013/01/08/retrieving-the-com-class-factory-for-component-with-clsid-c1f400a0-3f08-11d3-9f0b-006008039e37-failed-due-to-the-following-error-80040154-class-not-registered/</link>
					<comments>https://vexedlogic.com/2013/01/08/retrieving-the-com-class-factory-for-component-with-clsid-c1f400a0-3f08-11d3-9f0b-006008039e37-failed-due-to-the-following-error-80040154-class-not-registered/#respond</comments>
		
		<dc:creator><![CDATA[Austin Rasmussen]]></dc:creator>
		<pubDate>Wed, 09 Jan 2013 04:21:41 +0000</pubDate>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[class not registered]]></category>
		<category><![CDATA[com class factory]]></category>
		<category><![CDATA[com component]]></category>
		<category><![CDATA[ispy]]></category>
		<category><![CDATA[qedit]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[windows server]]></category>
		<guid isPermaLink="false">http://vexedlogic.com/?p=586</guid>

					<description><![CDATA[<p>Applies to: Microsoft Windows Server 2008/2008 R2/2010 Operating Systems This one required more investigation than I would&#8217;ve thought.  So much so, that I nearly came to the conclusion that I wasn&#8217;t going to be able to do video transcoding.  Fear not though, it is possible and is a straightforward problem to resolve. In this instance, [&#8230;]</p>
<p>The post <a href="https://vexedlogic.com/2013/01/08/retrieving-the-com-class-factory-for-component-with-clsid-c1f400a0-3f08-11d3-9f0b-006008039e37-failed-due-to-the-following-error-80040154-class-not-registered/">Retrieving the COM class factory for component with CLSID {C1F400A0-3F08-11D3-9F0B-006008039E37} failed due to the following error: 80040154 Class not registered</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Applies to: Microsoft Windows Server 2008/2008 R2/2010 Operating Systems</p>
<p>This one required more investigation than I would&#8217;ve thought.  So much so, that I nearly came to the conclusion that I wasn&#8217;t going to be able to do video transcoding.  Fear not though, it is possible and is a straightforward problem to resolve.</p>
<p><span id="more-586"></span></p>
<p>In this instance, I was just trying to use a webcam that was attached to a Windows Server machine, which seems like it should just be a plug-n-play type of task.</p>
<p>However, when trying to view the video from the camera, I had encountering the following error message:</p>
<pre class="brush: plain; title: ; notranslate">
Retrieving the COM class factory for component with CLSID {C1F400A0-3F08-11D3-9F0B-006008039E37} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
</pre>
<p><strong>Problem</strong></p>
<p>This is a straightforward COM error message that basically says that it doesn&#8217;t have information to load a particular component (ex. a program isn&#8217;t installed, is corrupt, etc).  This class ID happens to be associated with Microsoft Windows SDK&#8217;s &#8220;Sample Grabber Filter&#8221; that isn&#8217;t included on these versions of Windows.  This component is included in qedit.dll, which is what is needed to resolve this issue.</p>
<p><strong>Resolution</strong></p>
<p>The easiest resolution to find a version of qedit.dll from a version of Windows that does include it, such as Windows XP, Vista, 7 or 8 (basically, any non-server OS).</p>
<ol>
<li>Copy the qedit.dll file to the <tt>C:\Windows\system32</tt> directory of your server OS.
<ul>
<li>32-bit (x86): <tt>C:\Windows\system32</tt></li>
<li>64-bit (x64): <tt>C:\Windows\SysWOW64</tt></li>
</ul>
</li>
<li>Run the following command at the command prompt as administrator: <tt>regsvr32 C:\Windows\system32\qedit.dll</tt>.</li>
<li>That&#8217;s it!  Your program should now be able to load the component and function as expected.</li>
</ol><p>The post <a href="https://vexedlogic.com/2013/01/08/retrieving-the-com-class-factory-for-component-with-clsid-c1f400a0-3f08-11d3-9f0b-006008039e37-failed-due-to-the-following-error-80040154-class-not-registered/">Retrieving the COM class factory for component with CLSID {C1F400A0-3F08-11D3-9F0B-006008039E37} failed due to the following error: 80040154 Class not registered</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://vexedlogic.com/2013/01/08/retrieving-the-com-class-factory-for-component-with-clsid-c1f400a0-3f08-11d3-9f0b-006008039e37-failed-due-to-the-following-error-80040154-class-not-registered/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WHM/cPanel Install Perl Package: Out of Memory</title>
		<link>https://vexedlogic.com/2012/05/24/whmcpanel-install-perl-package-out-of-memory/</link>
					<comments>https://vexedlogic.com/2012/05/24/whmcpanel-install-perl-package-out-of-memory/#respond</comments>
		
		<dc:creator><![CDATA[Austin Rasmussen]]></dc:creator>
		<pubDate>Thu, 24 May 2012 13:01:52 +0000</pubDate>
				<category><![CDATA[WHM]]></category>
		<category><![CDATA[cpanel]]></category>
		<category><![CDATA[perl]]></category>
		<guid isPermaLink="false">http://vexedlogic.com/?p=583</guid>

					<description><![CDATA[<p>I encountered a situation this morning where I went through the whole Software >> Install a Perl Module, since the default installation doesn&#8217;t come with Net::SFTP. I totally forgot to capture the message, and of course I can&#8217;t reproduce it by trying to uninstall/reinstall, but there was some type of out of memory error that [&#8230;]</p>
<p>The post <a href="https://vexedlogic.com/2012/05/24/whmcpanel-install-perl-package-out-of-memory/">WHM/cPanel Install Perl Package: Out of Memory</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>I encountered a situation this morning where I went through the whole <em>Software >> Install a Perl Module</em>, since the default installation doesn&#8217;t come with <tt>Net::SFTP</tt>.</p>
<p>I totally forgot to capture the message, and of course I can&#8217;t reproduce it by trying to uninstall/reinstall, but there was some type of out of memory error that prevented the package from compiling and installing.</p>
<p>The workaround is simple, just run the <tt>perlinstaller</tt> script from the shell.</p>
<pre class="brush: plain; title: ; notranslate">
# /usr/local/cpanel/scripts/perlinstaller Package-To-Install
# /usr/local/cpanel/scripts/perlinstaller Net::SFTP
</pre>
<p>I didn&#8217;t see any reference on how to run this command, so hopefully this helps anyone looking to install a Perl package via the shell using WHM/cPanel.</p><p>The post <a href="https://vexedlogic.com/2012/05/24/whmcpanel-install-perl-package-out-of-memory/">WHM/cPanel Install Perl Package: Out of Memory</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://vexedlogic.com/2012/05/24/whmcpanel-install-perl-package-out-of-memory/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ASP/ASP.NET Session Timeout &#8211; How do I change it!?</title>
		<link>https://vexedlogic.com/2012/05/23/aspasp-net-session-timeout-how-do-i-change-it/</link>
					<comments>https://vexedlogic.com/2012/05/23/aspasp-net-session-timeout-how-do-i-change-it/#comments</comments>
		
		<dc:creator><![CDATA[Austin Rasmussen]]></dc:creator>
		<pubDate>Thu, 24 May 2012 00:59:10 +0000</pubDate>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[asp]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[iis]]></category>
		<category><![CDATA[session]]></category>
		<category><![CDATA[web.config]]></category>
		<guid isPermaLink="false">http://vexedlogic.com/?p=535</guid>

					<description><![CDATA[<p>20 minutes&#8230; 20 minutes&#8230; 20 minutes&#8230; Does this sound familiar? You&#8217;re trying something simple, or so you thought, and increasing the session timeout of your website, but it doesn&#8217;t appear to be having any effect. ASP.NET Usually, the first and easiest thing to do is just change the configuration/system.web/sessionState@timeout value to something like &#8220;90&#8221;.  This [&#8230;]</p>
<p>The post <a href="https://vexedlogic.com/2012/05/23/aspasp-net-session-timeout-how-do-i-change-it/">ASP/ASP.NET Session Timeout – How do I change it!?</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>20 minutes&#8230; 20 minutes&#8230; 20 minutes&#8230; Does this sound familiar?</p>
<p>You&#8217;re trying something simple, or so you thought, and increasing the session timeout of your website, but it doesn&#8217;t appear to be having any effect.<br />
<span id="more-535"></span></p>
<h2>ASP.NET</h2>
<p>Usually, the first and easiest thing to do is just change the <em>configuration/system.web/sessionState@timeout</em> value to something like &#8220;90&#8221;.  This <em>should</em> mean that you&#8217;d like your users&#8217; sessions to be persisted until a 90 minute window of idle time has elapsed.</p>
<pre class="brush: xml; title: web.config; notranslate">
&lt;configuration&gt;
  &lt;system.web&gt;
  ...
   &lt;sessionState timeout=&quot;90&quot; /&gt;
  ...
 &lt;/system.web&gt;
&lt;/configuration&gt;
</pre>
<p>So, what do you do now? You go ahead and make sure it works&#8230; but wait&#8230; it still appears to be timing out after 20 minutes.</p>
<p>This doesn&#8217;t make any sense, it explicitly says that the session timeout should be exactly 90 minutes.</p>
<p>There&#8217;s a couple of issues that are tied together here:</p>
<ul>
<li>The application pool&#8217;s worker process default idle timeout is also set to 20 minutes</li>
<li>The default mode of storing session state is in the IIS process</li>
</ul>
<h3>Application Pool Idle Timeout</h3>
<p>The settings for the application pool can be found by clicking Properties (IIS 6) or Advanced Settings (IIS 7.5) on the application pool that the application is assigned to.</p>
<table>
<tr>
<td>
<a href="https://vexedlogic.com/wp-content/uploads/2012/05/IIS7.5-Idle.png"><img loading="lazy" decoding="async" class="size-thumbnail wp-image-548" title="IIS 7.5 Idle Timeout" src="https://vexedlogic.com/wp-content/uploads/2012/05/IIS7.5-Idle-150x150.png" alt="" width="150" height="150" /></a></td>
<td><a href="https://vexedlogic.com/wp-content/uploads/2012/05/IIS6-Idle.png"><img loading="lazy" decoding="async" class="wp-image-550" title="IIS 6 Idle Timeout" src="https://vexedlogic.com/wp-content/uploads/2012/05/IIS6-Idle-150x150.png" alt="" width="150" height="150" /></a></td>
</tr>
<tr>
<td>IIS 7.5 Idle Timeout</td>
<td>IIS 6 Idle Timeout</td>
</tr>
</table>
<p></p>
<p>
Ensure this value is set to the timeout of your session, at a minimum, to ensure that all sessions persist for the entire session timeout period.</p>
<p>The reason that these two values are dependent on one another is because the session information is actually stored within the worker process of the application pool.  That is to say, if the worker process is shutdown or killed for any reason, the session information will be lost.</p>
<h3>Session Storage Mode</h3>
<p>There are the modes of storing the session information:</p>
<ul>
<li>InProc (or In Process) &#8211; Default &#8211; Stores session information within the IIS worker process</li>
<li>StateServer &#8211; Stores session information in a separate process (the ASP.NET state service)</li>
<li>SQLServer &#8211; Stores session information in a SQL database</li>
</ul>
<p>The only mode that is vulnerable to losing session information on a worker process is when the state is stored in the worker process.  Both StateServer and SQLServer modes are not affected by worker process resets.  Likewise, StateServer and SQLServer modes are the only options when it is necessary to share session state across more than a single IIS server.</p>
<p>For more information about these modes, check out <a href="http://msdn.microsoft.com/en-us/library/ms178586.aspx">MSDN</a>.</p>
<h2>ASP</h2>
<p>There&#8217;s two ways to change the session timeout when you&#8217;re dealing with classic ASP.  </p>
<p>You can set it at the application level, or programmatically, which means that the value can be different within the application.</p>
<h3>Application Level</h3>
<p>Since it doesn&#8217;t specifically state that the setting is for classic ASP, it may be confusing to know that the value is in: Application Properties -> Configuration&#8230; -> Options -> Enable session state.</p>
<p><a href="https://vexedlogic.com/wp-content/uploads/2012/05/IIS6-ASPSession.png"><img loading="lazy" decoding="async" src="https://vexedlogic.com/wp-content/uploads/2012/05/IIS6-ASPSession-150x150.png" alt="" title="IIS 6 ASP Session" width="150" height="150" class="aligncenter size-thumbnail wp-image-571" /></a></p>
<p>It&#8217;s as simple as updating this value, and the session timeout for your entire classic ASP application is changed!</p>
<h3>Programmatically</h3>
<p>You can also use modify the <tt>Session.Timeout</tt> property at runtime to affect the timeout period of the session.  One popular location to put this piece of code is in the <tt>global.asa</tt> file.</p>
<pre class="brush: vb; title: global.asa; notranslate">
&lt;script language=&quot;VBScript&quot; runat=&quot;Server&quot;&gt;
Sub Session_OnStart
 Session.Timeout = 90
End Sub 
&lt;/SCRIPT&gt;
</pre><p>The post <a href="https://vexedlogic.com/2012/05/23/aspasp-net-session-timeout-how-do-i-change-it/">ASP/ASP.NET Session Timeout – How do I change it!?</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://vexedlogic.com/2012/05/23/aspasp-net-session-timeout-how-do-i-change-it/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>Running Pyramid Web Framework with FastCGI</title>
		<link>https://vexedlogic.com/2012/05/01/running-pyramid-web-framework-with-fastcgi/</link>
					<comments>https://vexedlogic.com/2012/05/01/running-pyramid-web-framework-with-fastcgi/#comments</comments>
		
		<dc:creator><![CDATA[Austin Rasmussen]]></dc:creator>
		<pubDate>Wed, 02 May 2012 00:23:46 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[fast cgi]]></category>
		<category><![CDATA[pyramid]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[wsgi]]></category>
		<guid isPermaLink="false">http://vexedlogic.com/?p=515</guid>

					<description><![CDATA[<p>So, I&#8217;ve been experimenting a little bit with Python here and there lately. I finally decided to start looking into some of the different web frameworks, like Django, Pylons, Pyramid, web.py, etc. I chose to start playing around a little bit with Pyramid, mainly because it appears to allow more freedoms than Django (and I&#8217;m [&#8230;]</p>
<p>The post <a href="https://vexedlogic.com/2012/05/01/running-pyramid-web-framework-with-fastcgi/">Running Pyramid Web Framework with FastCGI</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>So, I&#8217;ve been experimenting a little bit with Python here and there lately. I finally decided to start looking into some of the different web frameworks, like Django, Pylons, Pyramid, web.py, etc. I chose to start playing around a little bit with Pyramid, mainly because it appears to allow more freedoms than Django (and I&#8217;m not going to attempt to build any type of blog/publishing website).</p>
<p>After I finished installing Pyramid and creating the folder structure of my site, one of my next steps was to ensure that I got some sane response from Apache showing that my site is alive. Now, my particular environment uses FastCGI, so I needed to find a way to allow FastCGI to serve up my shiny new Pyramid application that is written in Python.<br />
<span id="more-515"></span><br />
There are three steps to do this:</p>
<ol>
<li>Create a <code>dispatch.fcgi</code> file &#8211; This will handle the the creation and running of the WSGI server</code></li>
<li>Chmod <code>dispatch.fcgi</code> to 0755 (it needs to be executable!)</li>
<li>Create a <code>.htaccess</code> file &#8211; This will route all incoming requests to the <code>dispatch.fcgi</code> file</li>
</ol>
<h2>Create a <code>dispatch.fcgi</code> File</h2>
<p>This file, along with the upcoming .htaccess file, are the only files that are required to be visible by the public.  That is, the source of the application can be safely stored above the document root, which can prevent potential attacks that could expose the application&#8217;s source code.</p>
<p>Create a <code>dispatch.fcgi</code> file with the following content:</p>
<pre class="brush: python; title: dispatch.fcgi; notranslate">

#!/path/to/your/bin/python
import sys

from paste.deploy import loadapp
from flup.server.fcgi_fork import WSGIServer

app = loadapp('config:/path/to/your/production.ini')
server = WSGIServer(app)
server.run()
</pre>
<h2>Chmod <code>dispatch.fcgi</code> to 0755</h2>
<p><strong>If you don&#8217;t do this, I promise you will spend a while trying to figure out what is preventing your site from serving up correctly.</strong></p>
<p>Let&#8217;s take a quick look at what happens when <code>dispatch.fcgi</code> is not executable.</p>
<pre class="brush: plain; title: ; notranslate">
&#x5B;Wed May 02 02:10:25 2012] &#x5B;info] mod_fcgid: server example.net:/path/to/my/dispatch.fcgi(130539) started
&#x5B;Wed May 02 02:10:25 2012] &#x5B;warn] &#x5B;client 127.0.0.1] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server, referer: http://example.net/
&#x5B;Wed May 02 02:10:25 2012] &#x5B;error] &#x5B;client 127.0.0.1] Premature end of script headers: dispatch.fcgi, referer: http://example.net/
</pre>
<p>&#8230; well then, I&#8217;m not sure how much more unhelpful that could be.  Anyway, make sure that you don&#8217;t end up wasting time debugging a dumb issue and issue the following command:</p>
<pre class="brush: plain; title: ; notranslate">
chmod 0755 dispatch.fcgi
</pre>
<h2>Create a <code>.htaccess</code> file</h3>
<p>The last and final step is to utilize mod_rewrite to redirect requests to the Python application via the <code>dispatch.fcgi</code> file.</p>
<pre class="brush: plain; title: .htaccess; notranslate">
AddHandler fcgid-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi/$1 &#x5B;QSA,L]
</pre>
<p>That&#8217;s it!  The site should be accessible by navigating to the website URL where the <code>dispatch.fcgi</code> file resides.</p>
<h2>Things to Note</h2>
<p>Keep in mind that the FastCGI application will continue running after the first request.  If any changes are made to the <code>dispatch.fcgi</code> file, be sure to kill the old instance of Python.  This will force a new instance to be created on the next request, and cause the updated code to be executed.</p><p>The post <a href="https://vexedlogic.com/2012/05/01/running-pyramid-web-framework-with-fastcgi/">Running Pyramid Web Framework with FastCGI</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://vexedlogic.com/2012/05/01/running-pyramid-web-framework-with-fastcgi/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>App Engine ProtoRPC Basics</title>
		<link>https://vexedlogic.com/2011/08/20/app-engine-protorpc-basics/</link>
					<comments>https://vexedlogic.com/2011/08/20/app-engine-protorpc-basics/#respond</comments>
		
		<dc:creator><![CDATA[Austin Rasmussen]]></dc:creator>
		<pubDate>Sat, 20 Aug 2011 19:13:37 +0000</pubDate>
				<category><![CDATA[App Engine]]></category>
		<category><![CDATA[app engine]]></category>
		<category><![CDATA[appengine]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[protorpc]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[rpc]]></category>
		<category><![CDATA[web service]]></category>
		<guid isPermaLink="false">http://vexedlogic.com/?p=474</guid>

					<description><![CDATA[<p>What is ProtoRPC? I found out about ProtoRPC when I was looking for a way to expose a web service from a Google App Engine application.  I was investigating several different ways that would allow me to receive requests, process those requests, and send back a response.  Out of the options of manually serializing XML [&#8230;]</p>
<p>The post <a href="https://vexedlogic.com/2011/08/20/app-engine-protorpc-basics/">App Engine ProtoRPC Basics</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></description>
										<content:encoded><![CDATA[<h3>What is ProtoRPC?</h3>
<p>I found out about ProtoRPC when I was looking for a way to expose a web service from a Google App Engine application.  I was investigating several different ways that would allow me to receive requests, process those requests, and send back a response.  Out of the options of manually serializing XML or JSON, extracting GET/POST parameters from the HTTP request, or ProtoRPC, ProtoRPC was a great choice.</p>
<p>One of the cool things about ProtoRPC is that it automatically handles the serialization and deserialization of the responses and requests to/from JSON.  This means that you don&#8217;t need a <em>simplejson.loads(&#8230;) </em>at the beginning of each web service nor a <em>simplejson.dumps(&#8230;)</em> at the end.</p>
<p>If you&#8217;re looking for a flexible yet compact way to expose a web service from your Google App Engine app, check out what ProtoRPC can offer you.<span id="more-474"></span></p>
<h3>ProtoRPC Changes</h3>
<p>To start off, I just want to point out a few things about ProtoRPC that have changed from a lot of the documentation that I&#8217;ve seen.  Since it is still in the experimental stage, I have a feeling that this blog post will be outdated soon enough, too, as Google continues development on the ProtoRPC API.</p>
<ul>
<li>service_handlers has moved from the <em>protorpc</em> namespace to <em>protorpc.webapp</em> (The <a href="http://code.google.com/appengine/docs/python/tools/protorpc/overview.html" target="_blank">Google overview</a> of ProtoRPC is outdated)
<ul>
<li>I found this out initially by experiencing this error: <em>ImportError: cannot import name service_handlers</em></li>
</ul>
</li>
</ul>
<div style="padding-left: 45px;">
<p>Change</p>
<pre class="brush: plain; title: ; notranslate">from protorpc import service_handlers</pre>
<p>to</p>
<pre class="brush: plain; title: ; notranslate">from protorpc.webapp import service_handlers</pre>
</div>
<ul>
<li>The @remote.remote(Request,Response) decorator has changed to @remote.method(Request,Response)</li>
</ul>
<div style="padding-left: 45px;">
<p>Change</p>
<pre class="brush: python; title: ; notranslate">@remote.remote(GetRequest, GetResponse)
def get(self, request):</pre>
<p>to</p>
<pre class="brush: python; title: ; notranslate">@remote.method(GetRequest, GetResponse)
def get(self, request):</pre>
</div>
<h3>Creating the Data Model</h3>
<p>I&#8217;d like to create a tracking application for my collection of LOLcats, and where better to host it than in the Google App Engine cloud.  For now, it&#8217;ll be basic tracking of only their name, color, and age, but there&#8217;s always room for expansion in the future.</p>
<pre class="brush: python; title: vxl-protorpc-basics/main.py; notranslate">
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext import db

class MainHandler(webapp.RequestHandler):
    def get(self):
        self.response.out.write(&#039;Welcome to the VexedLogic ProtoRPC test application!&#039;)

class LolCat(db.Model):
	name = db.StringProperty(required=True)
	color = db.StringProperty(required=True)
	age = db.IntegerProperty(required=True)

def main():
    application = webapp.WSGIApplication(&#x5B;(&#039;/&#039;, MainHandler)],
                                         debug=True)
    util.run_wsgi_app(application)

if __name__ == &#039;__main__&#039;:
    main()
</pre>
<h3>Creating the ProtoRPC Service Methods</h3>
<p>Now we&#8217;re to the fun part&#8230; actually creating the new ProtoRPC service to manage my collection of LOLcats.  Since I would never dream of getting rid of one of them, the only two method that I will implement are add and get.  I&#8217;m going to start a new Python file called <em>lolcat_service.py</em> to contain all of my service logic.</p>
<h4>Add Method</h4>
<p>First, the request and response of the add method need to be defined.  Since there isn&#8217;t anything in particular that needs to be returned to the caller, I&#8217;ll use <em>VoidMessage</em>, which is the built-in &#8220;empty&#8221; type.</p>
<p>Unfortunately, we cannot reuse the same model class that was created in <em>main.py</em>, the request/response classes need to inherit from <em>protorpc.messages.Message</em>.</p>
<pre class="brush: python; title: vxl-protorpc-basics/lolcat_service.py; notranslate">
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.api import users

from protorpc import messages
from protorpc import message_types
from protorpc import remote
import main

class Cat(messages.Message):
 name = messages.StringField(1, required=True)
 color = messages.StringField(2, required=True)
 age = messages.IntegerField(3, required=True)

class AddCatRequest(messages.Message):
 cat = messages.MessageField(Cat, 1, required=True)</pre>
<p>You&#8217;ll notice the definition of <em>Cat</em> message looks very similar to the <em>LolCat</em> model with a few differences.  The main difference is that the fields on the message class need unique integer values provided, which are used for field identification by ProtoRPC.  I&#8217;d like to reuse the <em>Cat</em> definition in the get method, which is why I make a separate <em>Cat</em> message instead of include all 3 properties in the <em>AddCatRequest</em> message</p>
<p>The add method looks like this:</p>
<pre class="brush: python; title: ; notranslate">
class lolcat_service(remote.Service):
	@remote.method(AddCatRequest, message_types.VoidMessage)
	def add_cat(self, request):
		main.LolCat(name = request.cat.name,
					color = request.cat.color,
					age = request.cat.age).put()

		return message_types.VoidMessage()
</pre>
<h4>Get Method</h4>
<p>On to the get method&#8230; this one is a little bit more complex since the user should be allowed to specify some criteria with the request to get the listing of cats.</p>
<p>When the get method is all complete, the <em>lolcat_service.py</em> looks like this:</p>
<pre class="brush: python; title: vxl-protorpc-basics/lolcat_service.py; notranslate">
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.api import users

from protorpc import messages
from protorpc import message_types
from protorpc import remote
import main

class Cat(messages.Message):
	name = messages.StringField(1, required=True)
	color = messages.StringField(2, required=True)
	age = messages.IntegerField(3, required=True)

class AddCatRequest(messages.Message):
	cat = messages.MessageField(Cat, 1, required=True)

class GetCatsRequest(messages.Message):
	min_age = messages.IntegerField(1)
	color = messages.StringField(2)
	max_results = messages.IntegerField(3, default=100)

class GetCatsResponse(messages.Message):
	cats = messages.MessageField(Cat, 1, repeated=True)

class lolcat_service(remote.Service):
	@remote.method(AddCatRequest, message_types.VoidMessage)
	def add_cat(self, request):
		main.LolCat(name = request.cat.name,
					color = request.cat.color,
					age = request.cat.age).put()

		return message_types.VoidMessage()

	@remote.method(GetCatsRequest, GetCatsResponse)
	def get_cats(self, request):
		query = main.LolCat.all()

		if request.min_age:
			query.filter(&#039;age &amp;gt;=&#039;, request.min_age)
		if request.color:
			query.filter(&#039;color =&#039;, request.color)

		cats = &#x5B;]
		for cat_model in query.fetch(request.max_results):
			cat = Cat(name=cat_model.name,
					  color=cat_model.color,
					  age=cat_model.age)
			cats.append(cat)

		return GetCatsResponse(cats = cats)
</pre>
<h3>Registering the Service</h3>
<p>Create a new <em>services.py</em> file that will define the service mapping for the service that was just created.</p>
<pre class="brush: python; title: vxl-protorpc-basics/services.py; notranslate">
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util

from protorpc.webapp import service_handlers

import lolcat_service

# Register mapping with application.
application = webapp.WSGIApplication(
  service_handlers.service_mapping(
    &#x5B;(&#039;/service&#039;, lolcat_service.lolcat_service)]),
  debug=True)

def main():
  util.run_wsgi_app(application)

if __name__ == &#039;__main__&#039;:
  main()
</pre>
<p>Finally, map the handler in the <em>app.yaml</em> file by adding the following block under the handlers section:</p>
<pre class="brush: plain; title: ; notranslate">
- url: /service.*
  script: services.py
</pre>
<p>That&#8217;s it!  You can now visit the service at http://localhost:8080/service.add_cat (replace 8080 with the correct port number) and be greeted with the &#8220;/service.add_cat is a ProtoRPC method.&#8221; message.</p>
<h3>Testing your ProtoRPC Service</h3>
<p>Since the generic &#8220;/service.add_cat is a ProtoRPC method.&#8221; isn&#8217;t very comforting in assuring me that my service works as expected, I put together two HTML files that will call these services and display the results in the alert box.</p>
<p>This requires adding one more handler mapping in the <em>app.yaml</em> file:</p>
<pre class="brush: plain; title: ; notranslate">
- url: /static
  static_dir: static
</pre>
<p>Create a new <em>static</em> folder in the root of your project directory.</p>
<h4>Testing the Add Method</h4>
<p>The following HTML file will make three requests to the <em>add_cat</em> method to add the following cats:</p>
<ul>
<li>Long Cat (Color: White / Age: 1)</li>
<li>Tacgnol (Color: Black/ Age: 7)</li>
<li>Monorail Cat (Color: Brown / Age: 10)</li>
</ul>
<p>If successful, when you browse to http://localhost:8080/static/TestAdd.html, you should see three alert dialogs that contain &#8220;{}&#8221;, which is the contents of the VoidMessage that the <em>add_cat</em> method returns.</p>
<pre class="brush: xml; title: vxl-protorpc-basics/static/TestAdd.html; notranslate">
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;
    src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js&amp;quot;&amp;gt;
    &amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;script&amp;gt;
  $.ajax({url: &#039;/service.add_cat&#039;, type: &#039;POST&#039;, contentType:
  &#039;application/json&#039;,
  data: &#039;{&amp;quot;cat&amp;quot; : {&amp;quot;name&amp;quot;: &amp;quot;Long Cat&amp;quot;, &amp;quot;color&amp;quot; : &amp;quot;white&amp;quot;, &amp;quot;age&amp;quot; : 1}}&#039;,
  dataType: &#039;html&#039;,
  error:function(response, one, two) {
  alert(response.responseText); alert(one); alert(two); }, success:
  function(json) { alert(json); } });

  $.ajax({url: &#039;/service.add_cat&#039;, type: &#039;POST&#039;, contentType:
  &#039;application/json&#039;,
  data: &#039;{&amp;quot;cat&amp;quot; : {&amp;quot;name&amp;quot;: &amp;quot;Tacgnol&amp;quot;, &amp;quot;color&amp;quot; : &amp;quot;black&amp;quot;, &amp;quot;age&amp;quot; : 7}}&#039;,
  dataType: &#039;html&#039;,
  error:function(response, one, two) {
  alert(response.responseText); alert(one); alert(two); }, success:
  function(json) { alert(json); } });

  $.ajax({url: &#039;/service.add_cat&#039;, type: &#039;POST&#039;, contentType:
  &#039;application/json&#039;,
  data: &#039;{&amp;quot;cat&amp;quot; : {&amp;quot;name&amp;quot;: &amp;quot;Monorail Cat&amp;quot;, &amp;quot;color&amp;quot; : &amp;quot;brown&amp;quot;, &amp;quot;age&amp;quot; : 10}}&#039;,
  dataType: &#039;html&#039;,
  error:function(response, one, two) {
  alert(response.responseText); alert(one); alert(two); }, success:
  function(json) { alert(json); } });
  &amp;lt;/script&amp;gt;
  &amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
</pre>
<h4>Testing the Get Method</h4>
<p>The following HTML file will make a request to the <em>get_cats</em> method.  By default, if this method is called without the data property, it will return a maximum of 100 cats with any age and color.</p>
<p>The data  property of the AJAX request can be manipulated to specify the criteria for the <em>get_cats</em> method.  This property is deserialized into a GetCatsRequest object when received by the <em>get_cats</em> method.  I&#8217;ve provided a few examples of different search criteria that are commented out below.</p>
<pre class="brush: xml; title: vxl-protorpc-basics/static/TestGet.html; notranslate">
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;
    src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js&amp;quot;&amp;gt;
    &amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;script&amp;gt;
  $.ajax({url: &#039;/service.get_cats&#039;, type: &#039;POST&#039;, contentType:
  &#039;application/json&#039;,
  &amp;lt;!-- data: &#039;{&amp;quot;min_age&amp;quot;: 7, &amp;quot;color&amp;quot;: &amp;quot;black&amp;quot;}&#039;, --&amp;gt;
  &amp;lt;!-- data: &#039;{&amp;quot;min_age&amp;quot;: 7}&#039;, --&amp;gt;
  &amp;lt;!-- data: &#039;{&amp;quot;max_results&amp;quot;: 2}&#039;, --&amp;gt;
  &amp;lt;!-- data: &#039;{&amp;quot;min_age&amp;quot;: 7, &amp;quot;color&amp;quot;: &amp;quot;black&amp;quot;}&#039;, --&amp;gt;
  dataType: &#039;html&#039;,
  error:function(response, one, two) {
  alert(response.responseText); alert(one); alert(two); }, success:
  function(json) { alert(json); } });
  &amp;lt;/script&amp;gt;
  &amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
</pre><p>The post <a href="https://vexedlogic.com/2011/08/20/app-engine-protorpc-basics/">App Engine ProtoRPC Basics</a> first appeared on <a href="https://vexedlogic.com">Vexed Logic!?</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://vexedlogic.com/2011/08/20/app-engine-protorpc-basics/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
