<?xml version="1.0" encoding="utf-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom">
  <title></title>
  <subtitle></subtitle>
  <id>https://www.endpointdev.com/blog/tags/hardware/</id>
  <link href="https://www.endpointdev.com/blog/tags/hardware/"/>
  <link href="https://www.endpointdev.com/blog/tags/hardware/" rel="self"/>
  <updated>2026-05-18T00:00:00+00:00</updated>
  <author>
    <name>End Point Dev</name>
  </author>
  
    <entry>
      <title>Solving High-Resolution Video Stutter with GStreamer Hardware Acceleration</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2026/05/solving-hi-res-video-stutter-gstreamer-hardware/"/>
      <id>https://www.endpointdev.com/blog/2026/05/solving-hi-res-video-stutter-gstreamer-hardware/</id>
      <published>2026-05-18T00:00:00+00:00</published>
      <author>
        <name>Alejandro Ramon</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2026/05/solving-hi-res-video-stutter-gstreamer-hardware/cover.webp&#34; alt=&#34;VisionPort One is the classic VisionPort experience that has proven itself in 70+ installations around the world.&#34;&gt;&lt;br&gt;
Photo from the &lt;a href=&#34;https://www.visionport.com/visionport-platform/&#34;&gt;VisionPort website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In April, a client at Auburn University reached out to VisionPort Support to ask us to look into an issue with video playback for an upcoming presentation. They were running into performance issues attempting to play a video matching the full resolution of the seven-screen video wall, across all screens.&lt;/p&gt;
&lt;p&gt;We have other clients playing video across all screens normally, on the same hardware and software, with no issue, so this was a strange report to the team. The seemingly simple request ended up leading us down a rabbit hole into how video playback works on the VisionPort platform and ultimately led to some serious modernization of our video rendering stack, the process of which we would like to share with you today.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Why was a system designed to play high-resolution video seamlessly across seven screens performing so poorly?&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;the-system-a-gstreamer-pipeline&#34;&gt;The System: A GStreamer Pipeline&lt;/h3&gt;
&lt;p&gt;The VisionPort video player is a custom application built on top of the &lt;a href=&#34;https://gstreamer.freedesktop.org/&#34;&gt;GStreamer&lt;/a&gt; framework, initially developed to synchronize video across separate computers on our legacy Liquid Galaxy hardware configurations.&lt;/p&gt;
&lt;p&gt;Each instance of the player renders a single video. This can be the full 7560x1920 canvas size of a seven-screen VisionPort, or often various subdivisions of the full resolution that cover two or three displays. Although the host hardware of our modern servers is theoretically sufficient, in practice the pipeline was overwhelmed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2026/05/solving-hi-res-video-stutter-gstreamer-hardware/vp-content-playback-flow.webp&#34; alt=&#34;High-level overview of the VisionPort content playback flow, showing users interacting through laptop, tablet, or controllers, with content routed through the VisionPort head node, application layer, NVIDIA card resources, and display wall.&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;High-level overview of the content playback flow for VisionPort systems&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;first-instinct-the-encoding&#34;&gt;First Instinct: The Encoding&lt;/h3&gt;
&lt;p&gt;Our initial hypothesis was that video encoding was to blame. Encoding impacts file size, quality, and playback compatibility, and we have previously encountered issues with certain Apple workflows, videos exported from Final Cut Pro, for example. Although nothing about the original video stood out to our team as improperly configured, we re-encoded the source using an H.264 codec and a well-formed container, and tested reducing the resolutions of the video.&lt;/p&gt;
&lt;p&gt;The stutter persisted consistently across the test videos, ruling out encoding as the root cause. In fact, the lower-resolution videos still had stuttering issues, furthering our confusion.&lt;/p&gt;
&lt;h3 id=&#34;hardware-decoding-take-one&#34;&gt;Hardware Decoding, Take One&lt;/h3&gt;
&lt;p&gt;We next considered that the pipeline was running entirely on the processor (CPU) instead of utilizing the ample graphics card resources (GPU). Although the video player was originally designed to support hardware decode elements, software decode had been the default configuration for a number of years.&lt;/p&gt;
&lt;p&gt;Architecturally, the video player runs from within an application layer deployed to the host via a Docker container. The host features an NVIDIA graphics card, so our logic was that leveraging the GPU for this high-resolution video should, in theory, reduce bottlenecks induced by running everything off of the CPU.&lt;/p&gt;
&lt;p&gt;Implementing hardware decode was a project in itself. We discovered that the original legacy decoders present in the video player, such as &lt;code&gt;vaapidecodebin&lt;/code&gt; and &lt;code&gt;vaapipostproc&lt;/code&gt;, were not available to our server&amp;rsquo;s CPU. NVIDIA&amp;rsquo;s accelerated decoders are not part of GStreamer&amp;rsquo;s default plugin set packaged on the Ubuntu base that we use, meaning we had to identify and install the correct package source and plugin in our Docker images. The necessary plugin package, via &lt;code&gt;apt&lt;/code&gt;, ended up being &lt;code&gt;gstreamer1.0-plugins-bad&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Lastly, we needed to resolve Docker-related resource-visibility issues to ensure the container could access the GPU. That meant using the &lt;a href=&#34;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/docker-specialized.html&#34;&gt;NVIDIA Container Toolkit&lt;/a&gt; and passing the correct environment variables to the container so that it could utilize the GPU resources.&lt;/p&gt;
&lt;p&gt;Once properly configured, and by enabling hardware decode in the launch command, we were able to determine that hardware decoding was functional.&lt;/p&gt;
&lt;p&gt;A few useful commands to check whether the expected resources are present in the container:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nvidia-smi
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;# Checks if the container can access the GPU at all.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nvidia-smi dmon -s u
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;# Provides an ongoing report of what GPU features are being utilized over time,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;# so we can see whether the decoder is being used.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gst-inspect-1.0 nvcodec
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;# Gets a list of supported features present for your current implementation of&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;# GStreamer with the NVIDIA codecs. You can also run the command without a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;# specific feature to list every supported feature present.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After finally confirming that hardware decode was functioning, we discovered that playback had improved somewhat, but the stutter was not fully resolved.&lt;/p&gt;
&lt;h3 id=&#34;the-real-culprit-rendering-not-decoding&#34;&gt;The Real Culprit: Rendering, Not Decoding&lt;/h3&gt;
&lt;p&gt;At this point we were stumped, so we tried playing the video in another player we had available on the system, &lt;code&gt;ffplay&lt;/code&gt;. The video appeared to play back somewhat normally.&lt;/p&gt;
&lt;p&gt;We reported this to our developer, who decided to enable GStreamer&amp;rsquo;s debug output. The logs were filled with quality-of-service messages, indicating that one or more pipeline elements could not process frames quickly enough, causing downstream stages to drop or delay them.&lt;/p&gt;
&lt;p&gt;The QoS pattern suggested the bottleneck was in the sink, not the decoder. The video player&amp;rsquo;s GStreamer &lt;code&gt;autovideosink&lt;/code&gt; element was defaulting to &lt;code&gt;xvimagesink&lt;/code&gt;, which relies on the CPU for color-space conversion and video texture handling. At 7560x1920px resolution and 60 fps, the CPU was unable to keep up with rendering the large amount of data. &lt;em&gt;It turns out that the source of the issue had more to do with the framerate of the high-resolution video than with the resolution itself.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The host had &lt;code&gt;glimagesink&lt;/code&gt; available, which is an alternative sink that uses OpenGL for GPU-based color-space conversion and texture upload. By explicitly specifying &lt;code&gt;glimagesink&lt;/code&gt; instead of relying on &lt;code&gt;autovideosink&lt;/code&gt;, we assigned rendering to the appropriate hardware.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This single change restored smooth playback at the target resolution.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;putting-the-pieces-together&#34;&gt;Putting the Pieces Together&lt;/h3&gt;
&lt;p&gt;Even though we had a solution for the issue at hand, there were a few more details to sort out to make this universal for all media going forward. It turns out that the NVIDIA accelerated H.264 decoders for the hardware generation we use top out at 4K, meaning that H.264 encoded videos larger than 3840x2160 would not be able to run on the GPU even if we specified use of the decoder. Luckily, our implementation was robust enough to swap back to decoding on the CPU in the case of a fault.&lt;/p&gt;
&lt;p&gt;Additionally, the H.265 decoder supports higher resolutions, comfortably handling 7560x1920 and allowing for future scalability.&lt;/p&gt;
&lt;p&gt;The complete pipeline now runs the GL-backed sink with the option to enable hardware decode for H.264, H.265, VP8, VP9, or AV1, all common encoding formats. The format is auto-detected and will utilize the decoder if the content is acceptable. The CPU render is no longer a bottleneck for decoding or rendering, allowing videos to play back at the full 60 fps, even at higher resolutions.&lt;/p&gt;
&lt;h3 id=&#34;beyond-one-engagement-broader-implications&#34;&gt;Beyond One Engagement: Broader Implications&lt;/h3&gt;
&lt;p&gt;The Auburn University request prompted us to reevaluate our video player stack, particularly a legacy renderer choice and plugin-installation pattern from prior to our move to containerized deployments. Not mentioned in our process above were bug fixes to fix potential memory bugs and improvements to our testing process to simplify future changes.&lt;/p&gt;
&lt;p&gt;These improvements are now incorporated into the upcoming VisionPort Library MQTT migration of the VisionPort application layer. New deployments will default to hardware-accelerated decoding via NVIDIA decoders and GL-backed rendering via &lt;code&gt;glimagesink&lt;/code&gt;, rather than defaulting to the CPU path with the old renderer.&lt;/p&gt;
&lt;p&gt;Key takeaways include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instrument first if a video pipeline is stuttering&lt;/strong&gt;. GStreamer&amp;rsquo;s verbose debug output, particularly QoS messages, identifies pipeline bottlenecks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not assume the autodetected sink is optimal&lt;/strong&gt;. &lt;code&gt;autovideosink&lt;/code&gt; is frequently adequate, but check the available sinks for your operating system.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hardware acceleration in a container requires more than package installation&lt;/strong&gt;. The container must have GPU visibility and the correct plugin set, which may be its own task.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decoder and renderer can be independently CPU- or GPU-bound&lt;/strong&gt;. Ensuring both are GPU-accelerated is crucial for high-resolution pipelines.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;working-with-end-point&#34;&gt;Working with End Point&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re facing video playback or multimedia pipeline performance challenges, whether with GStreamer, in a containerized environment, or across a multi-screen VisionPort-style installation, End Point&amp;rsquo;s Immersive and Geospatial division has extensive experience with these issues.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://gstreamer.freedesktop.org/documentation/&#34;&gt;GStreamer documentation&lt;/a&gt; is a valuable resource, and we are available to discuss our insights from similar deployments. &lt;a href=&#34;/contact/&#34;&gt;Get in touch&lt;/a&gt; to set up a consultation.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Programming the Intel NDP in 1983</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2023/03/programming-the-intel-ndp-in-1983/"/>
      <id>https://www.endpointdev.com/blog/2023/03/programming-the-intel-ndp-in-1983/</id>
      <published>2023-03-12T00:00:00+00:00</published>
      <author>
        <name>Jeremy Freeman</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2023/03/programming-the-intel-ndp-in-1983/20230205-163937-sm.webp&#34; alt=&#34;Photograph of brick building fronted by a metal staircase leading to the roof, gated by a full-size metal door that would be trivially easy to climb around&#34;&gt;&lt;/p&gt;
