<?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>General &#8211; Manuel Bogner&#039;s Blog</title>
	<atom:link href="https://blog.mbo.dev/archives/category/general/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mbo.dev</link>
	<description>Solutions to everyday IT problems</description>
	<lastBuildDate>Tue, 04 Feb 2025 00:01:17 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://blog.mbo.dev/wp-content/uploads/2022/11/cropped-cropped-mbo-white_opt-32x32.png</url>
	<title>General &#8211; Manuel Bogner&#039;s Blog</title>
	<link>https://blog.mbo.dev</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>How to Determine Your GMMK Pro Revision (Rev1 vs. Rev2)</title>
		<link>https://blog.mbo.dev/archives/2048</link>
		
		<dc:creator><![CDATA[Manuel Bogner]]></dc:creator>
		<pubDate>Tue, 04 Feb 2025 00:01:16 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://blog.mbo.dev/?p=2048</guid>

					<description><![CDATA[If you own a Glorious GMMK Pro and want to find out whether you have Rev1 or Rev2, follow this detailed guide. The main differences between these revisions lie in their microcontroller (MCU) and firmware size, which we will analyze using DFU mode and dfu-util. Step 1: Enter DFU Mode on Your GMMK Pro To [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>If you own a <strong>Glorious GMMK Pro</strong> and want to find out whether you have <strong>Rev1 or Rev2</strong>, follow this detailed guide. The main differences between these revisions lie in their <strong>microcontroller (MCU)</strong> and <strong>firmware size</strong>, which we will analyze using <strong>DFU mode and dfu-util</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><strong>Step 1: Enter DFU Mode on Your GMMK Pro</strong></h2>



<p>To interact with the keyboard’s firmware, we need to put it into <strong>DFU (Device Firmware Upgrade) mode</strong>. To get out of this mode, simply power cycle the board. But make sure to NEVER power cycle a MCU while it is flashing. Otherwise you most likely will end up with a bricked device.</p>



<h3 class="wp-block-heading"><strong>How to Enter DFU Mode:</strong></h3>



<ol class="wp-block-list">
<li><strong>Unplug your keyboard</strong>.</li>



<li><strong>Hold down</strong> the <strong>Spacebar + B</strong> keys.</li>



<li><strong>Plug the keyboard back in</strong> while continuing to hold the keys.</li>



<li>Your computer should recognize the keyboard as a <strong>STM32 BOOTLOADER</strong> device.</li>
</ol>



<p>To confirm the device is in DFU mode, run:</p>



<pre class="wp-block-code"><code>lsusb | grep STM</code></pre>



<p>Expected output:</p>



<pre class="wp-block-code"><code>Bus 002 Device 005: ID 0483:df11 STMicroelectronics STM32 BOOTLOADER</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><strong>Step 2: Install dfu-util</strong></h2>



<p>We will use <code>dfu-util</code> to read and analyze the firmware stored on your GMMK Pro.</p>



<h3 class="wp-block-heading"><strong>Mac (Homebrew):</strong></h3>



<pre class="wp-block-code"><code>brew install dfu-util</code></pre>



<h3 class="wp-block-heading"><strong>Linux (Debian/Ubuntu):</strong></h3>



<pre class="wp-block-code"><code>sudo apt update &amp;&amp; sudo apt install dfu-util -y</code></pre>



<h3 class="wp-block-heading"><strong>Windows:</strong></h3>



<ul class="wp-block-list">
<li>Download <code>dfu-util</code> from the official <a href="http://dfu-util.sourceforge.net/">dfu-util page</a>.</li>



<li>Extract the binaries and use <code>dfu-util.exe</code> from the command line.</li>
</ul>



<p>After installation, verify it is installed by running:</p>



<pre class="wp-block-code"><code>dfu-util --version</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><strong>Step 3: Read the Firmware from Memory</strong></h2>



<p>Now that <code>dfu-util</code> is installed, let’s extract the firmware to check its size.</p>



<h3 class="wp-block-heading"><strong>Identify the DFU Device</strong></h3>



<pre class="wp-block-code"><code>sudo dfu-util -l</code></pre>



<p>Example output:</p>



<pre class="wp-block-code"><code>Found DFU: &#91;0483:df11] ver=2200, devnum=1, cfg=1, intf=0, path="0-1", alt=0, name="@Internal Flash /0x08000000/128*0002Kg", serial="205E36552033"</code></pre>



<h3 class="wp-block-heading"><strong>Dump the Firmware</strong></h3>



<p>Extract the firmware to a file for analysis:</p>



<pre class="wp-block-code"><code>sudo dfu-util -d 0483:df11 -a 0 -s 0x08000000:524288 -U gmmk_pro_firmware.bin</code></pre>



<ul class="wp-block-list">
<li><code>-d 0483:df11</code>: Specifies the device ID.</li>



<li><code>-a 0</code>: Selects the internal flash memory.</li>



<li><code>-s 0x08000000:524288</code>: Reads <strong>up to 512 KB</strong> from the microcontroller’s flash memory.</li>



<li><code>-U gmmk_pro_firmware.bin</code>: Saves the extracted firmware to a file.</li>
</ul>



<p>Now, check the firmware size:</p>



<pre class="wp-block-code"><code>ls -lh gmmk_pro_firmware.bin</code></pre>



<p>Expected output:</p>



<pre class="wp-block-code"><code>-rw-r--r--  1 user  staff   256K Jan 1 00:00 gmmk_pro_firmware.bin</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><strong>Step 4: Determine Revision Based on Firmware Size</strong></h2>



<p>The firmware size tells us which revision your keyboard is:</p>



<ul class="wp-block-list">
<li><strong>256 KB (Rev1)</strong> → Uses the <strong>STM32F303</strong> microcontroller.</li>



<li><strong>512 KB (Rev2)</strong> → Uses the <strong>STM32F411</strong> microcontroller.</li>
</ul>



<h3 class="wp-block-heading"><strong>Microcontroller Differences</strong></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Revision</th><th>Microcontroller</th><th>Flash Size</th></tr></thead><tbody><tr><td><strong>Rev1</strong></td><td>STM32F303</td><td>256 KB</td></tr><tr><td><strong>Rev2</strong></td><td>STM32F411</td><td>512 KB</td></tr></tbody></table></figure>



<p>Since <strong>Rev1 uses a smaller flash partition (256 KB)</strong>, its firmware will never exceed that size. <strong>Rev2, on the other hand, requires larger firmware (closer to 512 KB).</strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><strong>Conclusion: Identifying Your GMMK Pro Revision</strong></h2>



<p>By following this guide, you can determine whether your <strong>GMMK Pro is Rev1 or Rev2</strong> by:</p>



<ol class="wp-block-list">
<li>Entering <strong>DFU mode</strong>.</li>



<li>Installing and using <strong>dfu-util</strong>.</li>



<li><strong>Extracting the firmware</strong> and checking its <strong>size</strong>.</li>
</ol>



<p>If your firmware size is <strong>256 KB</strong>, you have <strong>Rev1</strong>. If it&#8217;s closer to <strong>512 KB</strong> (over 256 KB), you have <strong>Rev2</strong>.</p>



<p>This method is <strong>non-intrusive</strong> and does not modify your keyboard’s firmware, ensuring a safe way to determine your revision.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>blog.coffeebeans.at moved to blog.mbo.dev</title>
		<link>https://blog.mbo.dev/archives/2034</link>
		
		<dc:creator><![CDATA[Manuel Bogner]]></dc:creator>
		<pubDate>Thu, 12 Sep 2024 18:19:30 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://blog.mbo.dev/?p=2034</guid>

					<description><![CDATA[Many years ago I registered coffeebeans.at and used it for various things. Right now I&#8217;m consolidating everything behind mbo.dev. You should be able to find everything from blog.coffeebeans.at behind blog.mbo.dev now. The old pages should automatically redirect to the new location. If you have any issues with the redirect or somethind doesn&#8217;t work anymore, please [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Many years ago I registered coffeebeans.at and used it for various things. Right now I&#8217;m consolidating everything behind mbo.dev. You should be able to find everything from blog.coffeebeans.at behind blog.mbo.dev now. The old pages should automatically redirect to the new location. If you have any issues with the redirect or somethind doesn&#8217;t work anymore, please let me know via contact form.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>spritpreisrechner.at OpenAPI Spec</title>
		<link>https://blog.mbo.dev/archives/1978</link>
		
		<dc:creator><![CDATA[Manuel Bogner]]></dc:creator>
		<pubDate>Wed, 18 Oct 2023 21:20:14 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://blog.coffeebeans.at/?p=1978</guid>

					<description><![CDATA[spritpreisrechner.at is a project from e-control and Austrian government to gather fuel prices all over the country. There is a Swagger 2 specification of the API by e-control to use the data. But the host used in that spec doesn&#8217;t exist anymore nor should you use swagger 2 for a project in 2023. I updated [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><a href="https://www.spritpreisrechner.at">spritpreisrechner.at</a> is a project from e-control and Austrian government to gather fuel prices all over the country. There is a Swagger 2 specification of the API by e-control to use the data. But the host used in that spec doesn&#8217;t exist anymore nor should you use swagger 2 for a project in 2023. I updated the spec to OpenAPI 3 via the online <a href="https://editor.swagger.io">Swagger Editor</a> and configured a working API base url. You can easily do the same but to take a shortcut &#8211; here is the resulting file:</p>



<pre class="wp-block-code has-small-font-size" style="border-style:none;border-width:0px"><code>openapi: 3.0.1
info:
  title: Spritpreisrechner
  description: Spritpreisrechner Beschreibung
  contact:
    name: E-Control
    url: http://www.e-control.at
    email: office@e-control.at
  version: "2.0"
servers:
- url: //www.spritpreisrechner.at/api
tags:
- name: ping
  description: Ping Rest Controller
- name: regions
  description: Regions Rest Controller
- name: search
  description: Search Rest Controller
paths:
  /ping:
    get:
      tags:
      - ping
      summary: Returns a welcome message and current time of the application
      operationId: pingUsingGET_3
      responses:
        200:
          description: OK
          content:
            text/plain:
              schema:
                type: string
      deprecated: false
  /regions:
    get:
      tags:
      - regions
      summary: Delivers all possible regions that can be used for the region search
      operationId: getRegionsUsingGET
      parameters:
      - name: includeCities
        in: query
        description: Include cities to regions
        allowEmptyValue: false
        schema:
          type: boolean
          default: false
        example: false
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Region'
      deprecated: false
  /regions/units:
    get:
      tags:
      - regions
      summary: Delivers all possible administrative units with coordinates
      operationId: getAdministrativeUnitsUsingGET
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BundeslandDTO'
      deprecated: false
  /search/gas-stations/by-address:
    get:
      tags:
      - search
      summary: Searches for gas stations at the given location
      operationId: searchGasStationsByAddressUsingGET
      parameters:
      - name: fuelType
        in: query
        description: 'Fuel type, allowed values: DIE, SUP, GAS'
        required: true
        allowEmptyValue: false
        schema:
          type: string
          enum:
          - DIE
          - SUP
          - GAS
      - name: includeClosed
        in: query
        description: Include closed gas stations
        allowEmptyValue: false
        schema:
          type: boolean
          default: false
        example: false
      - name: latitude
        in: query
        description: Latitude
        required: true
        allowEmptyValue: false
        schema:
          type: number
          format: double
      - name: longitude
        in: query
        description: Longitude
        required: true
        allowEmptyValue: false
        schema:
          type: number
          format: double
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/GasStationPublic'
      deprecated: false
  /search/gas-stations/by-region:
    get:
      tags:
      - search
      summary: Searches for gas stations at the given region
      operationId: searchGasStationsByRegionUsingGET_1
      parameters:
      - name: code
        in: query
        description: Region code
        required: true
        allowEmptyValue: false
        schema:
          type: string
      - name: fuelType
        in: query
        description: 'Fuel type, allowed values: DIE, SUP, GAS'
        required: true
        allowEmptyValue: false
        schema:
          type: string
          enum:
          - DIE
          - SUP
          - GAS
      - name: includeClosed
        in: query
        description: Include closed gas stations
        allowEmptyValue: false
        schema:
          type: boolean
          default: false
        example: false
      - name: type
        in: query
        description: 'Region type, allowed values: BL, PB'
        required: true
        allowEmptyValue: false
        schema:
          type: string
          enum:
          - BL
          - PB
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/GasStationPublic'
      deprecated: false
components:
  schemas:
    BezirkDTO:
      title: BezirkDTO
      type: object
      properties:
        c:
          type: integer
          format: int64
        g:
          type: array
          items:
            $ref: '#/components/schemas/GemeindeDTO'
        n:
          type: string
    BundeslandDTO:
      title: BundeslandDTO
      type: object
      properties:
        b:
          type: array
          items:
            $ref: '#/components/schemas/BezirkDTO'
        c:
          type: integer
          format: int64
        n:
          type: string
    Contact:
      title: Contact
      type: object
      properties:
        fax:
          type: string
        mail:
          type: string
        telephone:
          type: string
        website:
          type: string
    GasStationPublic:
      title: GasStationPublic
      required:
      - name
      type: object
      properties:
        contact:
          $ref: '#/components/schemas/Contact'
        distance:
          type: number
          format: double
        id:
          type: integer
          format: int64
        location:
          $ref: '#/components/schemas/Location'
        name:
          type: string
        offerInformation:
          $ref: '#/components/schemas/OfferInformation'
        open:
          type: boolean
        openingHours:
          type: array
          items:
            $ref: '#/components/schemas/OpeningHour'
        otherServiceOffers:
          type: string
        paymentArrangements:
          $ref: '#/components/schemas/PaymentArrangements'
        paymentMethods:
          $ref: '#/components/schemas/PaymentMethods'
        position:
          type: integer
          format: int32
        prices:
          type: array
          items:
            $ref: '#/components/schemas/Price'
    GemeindeDTO:
      title: GemeindeDTO
      type: object
      properties:
        b:
          type: number
        l:
          type: number
        n:
          type: string
        p:
          type: string
    Location:
      title: Location
      type: object
      properties:
        address:
          type: string
        city:
          type: string
        latitude:
          type: number
          format: double
        longitude:
          type: number
          format: double
        postalCode:
          type: string
    OfferInformation:
      title: OfferInformation
      type: object
      properties:
        selfService:
          type: boolean
        service:
          type: boolean
        unattended:
          type: boolean
    OpeningHour:
      title: OpeningHour
      required:
      - day
      type: object
      properties:
        day:
          type: string
          enum:
          - MO
          - DI
          - MI
          - DO
          - FR
          - SA
          - SO
          - FE
        from:
          type: string
        to:
          type: string
    PaymentArrangements:
      title: PaymentArrangements
      type: object
      properties:
        accessMod:
          type: string
        clubCard:
          type: boolean
        clubCardText:
          type: string
        cooperative:
          type: boolean
    PaymentMethods:
      title: PaymentMethods
      type: object
      properties:
        cash:
          type: boolean
        creditCard:
          type: boolean
        debitCard:
          type: boolean
        others:
          type: string
    Price:
      title: Price
      required:
      - fuelType
      type: object
      properties:
        amount:
          type: number
        fuelType:
          type: string
        label:
          type: string
    Region:
      title: Region
      type: object
      properties:
        cities:
          type: array
          items:
            type: string
        code:
          type: integer
          format: int64
        name:
          type: string
        postalCodes:
          type: array
          items:
            type: string
        subRegions:
          type: array
          items:
            $ref: '#/components/schemas/Region'
        type:
          type: string
          enum:
          - PB
          - BL
</code></pre>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Interesting tools to have a look at</title>
		<link>https://blog.mbo.dev/archives/1935</link>
		
		<dc:creator><![CDATA[Manuel Bogner]]></dc:creator>
		<pubDate>Mon, 08 May 2023 19:15:37 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://blog.coffeebeans.at/?p=1935</guid>

					<description><![CDATA[I found some tools in the internet that sound useful:]]></description>
										<content:encoded><![CDATA[
<p>I found some tools in the internet that sound useful:</p>



<ul class="wp-block-list">
<li>Dashy &#8211; <a href="https://dashy.to/docs/quick-start" target="_blank" rel="noreferrer noopener">https://dashy.to/docs/quick-start</a> (custom dashboards)</li>



<li>Metabase &#8211; <a href="https://www.metabase.com/start/oss/" target="_blank" rel="noreferrer noopener">https://www.metabase.com/start/oss/</a> (database introspection and graphing)</li>



<li>Slimtool &#8211; <a href="https://github.com/slimtoolkit/slim" target="_blank" rel="noreferrer noopener">https://github.com/slimtoolkit/slim</a> (docker image shrinking)</li>



<li>Portainer &#8211; <a href="https://docs.portainer.io/start/install-ce/server/docker/linux" target="_blank" rel="noreferrer noopener">https://docs.portainer.io/start/install-ce/server/docker/linux</a> (docker host manager)</li>



<li>Proxmox &#8211; <a href="https://www.proxmox.com/de/downloads" target="_blank" rel="noreferrer noopener">https://www.proxmox.com/de/downloads</a> (virtual machine manager)</li>



<li>Nginx Proxy Manager &#8211; <a href="https://nginxproxymanager.com" target="_blank" rel="noreferrer noopener">https://nginxproxymanager.com</a></li>



<li>TrueNAS &#8211; <a href="https://www.truenas.com/download-truenas-core/" target="_blank" rel="noreferrer noopener">https://www.truenas.com/download-truenas-core/</a></li>



<li>Vaultwarden &#8211; <a href="https://hub.docker.com/r/vaultwarden/server" target="_blank" rel="noreferrer noopener">https://hub.docker.com/r/vaultwarden/server</a> (small footprint bitwarden implementation)</li>



<li>Uptime Kuma &#8211; <a href="https://uptime.kuma.pet">https://uptime.kuma.pet</a> (monitoring)</li>



<li>Crater &#8211; <a rel="noreferrer noopener" href="https://crater.financial/open-source" target="_blank">https://crater.financial/open-source</a> (invoice creating tool)</li>



<li>Homebox &#8211; <a href="https://hay-kot.github.io/homebox/" target="_blank" rel="noreferrer noopener">https://hay-kot.github.io/homebox/</a> (inventory management)</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SMPTE LTC (Linear Time Code) on Linux and MacOS with ltc-tools and Jack Audio Connection Kit</title>
		<link>https://blog.mbo.dev/archives/1887</link>
		
		<dc:creator><![CDATA[Manuel Bogner]]></dc:creator>
		<pubDate>Mon, 28 Nov 2022 21:08:14 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<guid isPermaLink="false">https://blog.coffeebeans.at/?p=1887</guid>

					<description><![CDATA[The following time code generation is based on real time clocks synced with ntp on mac or linux computers using UTC time. Make sure your machine has an internal clock source otherwise the time drift will be too big. This approach is a very cheap way to get proper time code into cameras. If your [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>The following time code generation is based on real time clocks synced with ntp on mac or linux computers using UTC time. Make sure your machine has an internal clock source otherwise the time drift will be too big.</p>



<p>This approach is a very cheap way to get proper time code into cameras. If your device &#8211; like my notebook &#8211; has a built in microphone you could for example do the same as tentacle sync e and record time code on one and micro input on the other stereo channel of your for example digital camera. Of course syncing devices via ntp isn&#8217;t as accurate as syncing explicitly and having extra hardware for time code generation but this way I can use existing hardware instead of buying devices for hundreds of euros that aren&#8217;t shippable for weeks or months, cost a fortune and I don&#8217;t use very often.</p>



<p><strong>In the following my notes about how to use ltc-tools and jack for time code generation.</strong></p>



<p>First you need to install the dependencies:</p>



<pre class="wp-block-code"><code>brew install jack
brew install ltc-tools</code></pre>



<p>With these in place you first have to start the jack daemon:</p>



<pre class="wp-block-code"><code>jackd --realtime -dcoreaudio</code></pre>



<p>Then connect the time code generator with your desired frame rate</p>



<pre class="wp-block-code"><code>jltcgen -f 25</code></pre>



<p>This now sends time code to jack input. On my system this input is named <code>genltc:ltc</code>. You can display all ports usable in jack via</p>



<pre class="wp-block-code"><code>jack_lsp</code></pre>



<p>On my machine this gives the following output:</p>



<pre class="wp-block-code"><code>system:capture_1
system:playback_1
system:playback_2
genltc:ltc</code></pre>



<p>capture_1 is my mic, playback_1 the left and playback_2 the right speaker.</p>



<p>To connect the time code generator with my left speaker (and immediately disconnect it again because of the annoying sound) the commands are:</p>



<pre class="wp-block-code"><code># output time code on left and mic on right channel
jack_connect genltc:ltc system:playback_1
jack_connect system:capture_1 system:playback_2

# disconnect it again
jack_disconnect genltc:ltc system:playback_1
jack_disconnect system:capture_1 system:playback_2</code></pre>



<p>If you don&#8217;t disconnect it your device should make some weird sound which is the time code. In case you connect the mic like in my sample make sure to use headphones otherwise you will create a feedback loop.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Reset reaper on a mac</title>
		<link>https://blog.mbo.dev/archives/1884</link>
		
		<dc:creator><![CDATA[Manuel Bogner]]></dc:creator>
		<pubDate>Mon, 28 Nov 2022 09:33:05 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://blog.coffeebeans.at/?p=1884</guid>

					<description><![CDATA[Simply delete the folder &#60;user>/Library/Application Support/REAPER.]]></description>
										<content:encoded><![CDATA[
<p>Simply delete the folder <code>&lt;user>/Library/Application Support/REAPER</code>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>MS Teams and external audio interfaces</title>
		<link>https://blog.mbo.dev/archives/1847</link>
		
		<dc:creator><![CDATA[Manuel Bogner]]></dc:creator>
		<pubDate>Fri, 12 Aug 2022 14:05:27 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://blog.coffeebeans.at/?p=1847</guid>

					<description><![CDATA[After quite some weeks where I had to use my old Logitech headset again instead of my fancy Audient audio interface plus the Shure mic I finally tried to find the reason why my mic isn&#8217;t recognised in teams. The interface is listed normally in the dropdown and all other apps also work absolutely perfect [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>After quite some weeks where I had to use my old Logitech headset again instead of my fancy Audient audio interface plus the Shure mic I finally tried to find the reason why my mic isn&#8217;t recognised in teams. The interface is listed normally in the dropdown and all other apps also work absolutely perfect &#8211; but teams. The funny thing is that I already was using teams with an external mic before with the same interface and it worked perfectly. After a lot of research I found out by trial and error that MS Teams only recognises channel 1 of the interface and ignores all others. So whatever mic you want to use in this app you have to plugin to channel 1. So switching the Shure mic from channel 2 to channel 1 did the trick. Finally I am back to my pro gear instead the old headset.</p>



<p>Some sidenote to the Audient guys and all those who are thinking to buy one of their interfaces. Yes, the pre-amps are really great but it&#8217;s really very annoying that the audio level resets every single time the interfaces is reconnected. I&#8217;m always disconnecting my whole workplace from power at the end of the day which means the audio level for my headphones is reset to 0 every day and it happened quite some times that I was wondering why I can&#8217;t hear somebody in a call until I remembered about that setting I have to do every time. So from that perspective and in combo with a dbx s286s the Focusrite 2i2 is much more user friendly &#8211; I am not using the pre-amps nor the id software from Audient anyway.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>log4shell &#8211; Log4j2 has major security problem (CVE-2021-44228, CVE-2021-45105, CVE-2021-44832)</title>
		<link>https://blog.mbo.dev/archives/1709</link>
		
		<dc:creator><![CDATA[Manuel Bogner]]></dc:creator>
		<pubDate>Tue, 14 Dec 2021 20:07:05 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://blog.coffeebeans.at/?p=1709</guid>

					<description><![CDATA[log4j-core until version 2.15.0 has a major security leak that can be exploited by sending prepared strings that are logged with log4j. Potential candidates would be headers or often also simple form fields that are sent to java backends. The CVE can be found here. With a score of 10/10 this should be addressed as [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>log4j-core until version 2.15.0 has a major security leak that can be exploited by sending prepared strings that are logged with log4j. Potential candidates would be headers or often also simple form fields that are sent to java backends.</p>



<p>The CVE can be found <a rel="noreferrer noopener" href="https://nvd.nist.gov/vuln/detail/CVE-2021-44228" target="_blank">here</a>. With a score of 10/10 this should be addressed as soon as possible.</p>



<p>The spring blog says that a fix has been made in version 2.15.0 which is available since December 10th &#8211; the same day as the issue received big publicity.</p>



<p>Apache posted an <a rel="noreferrer noopener" href="https://lists.apache.org/thread/d6v4r6nosxysyq9rvnr779336yf0woz4" data-type="URL" data-id="https://lists.apache.org/thread/d6v4r6nosxysyq9rvnr779336yf0woz4" target="_blank">article</a> to announce 2.16.0 on December 13th.</p>



<p>Update: Debian security mailing list just announced this:</p>



<pre class="wp-block-preformatted">It was found that the fix to address CVE-2021-44228 in Apache Log4j, a Logging
Framework for Java, was incomplete in certain non-default configurations. This
could allow attackers with control over Thread Context Map (MDC) input data
when the logging configuration uses a non-default Pattern Layout with either a
Context Lookup (for example, $${ctx:loginId}) or a Thread Context Map pattern
(%X, %mdc, or %MDC) to craft malicious input data using a JNDI Lookup pattern
resulting in a denial of service (DOS) attack.

For the oldstable distribution (buster), this problem has been fixed
in version 2.16.0-1~deb10u1.

For the stable distribution (bullseye), this problem has been fixed in
version 2.16.0-1~deb11u1.

We recommend that you upgrade your apache-log4j2 packages.</pre>



<p>So please make sure to update to 2.16.0 instead of 2.15.0.</p>



<h2 class="wp-block-heading">Important Update</h2>



<p>The log4j team already released <strong>2.17.0</strong> which is available for <a rel="noreferrer noopener" href="https://logging.apache.org/log4j/2.x/download.html" data-type="URL" data-id="https://logging.apache.org/log4j/2.x/download.html" target="_blank">download</a>. It fixes <a rel="noreferrer noopener" href="https://nvd.nist.gov/vuln/detail/CVE-2021-45105" data-type="URL" data-id="https://nvd.nist.gov/vuln/detail/CVE-2021-45105" target="_blank">CVE-2021-45105</a>.</p>



<pre class="wp-block-preformatted">Package        : apache-log4j2
CVE ID         : CVE-2021-45105
Debian Bug     : 1001891

It was found that Apache Log4j2, a Logging Framework for Java, did not protect
from uncontrolled recursion from self-referential lookups. When the logging
configuration uses a non-default Pattern Layout with a Context Lookup (for
example, $${ctx:loginId}), attackers with control over Thread Context Map (MDC)
input data can craft malicious input data that contains a recursive lookup,
resulting in a denial of service.

For the oldstable distribution (buster), this problem has been fixed
in version 2.17.0-1~deb10u1.

For the stable distribution (bullseye), this problem has been fixed in
version 2.17.0-1~deb11u1.</pre>



<h2 class="wp-block-heading">Update, 29.12.2021</h2>



<p>Log4j has relased another version fixing <a rel="noreferrer noopener" href="https://nvd.nist.gov/vuln/detail/CVE-2021-44832" data-type="URL" data-id="https://nvd.nist.gov/vuln/detail/CVE-2021-44832" target="_blank">CVE-2021-44832</a>:</p>



<pre class="wp-block-code"><code>Apache Log4j2 versions 2.0-beta7 through 2.17.0 (excluding security fix releases 2.3.2 and 2.12.4) are vulnerable to a remote code execution (RCE) attack where an attacker with permission to modify the logging configuration file can construct a malicious configuration using a JDBC Appender with a data source referencing a JNDI URI which can execute remote code. This issue is fixed by limiting JNDI data source names to the java protocol in Log4j2 versions 2.17.1, 2.12.4, and 2.3.2.</code></pre>



<p>New version has already been release to public maven repos: <a rel="noreferrer noopener" href="https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core" target="_blank">https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core</a></p>



<h2 class="wp-block-heading">Spring Boot</h2>



<p>Taken from an announcement on the <a rel="noreferrer noopener" href="https://spring.io/blog/2021/12/10/log4j2-vulnerability-and-spring-boot" data-type="URL" data-id="https://spring.io/blog/2021/12/10/log4j2-vulnerability-and-spring-boot" target="_blank">Spring blog</a> Spring Boot with its logback logger isn&#8217;t affected if you didn&#8217;t switch to log4j on purpose.</p>



<p>Also logback has just closed a CVE (<a rel="noreferrer noopener" href="https://nvd.nist.gov/vuln/detail/CVE-2021-42550" target="_blank">https://nvd.nist.gov/vuln/detail/CVE-2021-42550</a>). But here the attacker needs write access to the logging config. Here the jira issue for it: <a rel="noreferrer noopener" href="https://jira.qos.ch/browse/LOGBACK-1591" target="_blank">https://jira.qos.ch/browse/LOGBACK-1591</a>. An update has also been added to <a rel="noreferrer noopener" href="https://spring.io/blog/2021/12/10/log4j2-vulnerability-and-spring-boot" target="_blank">https://spring.io/blog/2021/12/10/log4j2-vulnerability-and-spring-boot</a>.</p>



<p>Spring Boot 2.6.2 has updated to 2.17.0 and doesn&#8217;t include 2.17.1 yet.</p>



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



<p>Android is using its own log system and switching to log4j is a quite tricky task from what I&#8217;ve read so far. So the default logger in Android applications isn&#8217;t affected by log4shell as well.</p>



<h2 class="wp-block-heading">JEE &#8211; Wildfly</h2>



<p>Wildfly is using jboss-logging package and never relied on log4j. So wildfly users are also not affected as long as you don&#8217;t ship the artifact yourself. For further details read the <a rel="noreferrer noopener" href="https://www.wildfly.org/news/2021/12/13/Log4j-CVEs/" data-type="URL" data-id="https://www.wildfly.org/news/2021/12/13/Log4j-CVEs/" target="_blank">article on wildfly news</a>.</p>



<h2 class="wp-block-heading">Other Applications</h2>



<p>log4j is very widely spread in the java open source community and the chance that it is deeply knit into your applications is very high.</p>



<p>Typical javascript applications or flutter apps aren&#8217;t based on Java and therefor shouldn&#8217;t be affected themselves. <strong>But their backends could be!</strong></p>



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



<p>&#8220;The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging <em>frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framework at&nbsp;deployment&nbsp;time.&#8221;</em> [<a href="http://www.slf4j.org/" target="_blank" rel="noreferrer noopener">http://www.slf4j.org/</a>]</p>



<p>So the question if your application that is using slf4j is vulnerable can&#8217;t be answered so easily because it depends on the implementation you chose behind the scenes. Typical libs you can find in applications that are using log4j as their logging implementation behind the slf4j facade are log4j-core, log4j-slf4j-impl, log4j-over-slf4j, slf4j-log4j12, &#8230; Also the existence of a log4j.properties or log4j.xml file in the root of your classpath is a very good hint that the app is using log4j.</p>



<hr class="wp-block-separator"/>



<p><em>Of course I don&#8217;t take over any responsibility that the information on this page is correct or that your app is safe. Please review yourself and check your apps.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Stop firefox from changing your URLs automatically to https</title>
		<link>https://blog.mbo.dev/archives/1305</link>
		
		<dc:creator><![CDATA[Manuel Bogner]]></dc:creator>
		<pubDate>Sat, 26 Sep 2020 16:27:41 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://blog.coffeebeans.at/?p=1305</guid>

					<description><![CDATA[As an admin I have to work with http and https sites quite often. Firefox started to put https in front of everything automatically and clearing the cache all the time is not what I wanted to continue. I found a quick workaround that avoids this issue. Open a new tab and enter about:config in [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>As an admin I have to work with http and https sites quite often. Firefox started to put https in front of everything automatically and clearing the cache all the time is not what I wanted to continue. I found a quick workaround that avoids this issue. Open a new tab and enter <strong>about:config</strong> in the address bar and hit enter. Confirm the warning and the look for <strong>browser.urlbar.autoFill</strong> and disable it. With this set to <strong>false</strong> Firefox stopped that annoying behavior for me.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Chromium Flash Plugin</title>
		<link>https://blog.mbo.dev/archives/914</link>
					<comments>https://blog.mbo.dev/archives/914#respond</comments>
		
		<dc:creator><![CDATA[Manuel Bogner]]></dc:creator>
		<pubDate>Sat, 24 Jan 2015 12:38:53 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://blog.coffeebeans.at/?p=914</guid>

					<description><![CDATA[In the newer versions of chromium browser the flashplugin-installer that works for firefox is not supported anymore. To get flash installed use: apt-get install pepperflashplugin-nonfree &#160;]]></description>
										<content:encoded><![CDATA[<p>In the newer versions of chromium browser the flashplugin-installer that works for firefox is not supported anymore. To get flash installed use:</p>
<pre class="lang:sh decode:true ">apt-get install pepperflashplugin-nonfree</pre>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.mbo.dev/archives/914/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