&lt;!-- Photo by Jon Jensen --&gt;
&lt;h3 id=&#34;the-beginning&#34;&gt;The Beginning&lt;/h3&gt;
&lt;p&gt;I graduated from St. John’s College in Annapolis in 1980. It was an intensive four-year education in math, science, language, poetry, and philosophy. Two years later, I took four computer classes at a community college, and got my first IT job in 1983 at the beginning of the personal computer revolution.&lt;/p&gt;
&lt;p&gt;There were two of us: Steve, the owner of the company, and I, working literally in his garage. I was just a fledgling, uncertain and doubtful of my own ability. The IBM PC had come out the summer before, a device IBM seemed to regard as little more than a toy. Steve was by profession a physicist.&lt;/p&gt;
&lt;p&gt;Steve noticed the PC had an empty socket on the motherboard, next to the Intel 8088 CPU. He guessed it was for Intel’s 8087 Numeric Data Processor (NDP), also known as a math co-processor, that was designed as a companion to Intel’s 8088/86.&lt;/p&gt;
&lt;p&gt;The CPU could operate perfectly well on its own, but if the NDP was installed, they would both read the same code stream. The CPU would ignore NDP instructions and let the NDP execute them. The NDP would ignore non-NDP instructions and let the CPU execute them. While the 8088/86 is running code, it can’t do anything else. With the NDP, true parallel processing is possible.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/blog/2023/03/programming-the-intel-ndp-in-1983/8087_with_Nickel_003.webp&#34; alt=&#34;Intel 8087 chip imprinted with part numbers and &amp;ldquo;© Intel &amp;lsquo;80 &amp;lsquo;81&amp;rdquo; alongside a U.S. 5¢ piece (nickel) for scale&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;the-plan&#34;&gt;The Plan&lt;/h3&gt;
&lt;p&gt;IBM selected Microsoft to produce its systems software: operating system, compilers, linkers, libraries, macro assembler, etc. Microsoft not only ignored the 8087, it devised a floating-point format incompatible with it. Steve had signed a contract with Intel to be the exclusive distributor of the NDP for a period of years—Intel wasn’t selling any to speak of, so why not?&lt;/p&gt;
&lt;p&gt;Steve’s business plan was to sell a package: an 8087 chip and modifications to IBM (Microsoft) systems software that builds programs (BASIC compiler, FORTRAN compiler, Pascal compiler, and Macro Assembler) so they can generate code for it, and libraries in which the math routines use the 8087 instead of complex, slow math routines in the CPU.&lt;/p&gt;
&lt;p&gt;With the package we created, math-intensive applications would be sped up by anywhere from 2–3 times up to 40 times. The financial advantage to those who wrote their own applications in, say, BASIC, and used our package was compelling.&lt;/p&gt;
&lt;h3 id=&#34;the-platform&#34;&gt;The Platform&lt;/h3&gt;
&lt;p&gt;The computer I was given was a standard IBM PC of early 1983: an Intel 8088 microprocessor running at 4.77 MHz, two 360 KB 5¼-inch full-height floppy disks, 640 KB of RAM, a monochrome monitor, five expansion slots, and PC-DOS 1.1.&lt;/p&gt;
&lt;p&gt;The 8088&amp;rsquo;s 16-bit architecture internally was essentially the same as the 8086, with the difference that it used an 8-bit bus and was cheaper.&lt;/p&gt;
&lt;p&gt;IBM designed an open architecture. In other words, it designed the PC to use all off-the-shelf equipment from other manufacturers, not IBM: chips from Intel, systems software from Microsoft, other chips from elsewhere. This was to be my saving grace, as we shall see below.&lt;/p&gt;
&lt;h3 id=&#34;two-problems-two-solutions-one-package&#34;&gt;Two Problems, Two Solutions, one Package&lt;/h3&gt;
&lt;p&gt;Our guiding design idea was that our users could develop programs in the way they were accustomed to. They could, for example, use the BASIC Interpreter that came as part of the PC ROM BIOS for an iterative, live mode of development. When satisfied, they could save the resulting text file, build it with our patched version of the BASIC compiler and link it with our libraries. They would have bought an 8087 from us, plugged it into the coprocessor slot, and then could launch their executable.&lt;/p&gt;
&lt;p&gt;One customer, for example, was in Kansas. They were commodity traders who had an algorithm written in BASIC. It would take data from all commodity trades during the day and at the end of the day, run the data through their algorithm, and use the result to place trades first thing the next morning. It took 5–6 hours to run, and they got home to their families at 10 or 11 o&amp;rsquo;clock at night.&lt;/p&gt;
&lt;p&gt;With our software modifications and the 8087, it took only about 2 hours to run, so they were home in time for dinner.&lt;/p&gt;
&lt;h3 id=&#34;too-naive-to-fail&#34;&gt;Too Naive To Fail&lt;/h3&gt;
&lt;p&gt;When I first sat down at my PC to work, I didn&amp;rsquo;t know how to turn it on.&lt;/p&gt;
&lt;p&gt;To do my job I had to program in Intel 16-bit assembly language. I not only had never seen any assembly language, I had never seen any computer language before besides FORTRAN and PL/I.&lt;/p&gt;
&lt;p&gt;I was somewhat like the bumblebee. Mathematics has proven that the bumblebee is aerodynamically unable to fly. The bee, however, does not know math, so it flies anyway.&lt;/p&gt;
&lt;p&gt;I sat at my desk and grappled with the complexity before me. At the end of the first week, I felt so hopeless and lost that I thought I would speak to Steve and say, &amp;ldquo;Steve, when we interviewed I misled you. I pretended I am not an idiot. Let&amp;rsquo;s say no more about it. I will slink away silently. You don&amp;rsquo;t even have to pay me.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Then I thought, &amp;ldquo;Steve is a pretty smart man. I will leave it up to him. If he thinks I should leave, he can fire me. Meanwhile, I will stay here and give it everything I&amp;rsquo;ve got.&amp;rdquo;&lt;/p&gt;
&lt;h3 id=&#34;my-tasks&#34;&gt;My Tasks&lt;/h3&gt;
&lt;p&gt;The 8087 had a stack of eight ten-byte floating point registers. It could load and save either four-byte (single) or eight-byte (double) floating point. Steve had written a disassembler using the BASIC interpreter, so I had a printout of the code in the BASIC library. It did not show the source code, but it did show labels of routines and variables.&lt;/p&gt;
&lt;p&gt;Steve had a list of the names of all the math routines in the library. I had to edit each math routine so that it would perform the same functionality as the original, but using the 8087.&lt;/p&gt;
&lt;p&gt;A second requirement had to do with the floating-point format of constants in the source code. The Microsoft compilers generated them in MS-Binary floating point, in the structure &lt;em&gt;exponent + sign bit + mantissa&lt;/em&gt; (or significand). The 8087 used IEEE floating-point, which was structured &lt;em&gt;sign bit + exponent + mantissa&lt;/em&gt;. We patched the compilers so that at the place they would generate floating-point constants, they would generate IEEE-format constants instead.&lt;/p&gt;
&lt;h3 id=&#34;my-advantages&#34;&gt;My Advantages&lt;/h3&gt;
&lt;p&gt;IBM shipped each PC with two ring binders. One explained the BASIC language as implemented in the ROM BIOS. The other was a handbook for the PC, which told everything a person could possibly want to know about the machine, including a printout of the ROM BIOS assembly language source code at the end of the manual: page after page of working code in Intel 8088/86 assembly language.&lt;/p&gt;
&lt;p&gt;I also had an Intel product manual on the 8088/86, including a section on the 8087. That was some of the most dense specifications on the planet, but it contained all the operations and registers, both for the CPU and the NDP.&lt;/p&gt;
&lt;p&gt;Another advantage I had was the debugger, &lt;code&gt;DEBUG.COM&lt;/code&gt;. I would edit a math routine to replace the operations in the CPU with a few simple opcodes for the NDP, since it did all its operations internally, allowing the programmer to use a few NDP instructions to carry out the functionality. I would then use the librarian to replace the given routine in the library with my routine, write a test program in BASIC and build it. Then I would load the executable in the debugger and step through the code. That had two big advantages: One, I got to see the assembly language in action, learning more than a book could ever teach me. Two, I verified that the code actually did what I thought it did. The code we shipped rarely had a bug in it and those were usually minor. Except one.&lt;/p&gt;
&lt;h3 id=&#34;whoops&#34;&gt;Whoops!&lt;/h3&gt;
&lt;p&gt;There was one major bug: error handling. I became aware of it when a customer called in about the failure of our code to catch a division by zero. Some research showed that the first 1024 bytes of RAM contained the Interrupt Vector Table (IVT), 256 four-byte entries containing the segment (two bytes) and offset (two bytes) of the Interrupt Service Routine (ISR). Interrupt INT 0 contained the address of the CPU divide by zero ISR.&lt;/p&gt;
&lt;p&gt;Our software, since it did not use the CPU for division, did not catch a division by zero. This error would generate an IRQ (interrupt request) 13 which Intel had reserved for the math coprocessor. In Intel&amp;rsquo;s product spec, they marked IRQ 13 as Reserved. The IBM engineers, however, had always seen the word &amp;ldquo;Reserved&amp;rdquo; used for things reserved by IBM, so they used IRQ 13 for something else. So I had to write an ISR that would take over the IRQ 13 entry in the IVT, check to see if there was an error in the NDP, and if so, handle it. Otherwise, pass control onto the original ISR.&lt;/p&gt;
&lt;p&gt;Eventually there was a DOS routine to create a chain of ISRs, each of which would determine if the interrupt was something it should handle or else pass it on to the next ISR in the chain. Good cyber-citizens would play nice, and use the DOS routine to get their place in the chain.&lt;/p&gt;
&lt;h3 id=&#34;they-think-they-didnt-get-the-right-test&#34;&gt;They Think They Didn&amp;rsquo;t Get the Right Test&lt;/h3&gt;
&lt;p&gt;The company expanded, leaving the garage far behind and moving into a brick-and-mortar building, one of many at a defunct rope-factory. It employed by this time 40–50 people.&lt;/p&gt;
&lt;p&gt;Intel had marched forward, producing the 80286 (with its companion 80287) and the 80386 (with its companion 80387).&lt;/p&gt;
&lt;p&gt;Steve asked me to write a test for the math chips. I wrote it in C and Intel 16-bit Assembler. The test performed the four standard arithmetic operations—add, subtract, multiply, divide—and also special operations the NDP was capable of, like exponents, logarithms, square roots, trigonometric functions, etc.&lt;/p&gt;
&lt;p&gt;The code tested whether the answers calculated by the chip came out within a narrow range, since it is not possible to test for an exact result with floating-point numbers that can be &amp;ldquo;right&amp;rdquo; but differ in the least significant bits of the mantissa. I named it 87TEST.EXE. It shipped with every NDP we sold: 8087, 80287, 80387.&lt;/p&gt;
&lt;p&gt;We began getting calls from customers who had bought an 80287 or 80387, complaining that they had received the wrong test. Someone would have to explain that the same executable with the same code tested all variants of the NDP. These calls were costing the company money to reassure the customers, so I wrote a new version of the test which determined which CPU and which NDP it was running on.&lt;/p&gt;
&lt;p&gt;The OS was MS-DOS, a character-based system. I used the advanced ROM-BIOS character set to &amp;ldquo;draw&amp;rdquo; images representing both chips, each casting a &amp;ldquo;shadow&amp;rdquo; to seem three-dimensional, and each labeled with the number of the chip. For example, one &amp;ldquo;image&amp;rdquo; could be labeled 80286 and the other 80287.&lt;/p&gt;
&lt;p&gt;In order to gain customer confidence these had to be accurate. Later models of these chips had instructions whereby you could ask the chip, &amp;ldquo;What are you?&amp;rdquo; and it would return its version number. Earlier variants did not have these instructions, but for the most part I found characteristics I could test for to determine the version.&lt;/p&gt;
&lt;p&gt;With the 8088 and 8086, however, they both used exactly the same instruction set. I racked my brain to find a difference and could not. I turned to my dog-eared copy of the 8088/86 Intel product manual and pored through it. Finally, I found a difference: the 8088 had a four-byte prefetch queue and the 8086 had a six-byte one.&lt;/p&gt;
&lt;p&gt;I solved the problem by writing self-modifying code, which was a huge no-no according to Intel. It used 6 bytes in the code segment, with a constant defined in the 6th byte. I cleared the prefetch queue by doing a jump to the lead instruction. Thus, the prefetch queue would contain four bytes and the sixth byte would still be in memory (8088) or all six bytes would be in the pre-fetch queue (8086). The first instruction moved a different constant into the 6th byte. In an 8088, the 6th byte in memory would be changed and in the 8086 the 6th byte would be modified in the prefetch queue and remain untouched in memory. Then I would test that 6th byte: changed = 8088 and unchanged = 8086.&lt;/p&gt;
&lt;p&gt;At last my search to correctly identify the CPU and its companion NDP was over. The test program was complete.&lt;/p&gt;
&lt;h3 id=&#34;summary&#34;&gt;Summary&lt;/h3&gt;
&lt;p&gt;I had to make do with the Intel product manual, the IBM PC manual, the IBM debugger, and tools my own company had created. Google did not exist, and for that matter, the Internet as we know it today did not exist. There was no plethora of instructional videos, as are widely available today.&lt;/p&gt;
&lt;p&gt;Success required above all persistence and resourcefulness. I do not deny that native ability and education are important, but problem-solving in the IT world succeeds when we accept a challenge and strive to achieve what we never thought possible.&lt;/p&gt;
&lt;p&gt;We adapt, we improvise, we overcome. Failure is not an option!&lt;/p&gt;
&lt;h3 id=&#34;references&#34;&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/IBM_Personal_Computer&#34;&gt;IBM PC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://philipstorr.id.au/pcbook/book2/irq.htm&#34;&gt;PC Hardware&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </content>
    </entry>
  
    <entry>
      <title>Data Center Relocation Initiatives: Daunting But Achievable</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2018/12/data_center_relocation_initiatives_daunting_but_achievable/"/>
      <id>https://www.endpointdev.com/blog/2018/12/data_center_relocation_initiatives_daunting_but_achievable/</id>
      <published>2018-12-20T00:00:00+00:00</published>
      <author>
        <name>Charles Chang</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2018/12/data_center_relocation_initiatives_daunting_but_achievable/banner.jpg&#34; alt=&#34;Datacenter room&#34;&gt;
&lt;a href=&#34;https://www.flickr.com/photos/seeweb/9771315606/&#34;&gt;Photo by Seeweb · CC BY-SA 2.0, cropped&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;A customer asked for our help dealing with logistical nightmares they encountered during a hardware update and data center relocation project. The customer had two active data centers, and wanted to relocate one of them to a modern Tier 4 facility to improve its performance and provide redundancy for critical systems. They also wanted to consolidate or decommission equipment to reduce recurring expenses and reduce their carbon footprint. The client decided to move to a Tier 4 data center because they provide across-​the-​board redundancy within the data center.&lt;/p&gt;
&lt;h3 id=&#34;moving-forward-with-tier-iv&#34;&gt;Moving forward with Tier IV&lt;/h3&gt;
&lt;p&gt;
&lt;img align=&#34;right&#34; src=&#34;/blog/2018/12/data_center_relocation_initiatives_daunting_but_achievable/data-center-1.jpg&#34; style=&#34;margin: 1em&#34; width=&#34;200&#34;&gt;
Enterprises typically transition to Tier 4 data centers because they offer the highest uptime guarantees, and have no single points of failure. These facilities are fully redundant in terms of electrical circuits, cooling, and networking. This architecture is best able to withstand even the most serious technical incidents without server availability being affected. Tier IV facilities have contracts with disaster management companies who will provide them, for example, with fuel in the event that a natural disaster damages the power grid.
&lt;/p&gt;
&lt;p&gt;(More information about the four data center levels is at the end of this post.)&lt;/p&gt;
&lt;h3 id=&#34;key-issues&#34;&gt;Key Issues&lt;/h3&gt;
&lt;p&gt;Some of the customer’s key concerns were:&lt;/p&gt;
&lt;p&gt;1. To safely move their virtual environment to the new data center.&lt;/p&gt;
&lt;p&gt;2. To protect assets during the relocation.&lt;/p&gt;
&lt;p&gt;3. To completely shut down the current data center and migrate seamlessly to the new data center.&lt;/p&gt;
&lt;p&gt;4. To update external DNS records without causing any downtime for the web applications used by their customers.&lt;/p&gt;
&lt;h3 id=&#34;project-planning&#34;&gt;Project Planning&lt;/h3&gt;
&lt;p&gt;To manage data center relocations is challenging because there are many moving parts and variables. Typically, planning starts 6 months ahead of the scheduled relocation date. We seek to understand the role of each system by consulting in-depth with all the teams involved. We analyze each part of the client’s tech infrastructure, break it down, and strategize about the best approach for handling the migration of each component. Additional time to plan can help especially when a large group of stakeholders is involved. Successful planning requires hard and sometimes extensive work, but makes an otherwise overwhelming data center migration smooth and worry free.&lt;/p&gt;
&lt;p&gt;Here are some of our procedures for pre-​migration preparation:&lt;/p&gt;
&lt;p&gt;1. Process the paperwork for new hardware. Identify, review, and approve all applications. Hire movers. Schedule and coordinate with internal management and key stakeholders like IT staff, system admins, contractors, circuit providers, etc.&lt;img align=&#34;right&#34; src=&#34;/blog/2018/12/data_center_relocation_initiatives_daunting_but_achievable/data-center-2.jpg&#34; style=&#34;margin: 1em&#34; width=&#34;200&#34;/&gt;&lt;/p&gt;
&lt;p&gt;2. Collect and analyze resource usage associated with the critical and non-critical systems and compare resource needs to resource availability at the new facility.&lt;/p&gt;
&lt;p&gt;3. Design and schedule the migration of critical systems to the new data center. Discuss the plan with key stakeholders.&lt;/p&gt;
&lt;p&gt;4. Make sure replicas of critical systems are up to date.&lt;/p&gt;
&lt;p&gt;5. Set up a new environment with new hardware in the new data center and establish network connections.&lt;/p&gt;
&lt;p&gt;6. Prepare hardware and virtualization technology in the new data center.&lt;/p&gt;
&lt;p&gt;7. Test, retest, and burn in the new hardware (2–4 weeks of testing).&lt;/p&gt;
&lt;p&gt;8. Create a non-​essential server within the virtualization environment and test it.&lt;/p&gt;
&lt;h3 id=&#34;a-challenge-eliminating-downtime&#34;&gt;A Challenge: Eliminating Downtime&lt;/h3&gt;
&lt;img align=&#34;right&#34; src=&#34;/blog/2018/12/data_center_relocation_initiatives_daunting_but_achievable/data-center-3.jpg&#34; style=&#34;margin: 1em&#34; width=&#34;200&#34;/&gt;
&lt;p&gt;To minimize or eliminate downtime requires very careful preparation. With this particular client, we had the luxury of their already having a secondary data center, which could accommodate a majority of the critical systems during the migration.&lt;/p&gt;
&lt;p&gt;We originally planned to leverage this by simply changing the external DNS records to point to this data center during the migration, but during planning determined that the external DNS record would not replicate worldwide quickly enough to meet the uptime needs of their global operation.&lt;/p&gt;
&lt;h3 id=&#34;solutions&#34;&gt;Solutions&lt;/h3&gt;
&lt;p&gt;After discussing various approaches, we ended up using a load balancer. A load balancer is a network device that routes incoming traffic destined for a single destination (web site, application, or service) and ‘shares’ the incoming connections across multiple destination devices or services. In this case, the data center we were to migrate to housed the client’s critical systems like web servers, database, etc. The secondary data center housed a replica of the critical systems using a replication technology, e.g. Actifio, Rubrik, SAN mirroring, VMWare SRM, or Zerto — we used Actifio in this scenario.
&lt;img align=&#34;right&#34; src=&#34;/blog/2018/12/data_center_relocation_initiatives_daunting_but_achievable/data-center-4.jpg&#34; style=&#34;margin: 1em&#34; width=&#34;200&#34;/&gt;&lt;/p&gt;
&lt;p&gt;The customer had multiple systems with external DNS records and public IP addresses. We did not change the public DNS names for the critical systems. We did change the public IP addresses associated with the public DNS names, to point to the load balancer, which then pointed to the appropriate data center throughout the process. This setup enabled a gradual, flexible, and fully controlled transition to the new data center.&lt;/p&gt;
&lt;h3 id=&#34;summary&#34;&gt;Summary&lt;/h3&gt;
&lt;img align=&#34;right&#34; src=&#34;/blog/2018/12/data_center_relocation_initiatives_daunting_but_achievable/data-center-5.jpg&#34; style=&#34;margin: 1em&#34; width=&#34;200&#34;/&gt;
&lt;p&gt;Our client wanted to reduce their servers’ power usage 40% by consolidating into a hyper-​converged system. Other goals were to reduce floor space by 50%, and monthly recurring data center charges by 50%. We transitioned them to a new hardware stack (compute, storage, network, backup environment) in a Tier 4 data center, and saved them 50% percent on data center operation costs. Additionally, during the process we corrected issues associated with disaster recovery and business continuity, leaving the client’s operations more resilient, affordable, and more secure.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;appendix-data-center-classifications&#34;&gt;Appendix: Data Center Classifications&lt;/h3&gt;
&lt;h4 id=&#34;tier-iv-best&#34;&gt;Tier IV (Best)&lt;/h4&gt;
&lt;p&gt;Tier IV data centers have redundancies for every process and data protection stream. No single outage or error can shut down the system. To keep Tier IV ranking, data centers must have 99.995% minimum uptime per year. They come equipped with 2N+1 infrastructure (two times the amount required for operation plus a backup), which is considered “fully redundant.”&lt;/p&gt;
&lt;h4 id=&#34;tier-iii-average&#34;&gt;Tier III (Average)&lt;/h4&gt;
&lt;p&gt;N+1 (the amount required for operation plus a backup) fault tolerance, which means a Tier III facility can undergo routine maintenance without a hiccup in operations. 99.982% minimum uptime per annum, used for maintenance and overwhelming emergencies.&lt;/p&gt;
&lt;h4 id=&#34;tier-ii-minimal&#34;&gt;Tier II (Minimal)&lt;/h4&gt;
&lt;p&gt;99.749% minimum uptime. Tier II facilities have considerably more downtime than Tier III facilities, primarily because Tier II facilities have less redundancy. They do however have partial cooling redundancy and multiple power redundancies.&lt;/p&gt;
&lt;h4 id=&#34;tier-i-basic-cheapest&#34;&gt;Tier I (Basic, Cheapest)&lt;/h4&gt;
&lt;p&gt;99.671% minimum uptime, with 28.8 hours of downtime each year.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Hue’s on First: How we used responsive bulbs to join software and hardware for a busy medical practice</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2016/03/hues-on-first/"/>
      <id>https://www.endpointdev.com/blog/2016/03/hues-on-first/</id>
      <published>2016-03-14T00:00:00+00:00</published>
      <author>
        <name>Liz Flyntz</name>
      </author>
      <content type="html">
        &lt;div class=&#34;separator&#34; style=&#34;clear: both; text-align: center;&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;/blog/2016/03/hues-on-first/FastTrackoffice.jpg&#34;/&gt;&lt;/div&gt;
&lt;p&gt;In 2014 we began working with a busy bariatric surgery office in Long Island to create a system that would allow the practice to better manage doctor paging and patient wait time. By placing a responsive, color-coded light bulb and tablet outside each examination room, the staff could see which rooms were empty, which were occupied by a patient waiting on a specific doctor, and in which a doctor-patient consultation was in process. Outside each room is a tablet with information including the patient number, the attending doctor’s name, and the wait time.&lt;/p&gt;
&lt;div class=&#34;separator&#34; style=&#34;clear: both; text-align: center;&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;/blog/2016/03/hues-on-first/FastTrackmapmonitor.jpg&#34;/&gt;&lt;/div&gt;
&lt;p&gt;In addition to providing a comprehensive, granular paging service for doctors, Fast Track also provides feedback to the practice. This feedback includes average patient wait times per doctor, per time of day, and per procedure. This allows the practice to make necessary changes and increase patient satisfaction and peace of mind.&lt;/p&gt;
&lt;div class=&#34;separator&#34; style=&#34;clear: both; text-align: center;&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;/blog/2016/03/hues-on-first/FastTrackapp.jpg&#34;/&gt;&lt;/div&gt;
&lt;p&gt;I asked Danny Divita, one of the main developers on this project, to tell us more about the &lt;a href=&#34;http://www2.meethue.com/en-us/&#34;&gt;Hue&lt;/a&gt;/ &lt;a href=&#34;https://web.archive.org/web/20180107115334/http://www.fasttrackmed.com/&#34;&gt;FastTrack&lt;/a&gt; interface.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;LF: Describe the project for which we used Hue bulbs. What were all the pieces that needed fitting together?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;DD: The Hue bulbs are being used for a bariatric clinic to alert the staff when pages are sent to of pages to specific rooms. Alongside the lights the API also has to work with a RF device-locating API. The RF API had to be coordinated with the Hue light API to coordinate changing colors, alerts, and states.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;LF: Why were Hue bulbs a good solution for the problem of creating an easy-to-understand, integratable visual alert system? Did you consider any alternatives?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;DD: From a cost perspective and ease of integration the bulbs were a good solution for this project. There are other solutions, but they are more costly and the integration would have taken longer.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;LF: How did you hear about Hue bulbs? Was the API easy to access and work with? How was using Hue’s testing environment?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;DD: The client suggested the bulbs during their research before having us develop their application. The API is extremely easy to work with and well documented. The Hue API has a built-in testing feature that made it easy to understand the API and develop around it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;LF: What was the most difficult thing about integrating this technology? Can you think of any other commercial implementations of these bulbs? Specifically in the medical industry?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;DD: The most difficult aspect was trying to come up with a good alert (blinking) feature. The API has some built in alerts, but they are limited to a set timed interval. We had to develop around this to ensure the alerts stayed constant and did not time out. Another application for these lights in the medical field could be to indicate severity of a situation or condition. Because the lights can change color, the applications can signal the proper response for the staff.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;LF: Did you write any new software for this project? Is that work available to other developers?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;DD: We used a third party library that helps to manage stateless workflows. Our application expanded upon this library to design a workflow engine that manages paging the staff, Hue lights, and RF device locating.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Nvidia: Invalid or Corrupted Push Buffer Stream</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2015/04/nvidia-invalid-or-corrupted-push-buffer/"/>
      <id>https://www.endpointdev.com/blog/2015/04/nvidia-invalid-or-corrupted-push-buffer/</id>
      <published>2015-04-20T00:00:00+00:00</published>
      <author>
        <name>Neil Elliott</name>
      </author>
      <content type="html">
        &lt;p&gt;As a high-performance video rendering appliance, the Liquid Galaxy requires really good video cards—​better than your typical on-board integrated video cards. Despite ongoing attempts by competitors to displace them, Nvidia remains the best choice for high-end video, if you use the proprietary Nvidia driver for Linux.&lt;/p&gt;
&lt;p&gt;In addition to providing regular security and system updates, End Point typically provides advanced remote monitoring of our customers’ systems for issues such as unanticipated application behavior, driver issues, and hardware errors. One particularly persistent issue presents as an error with an Nvidia kernel module.  Unfortunately, relying on proprietary Nvidia drivers so as to maintain an acceptable performance level limits the available diagnostic information and options for resolution.&lt;/p&gt;
&lt;p&gt;The issue presents when the system ceases all video output functions as Xorg crashes. The kernel log contains the following error message:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2015-04-14T19:59:00.000083+00:00 lg2 kernel: [  719.850677] NVRM: Xid (0000:01:00): 32, Channel ID 00000003 intr 02000000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The message is repeated approximately 11000 times every second until the disk fills and the ability to log in to the system is lost. The only known resolution at this time is to power-cycle the affected machine. In the error state, the module cannot be removed from the kernel, which also prevents Linux from shutting down properly. All affected systems were running some version of Ubuntu x86-64. The issue seems to be independent of driver version, but is at least present in 343.36 and 340.65, and affects all Geforce cards. Quadro cards seem unaffected.&lt;/p&gt;
&lt;p&gt;The Xid message in the kernel log contains an error code that provides a little more information. The &lt;a href=&#34;http://docs.nvidia.com/deploy/xid-errors/&#34;&gt;Nvidia docs&lt;/a&gt; list the error as “Invalid or corrupted push buffer stream”. Possible causes listed include driver error, system memory corruption, bus error, thermal error, or frame buffer error. All affected systems were equipped with ECC RAM and were within normal operating temperature range when the issue presented.&lt;/p&gt;
&lt;p&gt;Dealing with bugs like these can be arduous, but until they can be fixed, we cope by monitoring and responding to problems as quickly as possible.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Leap Motion Controller &#43; Liquid Galaxy</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2013/04/leap-motion-controller-liquid-galaxy/"/>
      <id>https://www.endpointdev.com/blog/2013/04/leap-motion-controller-liquid-galaxy/</id>
      <published>2013-04-23T00:00:00+00:00</published>
      <author>
        <name>Dave Jenkins</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;object align=&#34;right&#34; height=&#34;315&#34; width=&#34;420&#34;&gt;&lt;iframe width=&#34;420&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/gy9K1LEnd0Q&#34; frameborder=&#34;0&#34; allow=&#34;autoplay; encrypted-media&#34; allowfullscreen&gt;&lt;/iframe&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;We’re constantly trying out new things with our Liquid Galaxy at End Point: new content types, new remote management scripts, new hardware. The good people at &lt;a href=&#34;https://www.leapmotion.com/&#34;&gt;Leap Motion&lt;/a&gt; sent over one of their hand motion controllers and we couldn’t wait to get it unpacked and driving the Liquid Galaxy that sits in our office.&lt;/p&gt;
&lt;p&gt;With access to developer tools, we were able to configure the Leap Motion and update the device firmware. Then, after a quick installation of the latest Google Earth build v 7.1.1.1550 that includes Leap Motion controller support, we were ready to test out the new device on our 7-screen Liquid Galaxy.&lt;/p&gt;
&lt;p&gt;Watch the video and see for yourself—​we think the combination is fantastic! That superhero feeling of flying around the world with a Liquid Galaxy is only enhanced that much more by now commanding the movement of the planet with subtle flexing of your fingers. (That’s Kiel in the video—​personally, I think he looks like Magneto without the helmet.)&lt;/p&gt;
&lt;p&gt;End Point continues to push the boundaries on what the Liquid Galaxy can do. We want to experiment some more and see what else might be possible with the Leap Motion controller for Google Street View, panoramic photos, videos, and maybe even games. If you’ve got an idea, or if you have a cool place where this might be deployed, please contact us!&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Are you sure you want a MacBook Pro?</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2012/07/are-you-sure-you-want-macbook-pro/"/>
      <id>https://www.endpointdev.com/blog/2012/07/are-you-sure-you-want-macbook-pro/</id>
      <published>2012-07-30T00:00:00+00:00</published>
      <author>
        <name>Brian Buchalter</name>
      </author>
      <content type="html">
        &lt;p&gt;The “UltraBooks” trend has been been made popular by Apple’s efforts at making the computer an appliance. There are clear benefits to this, but for enthusiasts, it means less control to upgrade to hardware of their choosing. Let’s contrast this experience with my own &lt;a href=&#34;https://www.dell.com/en-us/work/shop/cty/pdp/spd/vostro-3500&#34;&gt;Dell Vostro 3500&lt;/a&gt;. It was purchased two years ago and yet through upgrades, it has many features the recently refreshed &lt;a href=&#34;https://web.archive.org/web/20120728201149/http://www.apple.com/macbook-pro/specs/&#34;&gt;MacBook Pro with Retina display&lt;/a&gt; lacks, while offering the same processing power.&lt;/p&gt;
&lt;h3 id=&#34;macbook-pro-advantages&#34;&gt;MacBook Pro Advantages&lt;/h3&gt;
&lt;p&gt;Let’s be clear, the MacBook Pro (MBP) has a number advantages over my Dell. The Retina display of course trounces my 1376×768 resolution on a 15&amp;quot; display. For designers, photographers, and video editors, Retina is a great asset. For someone who spends their day inside Vim and SSH, not so much. Similarly, the MBP’s seven hour battery life is impressive, although I’m sure with my processor intensive work load, it would be lower. But for me, I’m not terribly mobile. I need to be mobile from room to room perhaps, but I don’t find myself without power and needing to complete mission critical work less frequently than my replaceable 90 watt-hour battery can provide over 3 to 4 hours. Similarly, weight is not my number one concern; I simply stash the laptop in my backpack and go.&lt;/p&gt;
&lt;h3 id=&#34;incremental-upgrades&#34;&gt;Incremental Upgrades&lt;/h3&gt;
&lt;p&gt;With my Dell, I purchased the baseline Vostro 3500 for $1,000 which included next business day service and &lt;strong&gt;accidental damage protection&lt;/strong&gt; for &lt;strong&gt;three years&lt;/strong&gt;. This means for parts which I cannot easily replace myself, like the display and motherboard, I’m covered. Over the years, I’ve upgraded the:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;processor to an &lt;a href=&#34;https://ark.intel.com/products/49652/Intel-Core-i5-580M-Processor-(3M-Cache-2_66-GHz)&#34;&gt;i5-580M&lt;/a&gt;, with Turbo Boost up 3.3GHz. Great for single threaded Ruby ($225).&lt;/li&gt;
&lt;li&gt;wireless card to an &lt;a href=&#34;https://www.intel.com/products/wireless/adapters/5000/index.htm&#34;&gt;Intel Wifi Link 5300&lt;/a&gt; for better signal strength and 802.11n support ($42).&lt;/li&gt;
&lt;li&gt;65whr battery at its end of life with a 90whr battery ($160 ouch!).&lt;/li&gt;
&lt;li&gt;original HDD with a 160GB &lt;a href=&#34;https://www.intel.com/content/www/us/en/support/products/56553/memory-and-storage/legacy-consumer-ssds/intel-ssd-320-series.html&#34;&gt;Intel 320 series SSD&lt;/a&gt; ($220).&lt;/li&gt;
&lt;li&gt;optical drive with a 2.5” &lt;a href=&#34;http://www.newmodeus.com/shop/index.php?main_page=product_info&amp;amp;products_id=309&#34;&gt;drive caddy&lt;/a&gt; ($52) and a 500GB &lt;a href=&#34;https://web.archive.org/web/20120727024849/http://www.seagate.com/internal-hard-drives/laptop-hard-drives/momentus-xt-hybrid/&#34;&gt;Seagate Momentus XT Hybrid&lt;/a&gt; drive ($150).&lt;/li&gt;
&lt;li&gt;RAM to 8GB ($99).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For $950 of upgrades over two years, I’ve got a machine with specs that are powerful in the places I care about, at a price I can afford and pay for incrementally. To get the same processor and warranty on the MacBook Pro, I need to shell out $3,150 and give up my eSATA, HDMI, VGA, PCI-Express, Gigabit Ethernet ports and 500GB of storage (&lt;a href=&#34;https://www.newegg.com/Product/Product.aspx?Item=N82E16822136545&#34;&gt;upgradable to 1TB for $100&lt;/a&gt;). In short, I’m expected to pay a premium price for features which aren’t of my choosing, while giving up ports.&lt;/p&gt;
&lt;p&gt;While this might not be possible for all people, developers should look long and hard at what it is they value in their workstation and not blindly accept whatever Apple hypes. You might find you don’t care quite as much about the “features” Apple wants you to.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Guide to Ubuntu 11.10 on a Samsung Netbook</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2012/04/linux-samsung-netbook-guide-brightness/"/>
      <id>https://www.endpointdev.com/blog/2012/04/linux-samsung-netbook-guide-brightness/</id>
      <published>2012-04-08T00:00:00+00:00</published>
      <author>
        <name>Brian Buchalter</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;strong&gt;12.04 UPDATE&lt;/strong&gt;: Unsurprisingly, after installing 12.04 which includes the 3.2.x kernel, brightness controls work perfectly out of the box. Sadly, it’s still necessary to tweak modprobe to get wireless working after a suspend/​resume. Also, don’t forget to reboot after making the changes!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;After reading a few too many reviews about netbook hardware and its compatibility with Linux, I settled on a Samsung NF310 netbook. However, like all things worth doing, it wasn’t nearly as easy as I’d hoped. This post highlights some of the lessons learned from my first days with Linux on my Samsung netbook.&lt;/p&gt;
&lt;h3 id=&#34;pre-installation&#34;&gt;Pre-Installation&lt;/h3&gt;
&lt;p&gt;I had been eagerly awaiting the arrival of my new hardware and had already gotten a fresh copy of Fedora 16 ready. The crippled Windows 7 Starter Edition was going to be off that netbook as a first order of business, as a matter of principle. If I had it to do over again, I would have installed the Windows-only BIOS update for the Netbook first. I’m working through using BartPE, but the installation onto the USB drive hasn’t gone well. Best to do these kinds of Windows-only activities while Windows is still easily available.&lt;/p&gt;
&lt;p&gt;Additionally, I would have used &lt;a href=&#34;http://www.pendrivelinux.com/yumi-multiboot-usb-creator/&#34;&gt;YUMI multiboot USB creator&lt;/a&gt; to put on a copy of &lt;a href=&#34;http://www.ultimatebootcd.com/&#34;&gt;Ultimate Boot CD&lt;/a&gt; as well as a handful of live Linux distros for testing. When I later had issues installing, I found myself wondering, is it the hardware? I ended up going back and running the tests (which passed), but had I done this first, I would not have been distracted from the real problem.&lt;/p&gt;
&lt;h3 id=&#34;installation&#34;&gt;Installation&lt;/h3&gt;
&lt;p&gt;Aside from choosing a distro, I found getting the installation to complete successfully to be a chore. It seems the disk’s partition table was GPT and so both Ubuntu and Fedora’s installation processes failed.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ext4 Filesystem check failure on/dev/mapper/vgsamsungnetbook-lvroot:&lt;/p&gt;
&lt;p&gt;Operational error.&lt;/p&gt;
&lt;p&gt;Errors like this usually mean there is a problem with the filesystem that will require user interaction to repair. Before restarting installation reboot to rescue mode or another system that allows you to repair the filesystem interactively. Restart installation after you have corrected the problems on the filesystem.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;You can see how an error like this might prompt you to run hardware checks. To work around this, simply fire up one of the Live CD installations on your YUMI stick and offer Linux the following incantation:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;parted
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mklabel msdos
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;quit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;test-driving-fedora-16&#34;&gt;Test Driving Fedora 16&lt;/h3&gt;
&lt;p&gt;After getting past installation issues, I loaded Fedora 16’s XCFE spin. Despite the dual core Atom processors and the 2GB RAM, I was looking for a lightweight distro; snappy UI and battery life were my first concerns and I knew less demands from the OS would leave more resources for the work I wanted to do.&lt;/p&gt;
&lt;p&gt;The sparse XCFE desktop experience offered few bells and whistles but exactly what (I thought) I wanted. It was responsive and stayed out of the way. However, I quickly discovered that after resuming from suspend, my wireless connection would not work. Was this Fedora? Was this the kernel? Was this hardware failure? Only trial and error would help me figure it out&amp;hellip;&lt;/p&gt;
&lt;h3 id=&#34;troubleshooting-wireless-connectivity-after-resume&#34;&gt;Troubleshooting wireless connectivity after resume&lt;/h3&gt;
&lt;p&gt;The Samsung came with a Broadcom chip, which was recognized by Fedora, but I have a low opinion of Broadcom hardware and know that its driver support is relatively new in the kernel mainline. I noticed kernel errors related to the driver and decided to swap out my other laptop’s Intel Ultimate N Wifi Link 5300 card and see what happened. To Linux’s credit, it detected the new hardware without a hitch and connected right away after booting. However, upon another round of suspend/resume, wireless connectivity couldn’t be established.&lt;/p&gt;
&lt;p&gt;Next, I decided to see if this could be a distro issue. I tried Ubuntu 11.10 to find this was not an issue with a particular distro. Of course with both attempts I fully patched all the software, so I didn’t think it a kernel issue; Fedora was running the 3.3 kernel!&lt;/p&gt;
&lt;p&gt;Sadly, it’s 2012 and Linux still can’t handle simple power management issues out the box. Fortunately for you, lucky reader, I have the magic incantations you need to have wireless network connectivity after suspend/resume. I knew I couldn’t be the only one experiencing the issue but was simply blown away this wasn’t better documented. As always, log files tend to be the best source for searching Google; results seem more accurate and from more authoritative sources. Here’s what I was seeing from /var/log/kern.log after resuming:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kernel: [  326.394858] wlan0: direct probe to 00:13:10:9e:88:5f (try 1/3)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kernel: [  326.592242] wlan0: direct probe to 00:13:10:9e:88:5f (try 2/3)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kernel: [  326.792214] wlan0: direct probe to 00:13:10:9e:88:5f (try 3/3)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kernel: [  326.992198] wlan0: direct probe to 00:13:10:9e:88:5f timed out&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;fixing-wireless-connectivity-after-suspendresume&#34;&gt;Fixing Wireless Connectivity after suspend/resume&lt;/h3&gt;
&lt;p&gt;After a long and winding hunt through Launchpad bug reports and unhelpful forum threads, the first step is to identify which kernel module is providing your wifi driver.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lspci -k | grep -i -E &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;network|wireless|wifi|wlan|802.11&amp;#34;&lt;/span&gt; -A3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;#my output...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;05:00.0 Network controller: Intel Corporation Ultimate N WiFi Link &lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;5300&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Subsystem: Intel Corporation Device &lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;1101&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Kernel driver in use: iwlwifi
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Kernel modules: iwlwifi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;On my machine, it was the &lt;strong&gt;iwlwifi&lt;/strong&gt; module responsible for wireless. Armed with the module name, we now need just one simple line, in one simple file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;# /etc/modprobe.d/iwl.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;options iwlwifi &lt;span style=&#34;color:#369&#34;&gt;bt_coex_active&lt;/span&gt;=&lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With that simple modification AND A REBOOT—​Linux sanity is restored. The wireless works perfectly (and quite quickly) after resume.&lt;/p&gt;
&lt;p&gt;For those who don’t happen to be using the iwlwifi module, it’s not obvious what the modprobe.d config file naming conventions are, but in general, Googling for your kernel module name plus bt_coex_active=0 should yield something useful.&lt;/p&gt;
&lt;h3 id=&#34;samsung-screen-brightness-control-out-of-control&#34;&gt;Samsung screen brightness control, out of control&lt;/h3&gt;
&lt;p&gt;After having made the switch to Ubuntu to help troubleshoot my wireless issues, I found that the screen brightness would occasionally start randomly cycling through various levels repeatedly and rapidly. To stop this behavior temporarily, I found I could jump to a tty session by pressing ALT+F2 and return to X with ALT+F7.&lt;/p&gt;
&lt;p&gt;For a more permanent fix, a kernel upgrade was required. While, Ubuntu 11.10’s stock 3.0.x kernel did not include the fixed “samsung_laptop” modules, the 3.2.x kernel did. Fortunately, with the upcoming 12.04 release, the 3.2.x kernel is actively being packaged for Ubuntu and can be downloaded from kernel.ubuntu.com. More specifically, you can &lt;a href=&#34;http://kernel.ubuntu.com/~kernel-ppa/mainline/&#34;&gt;browse the available kernel packages&lt;/a&gt; and choose your release of choice. Because I knew 3.2.x was going to be supported for the 12.04 release and I was looking for stability and didn’t see any must-have features in the 3.3.x kernel, I went with these downloads and installations:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;# 64 bit installation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;su
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#038&#34;&gt;cd&lt;/span&gt; ~
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir src
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.2.14-precise/linux-headers-3.2.14-030214_3.2.14-030214.201204021356_all.deb http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.2.14-precise/linux-headers-3.2.14-030214-generic_3.2.14-030214.201204021356_amd64.deb http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.2.14-precise/linux-image-3.2.14-030214-generic_3.2.14-030214.201204021356_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dpkg -i linux-headers-3.2.14-030214_3.2.14-030214.201204021356_all.deb linux-headers-3.2.14-030214-generic_3.2.14-030214.201204021356_amd64.deb linux-image-3.2.14-030214-generic_3.2.14-030214.201204021356_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;reboot&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After updating the kernel the screen brightness worked flawlessly and updating the kernel this way seemed more reasonable than compiling. However, I did notice that Update Manager wanted to reinstall the stock kernel. Running these lines as root will prevent that:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#038&#34;&gt;echo&lt;/span&gt; linux-generic hold | dpkg --set-selections
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#038&#34;&gt;echo&lt;/span&gt; linux-headers-generic hold | dpkg --set-selections
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#038&#34;&gt;echo&lt;/span&gt; linux-image-generic hold | dpkg --set-selections&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&#34;choosing-a-distro-and-desktop-shell&#34;&gt;Choosing a Distro and Desktop Shell&lt;/h3&gt;
&lt;p&gt;While I had originally planned to use Fedora 16 XFCE spin, I find myself wanting to stay with Ubuntu and Unity. The polish in the interface may be worth a bit of lag, and it seems it’s easy enough to switch shells at login with the little gear icon next to your username. You can easily &lt;a href=&#34;http://www.techdrivein.com/2011/05/top-4-lightweight-official-ubuntu-based.html&#34;&gt;add additional shells&lt;/a&gt; and experiment with what works for you.&lt;/p&gt;
&lt;p&gt;Unity2D works reasonably well, despite a bit of delay. Moreover, &lt;a href=&#34;https://askubuntu.com/questions/38772/what-lenses-for-unity-are-available&#34;&gt;adding lenses to Dash&lt;/a&gt; seems like it will make the interface even more usable. I guess I did want some of the bells and whistles, but not always, especially when I need to save battery life. But isn’t this kind of flexibility the point of Linux and Free software in general?&lt;/p&gt;
&lt;h3 id=&#34;closing-thoughts-macbook-air-alternative&#34;&gt;Closing thoughts: MacBook Air alternative?&lt;/h3&gt;
&lt;p&gt;Several times over the last few days of banging my head against the wall, I found myself thinking about Apple’s MacBook Air. It’s hard to argue the hardware is world class and OS X can be made to do most things a Linux distro can, while providing rock-solid power and device management with a slick UI. However, I just couldn’t bring myself to shell out $999 upfront, with the obligatory because-you’re-on-your-own-without AppleCare ($249), plus all the little Apple lock-in-gotchas that I knew were down the road.&lt;/p&gt;
&lt;p&gt;Instead, I paid $315 for hardware that I can actually modify with additional batteries ($75/each/4hrs life) and a &lt;a href=&#34;https://www.newegg.com/Product/Product.aspx?Item=N82E16820167046&#34;&gt;SSD upgrade ($85 for 40 GB)&lt;/a&gt;. I guess the bottom line is, if you’re a developer, or a system administrator, it may seem like the Apple product is a way to avoid the pain of running Linux on something other than a server. However, by deciding to fight the good fight, I’ve saved $773 (after planned upgrades!) but spent 20 hours of time, which means I paid myself about $40/hour to learn a few things. That’s a great rate of return and now that the pain is over, it all seems worth it.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Two Cool Things about Liquid Galaxy</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2010/10/two-cool-things-about-liquid-galaxy/"/>
      <id>https://www.endpointdev.com/blog/2010/10/two-cool-things-about-liquid-galaxy/</id>
      <published>2010-10-04T00:00:00+00:00</published>
      <author>
        <name>Benjamin Goldstein</name>
      </author>
      <content type="html">
        &lt;p&gt;I. It uses COTS Hardware.&lt;/p&gt;
&lt;p&gt;Liquid Galaxy is suitable for using with COTS (Commodity Off The Shelf) hardware. Yes, Google Earth itself is rather resource intensive, so it helps performance to use feisty computers (including ones with SSDs) but it’s still COTS hardware. Of course the very cool thing about using COTS hardware is that the price is right and gets better all the time.&lt;/p&gt;
&lt;p&gt;II. A simple, elegant and powerful master/​slave configuration and communication approach&lt;/p&gt;
&lt;p&gt;Liquid Galaxy works by configuring its “slave” systems to have offsets from the point of view of the master system that the system’s user navigates on. The slave systems “know” their locations relative to the master system. The master system broadcasts its location to the slaves via UDP packets. It’s then up to the slave systems to figure out what portion of a Google Earth globe they need to retrieve themselves relative to the coordinates broadcast from the master system.&lt;/p&gt;
&lt;p&gt;With this approach it’s easy to scale to a large number of slave systems. An interesting extension to this configuration and communication approach that the Google engineering team for the project provided for is the ability to configure one or more &lt;em&gt;remote&lt;/em&gt; Liquid Galaxies to remotely mirror the views being displayed in a given “master Galaxy”. This will allow teams of users to remotely view the same Google Earth views within the awesome environment of distinct Liquid Galaxies. The remote Liquid Galaxies essentially “play” the same views as are seen in the master Galaxy, but negligible network traffic is passed from system to system.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Sometimes it’s a silly hardware problem</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2008/12/sometimes-its-silly-hardware-problem/"/>
      <id>https://www.endpointdev.com/blog/2008/12/sometimes-its-silly-hardware-problem/</id>
      <published>2008-12-19T00:00:00+00:00</published>
      <author>
        <name>Jon Jensen</name>
      </author>
      <content type="html">
        &lt;p&gt;I’ve been using &lt;a href=&#34;https://mfnboer.home.xs4all.nl/twinkle/index.html&#34;&gt;Twinkle&lt;/a&gt; and &lt;a href=&#34;https://www.ekiga.org/&#34;&gt;Ekiga&lt;/a&gt; for SIP VoIP on Ubuntu 8.10 x86_64. That’s been working pretty well.&lt;/p&gt;
&lt;p&gt;However, I finally had to take some time to hunt down the source of a very annoying high-pitched noise coming from my laptop’s sound system (external speaker and headset both). I have an Asus M50SA laptop with Intel 82801H (ICH8 Family) audio on Realtek ALC883. I first thought perhaps it was the HDMI cable going to an external monitor, or some other RF interference from a cable, but turning things off or unplugging them didn’t make any difference.&lt;/p&gt;
&lt;p&gt;Then I suspected there was some audio driver problem because the whine only started once the sound driver loaded at boot time. After trying all sorts of variations in the ALSA configuration, changing the options to the snd-hda-intel kernel module, I was at a loss and unplugged my USB keyboard and mouse.&lt;/p&gt;
&lt;p&gt;It was the USB mouse! It’s a laser-tracked mouse with little shielding on the short cable. Plugging it into either of the USB ports near the front of the computer caused the noise. The keyboard didn’t matter.&lt;/p&gt;
&lt;p&gt;At first I thought my other USB non-laser ball mouse didn’t add any noise, but it did, just a quieter and lower-pitch noise.&lt;/p&gt;
&lt;p&gt;Then &amp;hellip; I discovered a third USB port near the back of the computer that I hadn’t ever noticed. Plugging mice in there doesn’t interfere with the audio. Sigh. Maybe this tale will save someone else some trouble.&lt;/p&gt;
&lt;p&gt;In the process I also fixed a problem that &lt;em&gt;was&lt;/em&gt; in software: The external speakers didn’t mute when headphones are plugged in, as &lt;a href=&#34;https://bugs.launchpad.net/ubuntu/+source/linux/+bug/253422&#34;&gt;others have described&lt;/a&gt; as well. One of their solutions worked.&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;/etc/modprobe.d/alsa-base&lt;/code&gt; add:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;options snd-hda-intel model=targa-2ch-dig&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and reboot. Or, if you dread rebooting as I do, exit all applications using audio, &lt;code&gt;modprobe -r snd-hda-intel&lt;/code&gt; then &lt;code&gt;modprobe snd-hda-intel&lt;/code&gt;. Finally, uncheck the “Headphones” checkbox in the sound control panel.&lt;/p&gt;

      </content>
    </entry>
  
</feed>
