[{"body":"Dokumente, die temporär interessant sind. Hier kann man erkennen, was ich im Laufe der Zeit so treibe!\n","link":"https://uli.heller.cool/blog/","section":"blog","tags":null,"title":"Blog"},{"body":"Welcome to the Mainroad theme documentation. This quick start guide covers Mainroad theme installation and minimal configuration and is intended for intermediate to advanced users. To understand this guide, you need to be familiar with the Hugo static site generator.\nInstallation Before installing the Mainroad theme, make sure that you've installed Hugo (version 0.54.0 or later) and created a new site. To learn how to install Hugo, visit Hugo Documentation.\nThere are a few ways to install a theme in Hugo. This can be done via git submodule, git clone, Hugo modules, or by downloading the archive and manually copying the files. Three installation options are described below.\nOption A: git submodule Additional requirements: git\nIf you don't plan to make significant changes to the theme but still want to track and update it, you can add it as a git submodule by running the following command from the root directory of your Hugo site:\n1git submodule add https://github.com/vimux/mainroad.git themes/mainroad Note: Netlify expects git submodule instead of git clone.\nOption B: git clone Additional requirements: git\nRun this git clone command from the root of your Hugo site:\n1git clone https://github.com/vimux/mainroad.git themes/mainroad Option C: Manual install If you do not want to use git, you can manually download ZIP and extract it into the themes/mainroad within your Hugo site.\nActivate theme Whichever installation option you choose, don't forget to edit theme param of the site configuration config.toml:\n1theme = \u0026#34;mainroad\u0026#34; To check it out, build the site via hugo command or make it available on a local server via hugo server.\nMinimal configuration Do not copy the example config as-is. Use only the parameters that you need. The Mainroad theme contains required defaults, so you don't need to add all of the configuration parameters to run the theme for the first time. Before adding any theme-specific parameters, make sure to edit the theme param inside the config file and check that the theme works.\nFor information about common customization settings, see Customization page. To view our example configuration, visit demo config.\nEdit this page on GitHub\n","link":"https://uli.heller.cool/hugo-docs/getting-started/","section":"hugo-docs","tags":["hugo"],"title":"Getting started"},{"body":"Dokumente, die dauerhaft interessant sein dürften! Oft eine Zusammenfassung von Blog-Beiträgen.\n","link":"https://uli.heller.cool/articles/","section":"articles","tags":null,"title":"Artikel"},{"body":"Customization page describes common Mainroad configuration parameters which can be specified via configuration file or via Front Matter section. That includes logo section tuning, adding a sidebar with widgets, adjusting highlight color, and more.\nThis section will mainly cover customization settings that are unique to this theme. If something is not covered here, there's a good chance it is covered somewhere in Hugo docs.\nLogo Mainroad allows you to set a custom logo in the site header. You may use text, or image, or both. Use the following options in your site config:\n1[Params.logo] 2 image = \u0026#34;img/placeholder.png\u0026#34; 3 title = \u0026#34;Mainroad\u0026#34; 4 subtitle = \u0026#34;Just another site\u0026#34; Note: logo image will display at a maximum width of 128 pixels and a maximum height of 128 pixels when you use text and image simultaneously. When the only logo image is active, it will display at a maximum height of 256 pixels. Ideally, your logo image should be SVG.\nIf you don't set any of these variables, the theme uses the site title as a logo title. Don't need a logo section? Disable it this way:\n1[Params.logo] 2 image = false 3 title = false 4 subtitle = false Highlight color Mainroad uses #e22d30 as a default highlight color, but you may choose and set any other color.\n1[Params.style.vars] 2 highlightColor = \u0026#34;#e22d30\u0026#34; Post meta Post meta is a feature that refers to including additional meta information (such as author name, categories, date, translations, etc.) on pages. It can be enabled via config using the post_meta key with a list of meta field names as value. Order matters here: rearrange fields if you want to.\n1[Params] 2 post_meta = [\u0026#34;author\u0026#34;, \u0026#34;date\u0026#34;, \u0026#34;categories\u0026#34;, \u0026#34;translations\u0026#34;] Full list of available default post meta fields:\nauthor, categories, date, translations In addition to the default meta fields, you can add your own by placing a custom partial under layouts/partials/post_meta/\u0026lt;name\u0026gt;.html.\nPost meta: date localization With Hugo v0.87.0 (or later), date meta field shows localized dates (with weekdays and months in the current language) by default. In most cases, such a transition is painless, but owners of multilingual sites should be careful and check that everything translates as expected after the upgrade.\nYou can also use a predefined layout, like :date_full, and it will output localized dates or times. For additional information about localized dates and possible date/time formatting layouts, please see Hugo: time.Format.\nThumbnail visibility By default, a thumbnail image has shown for a list and single pages simultaneously. In some cases, you may want to show a thumbnail for list-like pages only and hide it on single pages (or vice versa). Control global thumbnail visibility via config, use the key visibility with combination of valid values \u0026quot;list\u0026quot; and \u0026quot;post\u0026quot;.\n1[Params.thumbnail] 2 # Show thumbnail only for list items 3 visibility = [\u0026#34;list\u0026#34;] Besides global configuration, you can change thumbnail visibility individually with extended thumbnail notation via front matter block.\n1thumbnail: 2 src: \u0026#34;img/placeholder.png\u0026#34; 3 visibility: 4 - list 5 - post This page is an example of list-only thumbnail visibility.\nSidebar Mainroad comes with a configurable sidebar that can be on the left, on the right, or disabled. The default layout can be specified in the [Params.sidebar] section of the configuration. The position can be specified for home, list and single pages individually. Use the keys home, list and single with values \u0026quot;left\u0026quot;, \u0026quot;right\u0026quot; or false.\n1[Params.sidebar] 2 home = \u0026#34;right\u0026#34; 3 list = \u0026#34;right\u0026#34; 4 single = \u0026#34;right\u0026#34; The layout can be configured per page, by setting the sidebar parameter with one of the same values (\u0026quot;left\u0026quot;, \u0026quot;right\u0026quot; or false) in the page's front matter.\n1sidebar: \u0026#34;left\u0026#34; # Enable sidebar (on the left side) per page The sidebar consists of multiple widgets. Widgets can be enabled individually using the widgets key with a list of widget names as value. You can add your own widgets, by placing a template under layouts/partials/widgets/\u0026lt;name\u0026gt;.html.\n1[Params.sidebar] 2 # Enable widgets in given order 3 widgets = [\u0026#34;search\u0026#34;, \u0026#34;recent\u0026#34;, \u0026#34;categories\u0026#34;, \u0026#34;taglist\u0026#34;, \u0026#34;social\u0026#34;, \u0026#34;languages\u0026#34;] The list of widgets can be overwritten from a page's front matter.\n1# Enable sidebar widgets in given order 2widgets: 3 - \u0026#34;search\u0026#34; 4 - \u0026#34;recent\u0026#34; 5 - \u0026#34;taglist\u0026#34; Full list of available default widgets:\nsearch, ddg-search, recent, categories, taglist, social, languages Note: DuckDuckGo widget (ddg-search) deprecated in favor of search widget.\nSome of our widgets respect optional configuration. Have a look at the [Params.widgets] and [Params.widgets.social] sections in the example below.\n1[Params.widgets] 2 recent_num = 5 # Set the number of articles in the \u0026#34;Recent articles\u0026#34; widget 3 categories_counter = false # Enable counter for each category in \u0026#34;Categories\u0026#34; widget 4 tags_counter = false # Enable counter for each tag in \u0026#34;Tags\u0026#34; widget 1[Params.widgets.social] 2 # Enable parts of social widget 3 facebook = \u0026#34;username\u0026#34; 4 twitter = \u0026#34;username\u0026#34; 5 instagram = \u0026#34;username\u0026#34; 6 linkedin = \u0026#34;username\u0026#34; 7 telegram = \u0026#34;username\u0026#34; 8 github = \u0026#34;username\u0026#34; 9 gitlab = \u0026#34;username\u0026#34; 10 bitbucket = \u0026#34;username\u0026#34; 11 email = \u0026#34;example@example.com\u0026#34; Widget caching Sidebar strongly affects overall build time, especially if you are using all of our widgets or even more. Widget caching can significantly improve the generation time. Cached partials remain the same for all affected pages and are not generated multiple times by Hugo. All built-in widgets (search, recent, categories, taglist, social, languages) support caching.\nAdd cached = true inside the corresponding widget's dictionary table to activate caching. For example, to cache the recent widget:\n1[Params.widgets.recent] 2 cached = true The following sample configuration extract shows how to cache all standard widgets and generate your website faster:\n1[Params.widgets.search] 2 cached = true 3 4[Params.widgets.recent] 5 cached = true 6 7[Params.widgets.categories] 8 cached = true 9 10[Params.widgets.taglist] 11 cached = true 12 13[Params.widgets.social] 14 cached = true 15 16[Params.widgets.languages] 17 cached = true Not all widgets are cacheable. If a widget contains (can contain) different data for different pages (e.g., for TOC generation), then it should not be cached. Always check that your modified/customized widget is cached correctly.\nSocial Widget: custom links Mainroad contains built-in social links in the social widget. In addition to default social links, you may set custom links by adding Params.widgets.social.custom to your config.toml. Here is an example:\n1[[Params.widgets.social.custom]] 2 title = \u0026#34;My Home Page\u0026#34; 3 url = \u0026#34;https://example.com\u0026#34; If you want to display an icon of your social link, you need to put SVG icon file in layouts/partials directory under your site's root. The icon key filed, which is optional, should be a path relative to layouts/partials.\n1[[Params.widgets.social.custom]] 2 title = \u0026#34;Youtube\u0026#34; 3 url = \u0026#34;https://youtube.com/user/username\u0026#34; 4 icon = \u0026#34;youtube.svg\u0026#34; Note: Only SVG files are supported to be used as custom social icons. If you use any other files, PNG for example, a compile error will be raised by Hugo. Moreover, not every SVG icon can be used. For better results, it should be one-color SVG file with a special class attribute {{ with .class }}{{ . }} {{ end }} and 24x24 size. At a minimum, custom SVG icon needs these attributes:\n1\u0026lt;svg class=\u0026#34;{{ with .class }}{{ . }} {{ end }} icon\u0026#34; width=\u0026#34;24\u0026#34; height=\u0026#34;24\u0026#34;\u0026gt;...\u0026lt;/svg\u0026gt; You can also specify the rel attribute for the link. By default, the attribute value is \u0026quot;noopener noreferrer\u0026quot;. You can remove the attribute completely by setting its value to false.\n1[[Params.widgets.social.custom]] 2 title = \u0026#34;My Home Page\u0026#34; 3 url = \u0026#34;https://example.com\u0026#34; 4 rel = \u0026#34;me\u0026#34; 5 6[[Params.widgets.social.custom]] 7 title = \u0026#34;Youtube\u0026#34; 8 url = \u0026#34;https://youtube.com/user/username\u0026#34; 9 rel = false Search box widget The search box widget can refer to the results of Google, Bing, and DuckDuckGo searches. By default, Mainroad uses Google search if no additional configuration options are specified.\nTo use a different search engine, first of all, check that the search widget is enabled. Then set the search parameters (Site.Params.widgets.search section) according to the data below.\nGoogle (default):\n1[Params.widgets.search] 2 url = \u0026#34;https://google.com/search\u0026#34; 3 [Params.widgets.search.input] 4 name = \u0026#34;sitesearch\u0026#34; 5 pre = \u0026#34;\u0026#34; DuckDuckGo:\n1[Params.widgets.search] 2 url = \u0026#34;https://duckduckgo.com/\u0026#34; 3 [Params.widgets.search.input] 4 name = \u0026#34;sites\u0026#34; 5 pre = \u0026#34;\u0026#34; Bing:\n1[Params.widgets.search] 2 url = \u0026#34;https://www.bing.com/search\u0026#34; 3 [Params.widgets.search.input] 4 name = \u0026#34;q1\u0026#34; 5 pre = \u0026#34;site:\u0026#34; Google PSE:\n1[Params.widgets.search] 2 url = \u0026#34;/search/\u0026#34; 3 [Params.widgets.search.input] 4 name = false 5 pre = \u0026#34;\u0026#34; Note that Google PSE requires additional steps to work correctly. See Creating a Programmable Search Engine and especially our FAQ for more instructions.\nMenus Mainroad supports multiple menus. The main menu is fully responsive and displayed right under the site header. The secondary menus side and footer are displayed in a sidebar widget and the page footer respectively. To add a page to a menu, add a menu: \u0026lt;menu\u0026gt; parameter to the page's front matter:\n1menu: main # Add page to a main menu Note: Don't forget to enable the sidemenu widget in the widgets configuration param if you want to use the side menu.\nYou can also add a page to multiple menus by providing a list:\n1# Add page to a main, side, and footer menu 2menu: 3 - main 4 - side 5 - footer Note: Please keep in mind that Mainroad menus don't support nested items i.e. submenus.\nSee Menus from official Hugo documentation for more info.\nCustom Google Fonts support Mainroad uses Open Sans from Google Fonts as a main font. But you can use any other font from Google Fonts if you'd like. Beware, in most cases, such changes require manual CSS adjustment because every set of fonts is different and might not look as good as our default font.\nFollow the procedure below.\nOpen Google Fonts, choose font(s) that you prefer and copy href font link. For this particular example, we choose Roboto with 3 different styles. Our href font link:\n1https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,700;1,400\u0026amp;display=swap Set googleFontsLink site's config param value to your href font link. For example:\n1[Params] 2 googleFontsLink = \u0026#34;https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,700;1,400\u0026amp;display=swap\u0026#34; Override default font-family set(s):\n1[Params.style.vars] 2 fontFamilyPrimary = \u0026#34;\u0026#39;Roboto\u0026#39;, sans-serif\u0026#34; It is possible to disable Google Fonts and use system font stack instead.\nDisable Google Fonts include. Set googleFontsLink site's config param value to false:\n1[Params] 2 googleFontsLink = false Override font-family sets:\n1[Params.style.vars] 2 # Override font-family sets. Take care of different quotes OR escaping symbols in these params if necessary 3 fontFamilyPrimary = \u0026#34;system-ui, -apple-system, \u0026#39;Segoe UI\u0026#39;, Roboto, \u0026#39;Helvetica Neue\u0026#39;, Arial, \u0026#39;Noto Sans\u0026#39;, \u0026#39;Liberation Sans\u0026#39;, sans-serif, \u0026#39;Apple Color Emoji\u0026#39;, \u0026#39;Segoe UI Emoji\u0026#39;, \u0026#39;Segoe UI Symbol\u0026#39;, \u0026#39;Noto Color Emoji\u0026#39;\u0026#34; 4 # Secondary font-family set responsible for pre, code, kbd, and samp tags font 5 fontFamilySecondary = \u0026#34;SFMono-Regular, Menlo, Monaco, Consolas, \u0026#39;Liberation Mono\u0026#39;, \u0026#39;Courier New\u0026#39;, monospace\u0026#34; Edit this page on GitHub\n","link":"https://uli.heller.cool/hugo-docs/customization/","section":"hugo-docs","tags":["hugo"],"title":"Customization"},{"body":"","link":"https://uli.heller.cool/hugo-docs/","section":"hugo-docs","tags":null,"title":"Hugo Docs"},{"body":"Browse this FAQ page to find answers to frequently asked questions that have not been covered elsewhere in the documentation.\nThe answers have been categorized into two groups:\nAnswers to general questions without any lines of code. Answers to technical questions with code snippets, step-by-step instructions, etc. General questions Do I need to have prior experience before proceeding with the Mainroad theme? Yes. You'll need to be familiar with Hugo before proceeding. Our docs section is intended for intermediate to advanced users and developers. Our documentation may still be helpful to users with minimal experience, but are not comprehensive.\nDo I need to use the extended version of Hugo? No. Mainroad theme intentionally does not use any features of the extended version. As such, the extended version of Hugo is not required (but applicable).\nIs there a list of all possible configuration options? Configuration:\nSee All Configuration Settings for the full list of Hugo-defined variables with their default values. See Mainroad config.toml example for the full list of Mainroad-specific variables. Front Matter:\nSee Front Matter Variables for the list of Hugo-defined Front Matter variables. See Mainroad Front Matter example for the list of Mainroad-specific Front Matter variables. What if I have more questions? Should I create an issue? We don't provide personal technical support. As stated in our contributing guidelines, please do not use the issue tracker for personal support. This includes reports like: “How do I do this\u0026quot;, “Everything is broken; help me”, “I changed something, and it doesn't work anymore”, “It's not a personal issue, but I just want to ask how X or Y works”, “I forked your theme, then something broke; fix this immediately”, and so on.\nThe issue tracker should only be used for bug reports, feature requests, and discussions that comply with our contributing rules. All other issues will be closed and marked as invalid.\nTechnical questions I want to get the favicon.ico and apple-touch-icon.png to match my hightlightColor. What should I do? There is no way to do this on the fly with Hugo, but you can use the one-liners below with some preparations:\nCopy: ./themes/mainroad/static/favicon.ico to ./static/favicon.ico ./themes/mainroad/static/apple-touch-icon.png to ./static/apple-touch-icon.png At the beginning of each script, replace the color in the variable with your preferred color. You must use six-digit hex triplet notation (e.g., #E22D30) to make it work properly. Go to the root of your project directory in the terminal and execute these two commands accordingly.\n1a=#E22D30;a=\\\\x${a:5:2}\\\\x${a:3:2}\\\\x${a:1:2};for i in 98 274 578;do printf $a|dd of=static/favicon.ico bs=1 seek=$i conv=notrunc;done 1a=#E22D30;a=$(echo 504C54452A2A2A${a:1:6}|sed -e \u0026#39;s/../\\\\x\u0026amp;/g\u0026#39;);printf $a|gzip|tail -c8|od -tx4 -N4 -An|xargs|sed -e \u0026#39;s/../\\\\x\u0026amp;/g\u0026#39;|printf $a$(cat -)|dd of=static/apple-touch-icon.png bs=1 seek=37 conv=notrunc I want to use Google Programmable Search Engine as a site search engine. Is it possible? Yes, it is possible to use Google PSE (CSE) as a site search engine.\nCreate a new search engine with Google PSE. Google account required.\nAdd a new layout.\nCreate file ./layouts/search/index.html with the following content:\n1{{ define \u0026#34;main\u0026#34; }} 2\u0026lt;script async src=\u0026#34;https://cse.google.com/cse.js?cx=YOUR_PSE_ENGINE_ID\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 3\u0026lt;div class=\u0026#34;gcse-search\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; 4{{ end }} Don't forget to paste your Google PSE ID.\nAdd search page by creating file ./content/search.md with the following content:\n1--- 2title: Search 3authorbox: false 4sidebar: false 5pager: false 6--- Optional. If you use the search widget, don't forget to change the search box parameters:\n1[Params.widgets.search] 2 url = \u0026#34;/search/\u0026#34; 3 input.name = false 4 input.pre = \u0026#34;\u0026#34; Google PSE (CSE) should work when it's done. Look and feel will be far from perfect, but you have to solve this problem with Google PSE Control Panel and additional CSS.\nEdit this page on GitHub\n","link":"https://uli.heller.cool/hugo-docs/faq/","section":"hugo-docs","tags":["hugo"],"title":"Frequently asked questions (FAQ)"},{"body":"","link":"https://uli.heller.cool/","section":"","tags":null,"title":"Ulis Welt ... da läuft was"},{"body":"","link":"https://uli.heller.cool/categories/","section":"categories","tags":null,"title":"Categories"},{"body":"","link":"https://uli.heller.cool/tags/copilot/","section":"tags","tags":null,"title":"Copilot"},{"body":"","link":"https://uli.heller.cool/categories/ki/","section":"categories","tags":null,"title":"KI"},{"body":" Vorweg: Von meiner Grundeinstellung her bin ich ein KI-Kritiker. Ich sehe gewisse Vorteile in der Nutzung, ich sehe aber auch Probleme beim Erhalt des Wissens. Grob ist es aktuell ja so: Die KI-Modelle haben quasi das gesamte Wissen des Internets aufgesaugt und präsentieren und ein Destillat davon. Die Quellen des Wissens gehen dabei unter. Sie werden nirgends erwähnt. Unabhängig davon, ob die Copyrights der Artikel anderes festschreiben. Sieht für mich nicht nach richtiger Anwendung (\u0026quot;fair use\u0026quot;) aus!\nDer Anreiz, weiterhin Wissen zu veröffentlichen, wird für den einzelnen damit immer geringer!\nDennoch möchte ich hier eine KI-Nutzung kurz vorstellen, das Ergebnis ist garnicht so schlecht!\nVorstellung des Grundproblems Schon seit ein paar Wochen beschäftigt mich ein Randaspekt von SSH-PubKeys. Konkret: Mir ist unklar, ob ich am PubKey erkennen kann\nob er mit einem FIDO2-Gerät verknüpft ist (das ist einfach) ob er bei Verwendung einen Knopfdruck anfordert (\u0026quot;user presence\u0026quot;) ob er bei Verwendung die PIN anfordert (\u0026quot;user verification\u0026quot;) ob es sich um einen auf dem FIDO2-Gerät gespeicherten PubKey handelt (\u0026quot;resident key\u0026quot;) Traditionelle Lösung Immer mal wieder hab ich Google und andere Suchmaschinen bemüht mit Fragen wie:\n\u0026quot;query fido2 options for pubkeys\u0026quot; -\u0026gt; viel Information, nicht sonderlich sinnvolles \u0026quot;ssh-keygen\u0026quot; -\u0026gt; https://linux.die.net/man/1/ssh-keygen usw. Letztlich erstmal kein durchschlagender Erfolg!\nDann habe ich mich an Github erinnert. Github akzeptiert SSH-Schlüssel, die mit einem FIDO2-Gerät verknüpft sind. Github akzeptiert aber keinen SSH-Schlüssel, bei dem man nicht auf das FIDO2-Gerät drücken muß. Also: Irgendwie muß das für die Server-Seite unterscheidbar sein. Noch eine Suche:\n\u0026quot;sshd.config\u0026quot; -\u0026gt; https://manpages.ubuntu.com/manpages/jammy/de/man5/sshd_config.5.html -\u0026gt; PubkeyAuthOptions - \u0026quot;touch-required\u0026quot;, \u0026quot;verify-required\u0026quot; Also: Der OpenSSH-Server hat Optionen, mit denen man festlegen kann welche Optionen beim PubKey gesetzt sein müssen. Im OpenSSH-Server muß das irgendwie implementiert sein. Sichtung des Quelltextes sollte die Lösung bringen!\nMangels Zeit habe ich dies hier erstmal abgebrochen!\nAnalyse OpenSSH-Quellcode mit Copilot Ich hatte zwischenzeitlich ein paar Minuten Zeit und habe \u0026quot;spaßeshalber\u0026quot; mit der Browser-Variante vom Github-Copilot und Claude Haiku 4.5 rumgespielt:\nBrowser: GitHub\nSuchen nach OpenSSH -\u0026gt; Wechsel zum OpenSSH-Projekt\nCopilot aktiviert (oben rechts)\nErste Frage zum Quelltext: \u0026quot;Wie wird PubkeyAuthOptions touch-required geprüft?\u0026quot; -\u0026gt; Antwort von Copilot\nDie Antwort sieht schonmal ganz vielversprechend aus! Manuelle Suche im Quelltext wäre zeitaufwändiger gewesen!\nErstellen eines Abfrageprogramms mit Copilot Weitere Anfrage im Copilot: 1Schreibe ein eigenständiges Programm welches: 2 31. Einen PubKey aus einer Datei einliest 42. Seine sk_flags ermittelt 53. Die sk_flags dekodiert in Klartext 64. Dies dann als Ergebnis auf STDOUT ausgibt Antwort von Copilot Die Antwort sieht vielversprechend aus. Der Name des erstellten Programmes gefällt mir nicht Rest muß praktisch überprüft werden! Praktischer Test Implementierungsvorschlage von Copilot gespeichert: ssh-pubkey-decoder.c Kompilierung (fast wie vorgeschlagen): gcc -o ssh-pubkey-decoder ssh-pubkey-decoder.c -\u0026gt; klappt! Fehler-Test mit RSA-SSH-Schlüssel: ./ssh-pubkey-decoder ~/.ssh/uli-rsa.pub -\u0026gt; \u0026quot;Error: Key is not a FIDO security key (not *-sk type)\u0026quot; Der erste Test ist vielversprechend. \u0026quot;uli-rsa\u0026quot; ist ein RSA-Schlüssel und nicht mit einem FIDO2-Gerät verknüpft! OK-Test mit FIDO2-SSH-Schlüssel: ./ssh-pubkey-decoder ~/.ssh/uli-solokey.pub -\u0026gt; \u0026quot;Error: Key is not a FIDO security key (not *-sk type)\u0026quot; Der zweite Test geht in die Hose! Sichtung PubKey: cat ~/.ssh/uli-solokey.pub -\u0026gt; \u0026quot;sk-ssh-ed25519@openssh.com AAAAGnN...\u0026quot; Korrektur Typerkennung: 1 /* Check if this is a FIDO key */ 2- int is_sk = (strstr(keytype, \u0026#34;-sk\u0026#34;) != NULL); 3+ int is_sk = (strstr(keytype, \u0026#34;sk-\u0026#34;) != NULL); 4 5 if (!is_sk) { 6 fprintf(stderr, \u0026#34;Error: Key is not a FIDO security key (not *-sk type)\\n\u0026#34;); Kompilierung Nochmaliger Test: ./ssh-pubkey-decoder ~/.ssh/uli-solokey.pub -\u0026gt; \u0026quot;Error: Could not read sk_flags from key\u0026quot; Die KO-Ergebnisse habe ich jeweils in den Prompt eingepackt und um Korrektur gebeten. Nach zahlreichen Korrekturen klappt es leider immer noch nicht! Es stellt sich schließlich heraus, dass die betreffenden Informationen garnicht im PubKey enthalten sind! Wertung Die Ergebnisse vom praktischen Test des Copilot mit Claude Haiku 4.5 sind gemischt.\n(PLUS) Die Analyse von bestehenden Programmen klappt ganz gut und ist hilfreich (NEUTRAL) Die Implementierung von neuen Programmen klappt \u0026quot;scheinbar\u0026quot;. Es werden syntaktisch korrekte Vorschläge gemacht! (NEGATIV) Die Implementierungen werden mit positiven Aussagen garniert, die ein wenig verdecken, dass die Implementierung nicht funktioniert! Aussagen wie \u0026quot;XYZ funktioniert\u0026quot; müssen unbedingt überprüft werden! (NEUTRAL) Implementierung und Doku wird mit unnötigen Dingen ergänzt. Sieht einerseits gut aus, andererseits erhöht es den Ballast! (PLUS) Am Ende gibt es erhellende Erkenntnisse (die hoffentlich stimmen!) Details Hier die Copilot-Dialoge im Detail!\nCopilot-Dialoge Prompt- Abfrage nach Prüfung Wie wird PubkeyAuthOptions touch-required geprüft?\ncopilot-search.md\nPrompt - Implementierung Schreibe ein eigenständiges Programm welches:\nEinen PubKey aus einer Datei einliest Seine sk_flags ermittelt Die sk_flags dekodiert in Klartext Dies dann als Ergebnis auf STDOUT ausgibt copilot-implement.md, ssh-pubkey-decoder.c\nPrompt - erste Fehlerkorrektur Hier ein gültiger Pubkey: \u0026quot;sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIBLpj7x6pLk5arOrX/OFUYiw8CfHbQH999g291Qqxy6mAAAABHNzaDo= uli.heller_pin\u0026quot;. Leider zeigt das Programm statt den Flags diese Fehlermeldung: Error: Key is not a FIDO security key (not *-sk type). Korrigiere es!\ncopilot-v2.md, ssh-pubkey-decoder-v2.c\nPrompt - noch eine Fehlerkorrektur Leider klappt es immer noch nicht. Jetzt bekomme ich den Fehler Error: Could not read sk_flags from key. Korrigiere das!\ncopilot-v3.md, ssh-pubkey-decoder-v3.c\nPrompt - immer noch nicht OK Fehlermeldung: Error: Not enough data left to read sk_flags. Bitte korrigieren!\ncopilot-v4.md, ssh-pubkey-decoder-v4.c\nPrompt - Fehler bei KeyType? Ich habe den Eindruck, dass das Lesen des KeyType nicht stimmt. Da werden zu viele Daten gelesen. Der KeyType endet mit openssh.com\ncopilot-v5.md, ssh-pubkey-decoder-v5.c\nPrompt - Offset-Fehler Der Offset nach Schritt 2 stimmt nicht. 30+32=62, nicht 66. Bitte korrigieren\ncopilot-v6.md, ssh-pubkey-decoder-v6.c\nPrompt - sk_flags und key_handle Es klappt leider immer noch nicht. Sind die sk_flags wirklich außerhalb vom key_handle?\ncopilot-v8.md, ssh-pubkey-decoder-v8.c\nPrompt - Aufbau key_handle Wie sieht der interne Aufbau vom key handle aus?\ncopilot-v9.md\nPrompt - Wie macht es OpenSSH? Wie wird der pubkey von openssh gelesen und geparst?\ncopilot-v10.md\nHier stellt sich heraus, dass die \u0026quot;sk_flags\u0026quot; im PubKey garnicht enthalten sind!\nPrompt: Wie erfolgt die Prüfung der Flags? copilot-v11.md\nPrüfung erfolgt via FIDO-Signatur.\nVersionen Getestet unter Ubuntu-24.04 mit Online-Copilot und Claude Haiku 4.5 Links GitHub OpenSSH-Projekt Historie 2026-04-06: Weitere Korrekturen, Copilot-Dialoge und Wertung 2026-04-05: Erste Version ","link":"https://uli.heller.cool/blog/2026-04-05_copilot-ssh-pubkey-decoder/","section":"blog","tags":["copilot"],"title":"Praxistests mit Copilot - ssh-pubkey-decoder"},{"body":"","link":"https://uli.heller.cool/tags/","section":"tags","tags":null,"title":"Tags"},{"body":" Seit einiger Zeit verwende ich Copilot-CLI zur Unterstützung meiner Arbeit bei einem meiner Kunden. Streng genomen ist Copilot-CLI eine Kundenvorgabe und aktuell soll so viel wie möglich mit Copilot-CLI gemacht werden.\nMeine Beobachtung: Man schaltet dann mehr und mehr das Hirn aus und läßt zunehmend mehr Aktionen direkt von Copilot-CLI ausführen. Das sorgt für wachsendes Unbehagen wenn nicht klar ist, auf welche Daten Copilot-CLI zugreifen kann.\nIdee: Ich betreibe den Copilot-CLI in einem Container! Dazu verwende ich INCUS. Es klappt auch mit LXC/LXD, die notwendigen Kommandos unterscheiden sich minimal (\u0026quot;incus\u0026quot; -\u0026gt; \u0026quot;lxc\u0026quot;, \u0026quot;.incus\u0026quot; -\u0026gt; \u0026quot;.lxd\u0026quot;).\nVorarbeiten Grundcontainer mit Ubuntu-Basisinstallation: ubuntu-26.04 Copilot-CLI herunterladen: copilot-1.0.12-linux-x64.tar.gz Virencheck Container initialisieren Arbeitsplatzrechner: Container kopieren und starten incus copy ubuntu-2604 uli-copilot-cli incus start uli-copilot-cli Copilot-CLI in Container kopieren: incus file push copilot-1.0.12-linux-x64.tar.gz uli-copilot-cli/home/ubuntu/copilot-1.0.12-linux-x64.tar.gz Kommandozeile im Container starten: incus exec uli-copilot-cli -- sudo -u ubuntu -i Copilot-CLI im Container auspacken und ausführbar machen: mkdir bin gzip -cd copilot-1.0.12-linux-x64.tar.gz|(cd bin; tar xf -) echo \u0026quot;PATH=\\\u0026quot;\\${PATH}:\\${HOME}/bin\u0026quot;\\\u0026quot; \u0026gt;\u0026gt;\u0026quot;${HOME}/.bashrc\u0026quot; exit Testaufruf von Copilot-CLI im Container: 1$ incus exec uli-copilot-cli -- sudo -u ubuntu -i 2 3ubuntu@uli-copilot-cli:~$ copilot 4... 5(some more or less nice looking output shows up - press Esc twice to exit) 6Total usage est: 0 Premium requests 7API time spent: 0s 8Total session time: 57s 9Total code changes: +0 -0 10 11Resume any session with copilot --resume 12 13ubuntu@uli-copilot-cli:~$ Copilot-CLI initialisieren Kommandozeile im Container: incus exec uli-copilot-cli -- sudo -u ubuntu -i Testverzeichnis anlegen und reinwechseln: mkdir copilot-test \u0026amp;\u0026amp; cd copilot-test Copilot-CLI im Container starten: copilot --no-mouse Confirm folder trust - 2. Yes, and remember this folder for future sessions /login GitHub.com -\u0026gt; one-time code wird angezeigt Browser: https://github.com/login/device -\u0026gt; one-time code eintippen Browser: Authorize -\u0026gt; \u0026quot;Congratulations\u0026quot; GithHub MCP Server: Connected Unten rechts: Claude Haiku 4.5 \u0026lt;-- verwendetes Modell /model -\u0026gt; Modell-Liste wird angezeigt Claude Haiku 4.5 (default) GPT-5 mini GPT-4.1 Erkenntnis: Es stehen sehr eingeschränkte Modelle zur Verfügung, sofern man die Gratis-Variante von Copilot verwendet! Wenn man sich in GitHub mit einem Konto anmeldet, das eine kommerzielle Copilot-Lizent hat, dann stehen diese Modelle zur Verfügung: Claude Sonnet 4.6 (default) ✓ 1x Claude Sonnet 4.5 1x Claude Haiku 4.5 0.33x Claude Opus 4.6 3x Claude Opus 4.5 3x Claude Sonnet 4 1x GPT-5.4 1x GPT-5.3-Codex 1x GPT-5.2 1x GPT-5.1-Codex-Max 1x GPT-5 mini 0x GPT-4.1 0x Test: Klappt die Erstellung eines Puppet-Moduls? Voraussetzung: Copilot-CLI ist gestartet, Modell \u0026quot;Claude Haiku 4.5\u0026quot; ist angewählt Prompt: erstelle ein module für puppetenterprise welches einen apache httpd, einen tomcat und eine webapp innerhalb des tomcats auf einem Rechner installiert Schluss-Statistik: 1Total usage est: 1 Premium request 2 API time spent: 17s 3 Total session time: 7m 34s 4 Total code changes: +772 -0 5 Breakdown by AI model: 6 claude-haiku-4.5 92.5k in, 2.2k out, 60.7k cached (Est. 1 Premium request) 7 8 Resume this session with: 9 copilot --resume=4a787838-532c-4de2-b73a-3d99b0e1463f copilot-conversation.md Erzeugtes Modul: webserver_stack_v1/README.md webserver_stack_v1/examples/advanced.pp webserver_stack_v1/examples/init.pp webserver_stack_v1/files/tomcat.service webserver_stack_v1/files/web.xml webserver_stack_v1/manifests/apache.pp webserver_stack_v1/manifests/init.pp webserver_stack_v1/manifests/reverse_proxy.pp webserver_stack_v1/manifests/tomcat.pp webserver_stack_v1/manifests/webapp.pp webserver_stack_v1/metadata.json webserver_stack_v1/README.md webserver_stack_v1/templates/index.jsp.epp webserver_stack_v1/templates/reverse_proxy.conf.epp webserver_stack_v1/templates/server.xml.epp Kurzsichtung: Es werden alte Versionen verwendet, bspw Ubuntu 18.04 und 20.04 oder Tomcat 9 Grundstruktur sieht OK aus Weitergehende Tests Klappt die Erweiterung/Anpassung auf Ubuntu-24.04, Java 21 und Tomcat 10? Prompt: Ich würde das puppetmodule gerne mit ubuntu-24.04 verwenden und auch mit java-21 und tomcat-10. Was muß ich ändern? -\u0026gt; Scheint zu klappen! Prompt: muß ich was ändern, damit das puppetmodule mit puppet-3.5 läuft? -\u0026gt; Erklärungen werden ausgegeben, ich gebe an, dass ich die Änderungen nicht machen möchte! Konversation: additions.md Angepasstes Modul: webserver_stack_v2/README.md webserver_stack_v2/examples/advanced.pp webserver_stack_v2/examples/init.pp webserver_stack_v2/files/tomcat.service webserver_stack_v2/files/web.xml webserver_stack_v2/manifests/apache.pp webserver_stack_v2/manifests/init.pp webserver_stack_v2/manifests/reverse_proxy.pp webserver_stack_v2/manifests/tomcat.pp webserver_stack_v2/manifests/webapp.pp webserver_stack_v2/metadata.json webserver_stack_v2/README.md webserver_stack_v2/templates/index.jsp.epp webserver_stack_v2/templates/reverse_proxy.conf.epp webserver_stack_v2/templates/server.xml.epp Zugriff auf ein einzelnes Projektverzeichnis Ausgangspunkt: \u0026quot;Außerhalb\u0026quot; liegt ein Projekt ab, welches mit dem Copilot-Container geteilt werden soll! Ermitteln: Welche Nutzerkennung wird außerhalb verwendet? id -u -\u0026gt; 9032 id -g -\u0026gt; 9032 Ziel: Diese Nutzerkennung brauchen wir auch innerhalb vom Copilot-Container! \u0026quot;root\u0026quot; im Container: incus exec uli-copilot-cli bash Gruppenkennung ändern: groupmod -g 9032 ubuntu Nutzerkennung ändern: usermod -u 9032 -g 9032 ubuntu Dateien anpassen: find / -user 1000|xargs -r chown 9032 find / -group 1000|xargs -r chgrp 9032 Kontrolle: ls -l /home -\u0026gt; \u0026quot;drwxr-x--- 1 ubuntu ubuntu 262 Mar 28 17:47 ubuntu\u0026quot; Auswahl: Welches Projektverzeichnis soll im Container verwendet werden? /home/uheller/shared-with-copilot Zugriff freigeben: incus config device add uli-copilot-cli shared-with-uli-copilot-cli disk source=/home/uheller/shared-with-copilot path=/home/ubuntu/shared-with-host shift=true Klappt nicht mit incus-6.0 und Linux \u0026gt;= 6.9 (Error: Failed to start device \u0026quot;shared-with-host\u0026quot;: Required idmapping abilities not available) Klappt mit incus-6.23.0 Nachkontrolle: Ist das Proijektverzheichnis sichtbar innerhalb vom Copilot-Container? incus exec uli-copilot-cli -- sudo -u ubuntu -i ls -\u0026gt; shared-with-host ls -l shared-with-host|head -5 -\u0026gt; passt! Dateien \u0026quot;gehören\u0026quot; ubuntu.ubuntu Versionen Getestet unter Ubuntu-2404 mit einem Container basierend auf Ubuntu-2604 und Copilot-CLI-1.0.12 Links Copilot-CLI Simos Xenitellis - How to share a folder between a host and a container in Incus Arch - SOLVED Unable to use idmapping in incus with linux 6.9 Github/Incus - Linux 6.9+ idmapping abilities are required but aren't supported on system Historie 2026-04-23: Tippfehler korrigiert 2026-03-31: Hinweise auf LXC/LXD 2026-03-29: Mehr Hinweise zum Problem mit \u0026quot;shift=true\u0026quot;, Anpassungen/Erweiterungen am Puppet-Modul 2026-03-28: Erste Version ","link":"https://uli.heller.cool/blog/2026-03-28_copilot-halbwegs-sicher/","section":"blog","tags":["copilot"],"title":"Copilot-CLI in einem Container"},{"body":"","link":"https://uli.heller.cool/tags/linux/","section":"tags","tags":null,"title":"Linux"},{"body":" Bei einem meiner Kundenprojekte bin ich angehalten, wann immer möglich Copilot einzusetzen. Leider gibt es Probleme mit dem Kommandozeilen-Client und Linux: Sobald er gestartet wurde, dann man im betreffenden Fenster die Funktionen \u0026quot;Kopieren und Einfügen\u0026quot; (copy\u0026amp;paste) nicht mehr verwenden.\nWarum stört das Problem? Ich lasse Copilot in einem Container laufen. \u0026quot;Er\u0026quot; hat keinen Zugriff auf meine übliche Entwicklungsumgebung. Benötigte Informationen möchte ich via \u0026quot;Kopieren und Einfügen\u0026quot; dem Copilot zukommen lassen. Da stört es sehr, wenn dies nicht klappt!\nErste Lösung: \u0026quot;--no-mouse\u0026quot; Eine erste Lösung basiert auf einem geänderten Aufruf von Copilot:\nBislang: copilot Nun: copilot --no-mouse Damit klappt \u0026quot;Kopieren und Einfügen\u0026quot;, man verliert aber gewisse Komfort-Funktionen innerhalb von Copilot, insbesondere die Navigation mit der Maus.\nZweite Lösung: \u0026quot;xclip\u0026quot; Bei der zweiten Lösung läuft's so:\nWechsel in den Container: ssh -XA ubuntu@copilot.lxd Installieren von \u0026quot;xclip\u0026quot; im Container: sudo apt install xclip Aufruf von Copilot: copilot Damit klappt \u0026quot;Kopieren und Einfügen\u0026quot; und die Komfort-Funktionen innerhalb von Copilot bleiben erhalten.\nVersionen Getestet unter Ubuntu-22.04 mit Copilot-v1.0.11 - klappt Getestet unter Ubuntu-24.04 mit Copilot-v1.0.12 - \u0026quot;xclip\u0026quot; klappt nicht, \u0026quot;--no-mouse\u0026quot; klappt Nochmaliger Test ein paar Tage später, gleiche Versionen - \u0026quot;xclip\u0026quot; klappt auch! Links Github - Copilot blocks right click menu of console Historie 2026-03-29: Probleme mit Ubuntu-24.04 und copilot-1.0.12 sind mysteriöser Weise weg 2026-03-28: Probleme mit Ubuntu-24.04 und copilot-1.0.12 2026-03-24: Erste Version ","link":"https://uli.heller.cool/blog/2026-03-24_copilot-copy-paste.md/","section":"blog","tags":["linux","ubuntu","copilot"],"title":"Linux: Copilot und Kopieren/Einfügen"},{"body":"","link":"https://uli.heller.cool/tags/ubuntu/","section":"tags","tags":null,"title":"Ubuntu"},{"body":"","link":"https://uli.heller.cool/categories/fido2/","section":"categories","tags":null,"title":"FIDO2"},{"body":" Neuere Versionen von SystemD erlauben es, einen FIDO2-Stick für die Festplattenverschlüsselung zu verwenden. Hier beschreibe ich meine Versuche, die Festplattenverschlüsselung ohne SystemD zu Entschlüsseln.\nVorarbeiten In Linux: Datenträger mit FIDO2-Stick verschlüsseln habe ich einen USB-Stick verschlüsselt mit meinem SoloKey und meinem YubiKey.\nHilfsskripte determine-token-id.sh ... ermittelt die TokenID des eingesteckten FIDO2-Sticks für einen verschlüsselten Datenträger determine-secret.sh ... ermittelt das Geheimnis des eingesteckten FIDO2-Sticks für einen verschlüsselten Datenträger Entschlüsselungsablauf Gerätedatei für den verschlüsselten Datenträger ermitteln: 1$ lsblk -o name,fstype 2NAME FSTYPE 3... 4sdc 5└─sdc1 crypto_LUKS 6... Sicherstellen: Es ist genau ein FIDO2-Stick eingesteckt Optional - TokenID ermitteln: sudo ./determine-token-id.sh /dev/sdc1 -\u0026gt; \u0026quot;0\u0026quot; Geheimnis ermitteln (GEHEIM!): 1$ sudo ./determine-secret.sh /dev/sdc1 2Enter PIN for /dev/hidraw3: 3+Yr59XYHhMHqcqXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= Datenträger entsperren mit diesem Geheimnis: 1$ lsblk /dev/sdc1 2NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS 3sdc1 8:33 1 20G 0 part 4 5$ sudo cryptsetup luksOpen /dev/sdc1 crypt 6Geben Sie die Passphrase für »/dev/sdc1« ein: +Yr59XYHhMHqcqXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= 7 8$ lsblk /dev/sdc1 9NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS 10sdc1 8:33 1 20G 0 part 11└─crypt 252:8 0 20G 0 crypt Aufräumen - Datenträger wieder sperren: sudo cryptsetup luksClose crypt Erkenntnisse Die Entschlüsselung klappt auch ohne SystemD Für die Verschlüsselung wird ein Geheimnis verwendet, das relativ problemlos ausgelesen werden kann Voraussetzung: \u0026quot;root\u0026quot; + physischer Zugriff auf den FIDO2-Stick + PIN des FIDO2-Sticks + Zugriff auf den verschlüsselten Datenträger Versionen Getestet unter Ubuntu-2404 Links Linux: Datenträger mit FIDO2-Stick verschlüsseln Github - bertogg - fido2luks keyscript.sh Historie 2026-03-15: Erste Version ","link":"https://uli.heller.cool/blog/2026-03-15_luks-fido2-decrypt/","section":"blog","tags":["linux","ubuntu"],"title":"Linux: Datenträger mit FIDO2-Stick \"manuell\" entschlüsseln"},{"body":" Neuere Versionen von SystemD erlauben es, einen FIDO2-Schlüssel für die Festplattenverschlüsselung zu verwenden. Hier beschreibe ich meine Experimente damit!\nGetestete FIDO2-Schlüssel Ich habe meine Tests unternommen mit einem SoloKey und einem YubiKey. Für beide FIDO2-Schlüssel habe ich eine FIDO2-PIN vergeben.\nSoloKey: fido2-token -S /dev/hidraw3 oder fido2-token -C /dev/hidraw3 YubiKey: ykman fido access change-pin Externen USB-Datenträger zusätzlich mit FIDO2-Schlüssel entsperren Zielsetzung Ausgangpunkt: Ich habe einen externen USB-Datenträger mit LUKS-Festplattenverschlüsselung Ziel: Ich möchte ihn auch mit einem FIDO2-Schlüssel und PIN entschlüsseln können Einrichtung USB-Datenträger anschliessen Daten des USB-Datenträgers abfragen: lsblk -\u0026gt; /dev/sdc, LUKS=/dev/sdc1 Sicherstellen: Nur richtiger FIDO2-Stick ist eingesteckt - SoloKey SoloKey für Plattenverschlüsselung eintragen: sudo systemd-cryptenroll --fido2-device=auto /dev/sdc1 Bestehendes LUKS-Kennwort: xxxxx PIN vom SoloKey: yyyyy SoloKey drücken SoloKey nochmals drücken Sicherstellen: Nur richtiger FIDO2-Stick ist eingesteckt - YubiKey Bestehendes LUKS-Kennwort: xxxxx FIDO2-PIN vom YubiKey: yyyyy YubiKey drücken YubiKey nochmals drücken Test Kommandozeile SoloKey Da ich den SoloKey zuerst eingerichtet habe, ist er das Token 0.\nLUKS öffnen - Entschlüsseln mit SoloKey: sudo cryptsetup open --token-id 0 /dev/sdc1 usb-crypt PIN vom SoloKey wird abgefragt Danach: SoloKey drücken Einbinden: sudo mount /dev/mapper/usb-crypt /mnt -\u0026gt; klappt Ausbinden: sudo umount /mnt LUKS schliessen: sudo cryptsetup close usb-crypt YubiKey Da ich den YubiKey nach dem SoloKey eingerichtet habe, ist er das Token 1.\nLUKS öffnen - Entschlüsseln mit YubiKey: sudo cryptsetup open --token-id 1 /dev/sdc1 usb-crypt PIN vom YubiKey wird abgefragt Danach: YubiKey drücken Einbinden: sudo mount /dev/mapper/usb-crypt /mnt -\u0026gt; klappt Ausbinden: sudo umount /mnt LUKS schliessen: sudo cryptsetup close usb-crypt Kennwort LUKS öffnen - Entschlüsseln ohne FIDO2-Schlüssel: sudo cryptsetup open /dev/sdc1 usb-crypt Kennwort wird abgefragt Danach: Typischerweise längere Wartezeit Einbinden: sudo mount /dev/mapper/usb-crypt /mnt -\u0026gt; klappt Ausbinden: sudo umount /mnt LUKS schliessen: sudo cryptsetup close usb-crypt Hinweis: \u0026quot;Manchmal\u0026quot; habe ich beobachtet, dass beim \u0026quot;LUKS öffnen\u0026quot; der zuletzt angelegte FIDO2-Schlüssel verwendet wird. Eine Systematik habe ich hierbei nicht festgestellt!\nTest Desktop USB-Datenträger anschliessen Entsperren nur mittels Kennwort möglich - schade! Offene Punkte Verwendung für die Boot-Platte - Entsperren beim Systemstart muß klappen! Entsperren via GNOME-Desktop geht aktuell nur via Kennwort Entsperren wenn unklar ist, welche \u0026quot;token-id\u0026quot; der angeschlossene FIDO2-Schlüssel hat Tests Nachfolgende Tests habe ich mit Ubuntu-24.04 durchgeführt. Ich verwende für die Tests einen USB-Datenträger. Dieser wird bei den Tests gelöscht und überschrieben, eventuell vorher vorhandene Daten gehen verloren!\nIst SystemD neu genug? dpkg -l systemd Bei mir: 255.4-1ubuntu8.12 Ab 248 ist's neu genug USB-Datenträger anschliessen Daten des USB-Datenträgers abfragen: lsblk -\u0026gt; /dev/sdc USB-Datenträger partitionieren: sudo gdisk /dev/sdc n 1 20 default=2048 +20G 8309 p 1Number Start (sector) End (sector) Size Code Name 2 1 2048 41945087 20.0 GiB 8309 Linux LUKS w Y LUKS initialisieren: sudo cryptsetup --cipher aes-xts-plain64 --key-size 256 --hash sha256 --iter-time=10000 luksFormat /dev/sdc1 YES test test LUKS-Metadaten sichern: sudo cryptsetup luksDump --dump-json-metadata /dev/sdc1|tee luksdump-1.json - luksdump-1.json Sicherstellen: Nur richtiger FIDO2-Stick ist eingesteckt - SoloKey LUKS - FIDO2-Schlüssel hinzufügen: sudo systemd-cryptenroll --fido2-device=auto /dev/sdc1 test PIN vom FIDO2-Schlüssel FIDO2-Schlüssel 2x drücken LUKS-Metadaten nochmals sichern: sudo cryptsetup luksDump --dump-json-metadata /dev/sdc1|tee luksdump-2.json - luksdump-2.json SoloKey trennen, YubiKey einstecken LUKS - zweiten FIDO2-Schlüssel hinzufügen: sudo systemd-cryptenroll --fido2-device=auto /dev/sdc1 test FIDO2-Schlüssel 2x drücken, PIN wird nicht benötigt LUKS-Metadaten nochmals sichern: sudo cryptsetup luksDump --dump-json-metadata /dev/sdc1|tee luksdump-3.json - luksdump-3.json Zugriff testen mit YubiKey: sudo cryptsetup open /dev/sdc1 xxxxx YubiKey 1x drücken -\u0026gt; klappt sudo cryptsetup close xxxxx Zugriff testen ohne YubiKey: sudo cryptsetup open /dev/sdc1 xxxxx YubiKey abziehen test -\u0026gt; klappt sudo cryptsetup close xxxxx YubiKey trennen, SoloKey einstecken Zugriff testen mit SoloKey: sudo cryptsetup open --token-id 0 /dev/sdc1 xxxxx SoloKey PIN: yyyyy SoloKey drücken -\u0026gt; klappt Notizen Anzahl RKs auf Solokey 1$ date 2Do 19. Mär 09:10:27 CET 2026 3 4$ fido2-token -I -c /dev/hidraw3 5Enter PIN for /dev/hidraw3: 6existing rk(s): 10 7remaining rk(s): 40 Löschen vom YubiKey 1$ sudo cryptsetup luksDump /dev/sdc1 2... 3# Slot[2] und Token[1] müssen weg 4 5$ sudo cryptsetup -v luksKillSlot /dev/sdc1 2 6Schlüsselfach 2 zum Löschen ausgewählt. 7Geben Sie irgendeine verbleibende Passphrase ein: 8Schlüsselfach 0 entsperrt. 9Schlüsselfach 2 entfernt. 10Befehl erfolgreich. 11 12$ sudo cryptsetup token remove --token-id 1 /dev/sdc1 13 14$ sudo cryptsetup luksDump /dev/sdc1 15... 16# Hat geklappt! 17 18# Klappt es danach mit dem SoloKey? 19$ sudo cryptsetup open /dev/sdc1 xxxxx 20Geben Sie die Passphrase für »/dev/sdc1« ein: 21# NEIN! 22 23# SoloKey auch noch löschen 24# SoloKey neu anlegen -\u0026gt; klappt\u0026#39;s? 25$ sudo cryptsetup open /dev/sdc1 xxxxx 26Geben Sie die Passphrase für »/dev/sdc1« ein: 27# NEIN! 28 29$ sudo cryptsetup open --token-id 0 /dev/sdc1 xxxxx 30Geben Sie die PIN des Tokens 0 ein: 31Asking FIDO2 token for authentication. 32👆 Please confirm presence on security token to unlock. 33 34$ sudo cryptsetup close xxxxx Versionen Getestet unter Ubuntu-2404 Links Github - bertogg - fido2luks keyscript.sh PidEins - Unlocking LUKS2 volumes with TPM2, FIDO2, PKCS#11 Security Hardware on systemd 248 man7 - cryptsetup-token ArchLinux - fido2-token fido2-token -I -c /dev/hidraw3 StackExchange - How to auto-mount (encrypted) partitions of an USB stick using udev and systemd Historie 2026-03-14: Erste Version ","link":"https://uli.heller.cool/blog/2026-03-14_luks-fido2/","section":"blog","tags":["linux","ubuntu"],"title":"Linux: Datenträger mit FIDO2-Stick verschlüsseln"},{"body":"","link":"https://uli.heller.cool/tags/gnome-boxes/","section":"tags","tags":null,"title":"Gnome Boxes"},{"body":"","link":"https://uli.heller.cool/categories/virtualisierung/","section":"categories","tags":null,"title":"Virtualisierung"},{"body":" Gestern habe ich Windows 10 in Gnome-Boxes installiert. Eine Anleitung findet sich hier (Windows 10 in Gnome-Boxes).\nWindows 11 klappt nicht ganz so einfach wegen der Mindestvoraussetzungen TPM und SecureBoot. Mit etwas Spielerei geht es aber doch. Hier die Details!\nWindows-11-ISO Für die Installation habe ich diese ISO-Datei verwendet: Win11_23H2_German_x64v2.iso. Sie ist recht alt und das ist Absicht. Man konnte sie früher mal bei Microsoft herunterladen. Keine Ahnung, ob das immer noch klappt. Mit der alten Version kann man die Prüfung der Mindestvoraussetzungen abschalten, bei neueren scheint es Probleme zu geben (=habe ich nicht überprüft).\nGrundinstallation Die Grundinstallation innerhalb von Gnome-Boxes ist mega-einfach:\nNeue Box anlegen Windows-11-ISO auswählen 16 GB Hauptspeicher 50 GB Plattenspeicher Dann die Installation starten Bei der Sprachauswahl \u0026quot;Shift-F10\u0026quot; drücken -\u0026gt; Kommandozeile erscheint Kommando regedit ausführen -\u0026gt; RegistryEditor wird gestartet Wechseln zu HKEY_LOCAL_MACHINE - SYSTEM - Setup Rechter Bereich: Neuen RegistryKey anlegen - LabConfig Wechseln zu LabConfig Rechter Bereich: Neuen DWORD(32-bit)-Wert anlegen BypassTPMCheck Doppelklick -\u0026gt; Wert 1 Rechter Bereich: Neuen DWORD(32-bit)-Wert anlegen BypassSecureBootCheck Doppelklick -\u0026gt; Wert 1 Rechter Bereich: Neuen DWORD(32-bit)-Wert anlegen BypassRAMCheck Doppelklick -\u0026gt; Wert 1 RegistryEditor schliessen Installation fortsetzen Zwischenstand vom RegistryEditor:\nDie vorigen Anpassungen sind hier bei TomsHardware beschrieben!\nKonfiguration Nach der Installation erscheint der Konfigurationsassistent. Diesen auch \u0026quot;durchklicken\u0026quot;. Ich denke, es sind ein paar Neustarts erforderlich.\nAktualisierungen Nach der Konfiguration alle Aktualisierungen einspielen! Das erfordert viele Downloads und ein paar weitere Neustarts!\nVerbesserung der Integration Auffällig und störend sind:\nSchlechte Bildschirmauflösung Schlechte Mausintegration - wird immer \u0026quot;gefangen\u0026quot; und muß mit \u0026quot;links-strg-alt\u0026quot; wieder befreit werden \u0026quot;Kopieren und Einfügen\u0026quot; funktioniert nicht zwischen Windows und Linux Zur Abhilfe können die \u0026quot;spice-guest-tools\u0026quot; von https://www.spice-space.org eingespielt werden:\nspice-guest-tools-0.141.exe herunterladen Virencheck Ausführen -\u0026gt; alles \u0026quot;abnicken\u0026quot; Danach klappt's perfekt!\nVersionen Ubuntu-24.04.3 Kernel 6.17.0-14-generic Gnome-Boxes 46.0-1build1 VirtManager 1:4.1.0-3ubuntu0.1 Links spice-guest-tools-0.141.exe Windows in VirtManager Windows 10 in Gnome-Boxes TomsHardware - Bypass Win11 TPM Requirement Historie 2026-02-08: Erste Version ","link":"https://uli.heller.cool/blog/2026-02-08_win11-in-gnome-boxes/","section":"blog","tags":["gnome boxes","ubuntu","linux"],"title":"Windows 11 in Gnome-Boxes"},{"body":" Vor langer Zeit habe ich Windows 10 in VirtManager installiert und hier (Windows in VirtManager) beschrieben. Leider habe ich die Anmeldedaten verbummelt und kann die Installation nicht mehr nutzen.\nAlso: Neuinstallation, diesmal in Gnome-Boxes!\nWarum nicht Windows-11? Kurz habe ich mit Windows-11 geliebäugelt. Leider scheitert die Installation an den Installationsvoraussetzungen. Die kann man umgehen, ich beschreibe den Ablauf später mal. Vorerst nehme ich den einfachen Weg und verwende Windows-10.\nWindows-10-ISO Für die Installation habe ich diese ISO-Datei verwendet: Win10_22H2_German_x64v1.iso. Sie ist recht alt. Man konnte sie früher mal bei Microsoft herunterladen. Keine Ahnung, ob das immer noch klappt.\nGrundinstallation Die Grundinstallation innerhalb von Gnome-Boxes ist mega-einfach:\nNeue Box anlegen Windows-10-ISO auswählen 16 GB Hauptspeicher 50 GB Plattenspeicher Dann die Installation \u0026quot;durchklicken\u0026quot; Konfiguration Nach der Installation erscheint der Konfigurationsassistent. Diesen auch \u0026quot;durchklicken\u0026quot;. Ich denke, es sind ein paar Neustarts erforderlich.\nAktualisierungen Nach der Konfiguration alle Aktualisierungen einspielen! Das erfordert viele Downloads und ein paar weitere Neustarts!\nVerbesserung der Integration Auffällig und störend sind:\nSchlechte Bildschirmauflösung Schlechte Mausintegration - wird immer \u0026quot;gefangen\u0026quot; und muß mit \u0026quot;links-strg-alt\u0026quot; wieder befreit werden \u0026quot;Kopieren und Einfügen\u0026quot; funktioniert nicht zwischen Windows und Linux Zur Abhilfe können die \u0026quot;spice-guest-tools\u0026quot; von https://www.spice-space.org eingespielt werden:\nspice-guest-tools-0.141.exe herunterladen Virencheck Ausführen -\u0026gt; alles \u0026quot;abnicken\u0026quot; Danach klappt's perfekt!\nVersionen Ubuntu-24.04.3 Kernel 6.17.0-14-generic Gnome-Boxes 46.0-1build1 VirtManager 1:4.1.0-3ubuntu0.1 Links spice-guest-tools-0.141.exe Windows in VirtManager Historie 2026-02-07: Erste Version ","link":"https://uli.heller.cool/blog/2026-02-07_win10-in-gnome-boxes/","section":"blog","tags":["gnome boxes","ubuntu","linux"],"title":"Windows 10 in Gnome-Boxes"},{"body":" Für einen meiner Kunde habe ich gelegentlich mit einer Art QR-Code zu tun. Die Art sieht \u0026quot;anders\u0026quot; aus als übliche QR-Codes. Eine Google-Suche zeigt, dass es sich um einen \u0026quot;2D-DataMatrix-Code\u0026quot;.\nStandardprogramme wie zbarimg können damit leider nicht umgehen. Mit etwas Suchen habe ich ein anderes Programm gefunden, welches dafür geeignet ist.\nBeispiel eines 2D-DataMatrix-Codes Ein Versuch mit ZBARIMG 1$ zbarimg matrix-code.png 2scanned 0 barcode symbols from 1 images in 0 seconds 3 4WARNING: barcode data was not detected in some image(s) 5Things to check: 6 - is the barcode type supported? Currently supported symbologies are: 7\t. EAN/UPC (EAN-13, EAN-8, EAN-2, EAN-5, UPC-A, UPC-E, ISBN-10, ISBN-13) 8\t. DataBar, DataBar Expanded 9\t. Code 128 10\t. Code 93 11\t. Code 39 12\t. Codabar 13\t. Interleaved 2 of 5 14\t. QR code 15\t. SQ code 16 - is the barcode large enough in the image? 17 - is the barcode mostly in focus? 18 - is there sufficient contrast/illumination? 19 - If the symbol is split in several barcodes, are they combined in one image? 20 - Did you enable the barcode type? 21 some EAN/UPC codes are disabled by default. To enable all, use: 22 $ zbarimg -S*.enable \u0026lt;files\u0026gt; 23 Please also notice that some variants take precedence over others. 24 Due to that, if you want, for example, ISBN-10, you should do: 25 $ zbarimg -Sisbn10.enable \u0026lt;files\u0026gt; Google ist Dein Freund Eine Google-Suche nach \u0026quot;2D-Data-Matrix-Code scan linux\u0026quot; liefert u.a. einen Link auf scanbot.io - ata Matrix Code Scanner und dort wiederum gibt es einen Link nach ask Ubuntu - Software to read a QR code?.\ndmtx-utils Installieren 1$ sudo apt install dmtx-utils Bild nach Text 1$ dmtxread matrix-code.png 21 32 4... Text nach Bild 1$ seq 1 10 | dmtxwrite -o matrix-code.png ... erzeugt die Datei matrix-code.png\nHinweis: Mit der Standard-Version des Tools von Ubuntu-24.04 gibt es einen Abbruch mit einem Fehler!\nProbleme Erledigt - Absturz beim Erzeugen eines Bildes Fehler:\n1$ echo -n 123456 | dmtxwrite -o message.png 2*** buffer overflow detected ***: terminated 3Abgebrochen Korrektur:\n1--- dmtx-utils-0.7.6/dmtxwrite/dmtxwrite.c 2025-05-26 13:20:58.000000000 +0900 2+++ dmtx-utils/dmtxwrite/dmtxwrite.c 2025-05-26 13:18:18.823289015 +0900 3@@ -340,7 +340,7 @@ 4 5 /* Read input contents into buffer */ 6 for(bytesReadTotal = 0;; bytesReadTotal += bytesRead) { 7- bytesRead = read(fd, codeBuffer + bytesReadTotal, DMTXWRITE_BUFFER_SIZE); 8+ bytesRead = read(fd, codeBuffer + bytesReadTotal, DMTXWRITE_BUFFER_SIZE - bytesReadTotal); 9 if(bytesRead == 0) 10 break; Versionen Getestet unter Ubuntu-2404 Links Ubuntu - dmtx-utils package - Aborted (core dumped) on 24.04 Ubuntu version scanbot.io - ata Matrix Code Scanner ask Ubuntu - Software to read a QR code? Historie 2025-11-29: Erste Version ","link":"https://uli.heller.cool/blog/2025-11-29_datamatrix-unter-linux/","section":"blog","tags":["linux","ubuntu"],"title":"2D-DataMatrix-Codes einlesen unter Linux"},{"body":"","link":"https://uli.heller.cool/categories/sonstiges/","section":"categories","tags":null,"title":"Sonstiges"},{"body":"","link":"https://uli.heller.cool/tags/docker/","section":"tags","tags":null,"title":"Docker"},{"body":"","link":"https://uli.heller.cool/tags/incus/","section":"tags","tags":null,"title":"Incus"},{"body":"","link":"https://uli.heller.cool/tags/lxc/","section":"tags","tags":null,"title":"Lxc"},{"body":"","link":"https://uli.heller.cool/categories/lxc/lxd/","section":"categories","tags":null,"title":"LXC/LXD"},{"body":" Seit neuestem startet Docker in einem Ubuntu-Container nicht mehr. Man erhält Fehlermeldungen wie diese:\n1root@docker-2404:~# docker run hello-world 2docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: open sysctl net.ipv4.ip_unprivileged_port_start file: reopen fd 8: permission denied: unknown 3 4Run \u0026#39;docker run --help\u0026#39; for more information Betroffen sind Container mit LXD/LXC und INCUS. Hier einige Lösungsvarianten!\nAppArmor für RUNC deaktivieren Eine Möglichkeit besteht darin, innerhalb des Containers AppArmor für RUNC zu deaktivieren:\n1$ incus exec docker-2404 bash 2 3root@docker-2404:~# ln -s /etc/apparmor.d/runc /etc/apparmor.d/disable/ 4root@docker-2404:~# apparmor_parser -R /etc/apparmor.d/runc Danach klappt es wieder!\nÄltere Version von RUNC verwenden Das Problem tritt auf, seit RUNC auf die Version 1.3.3 aktualisiert wurde. Es verschwindet, wenn man eine ältere Version einspielt:\n1 # Verfügbare Versionen von \u0026#34;runc\u0026#34; ermitteln 2root@docker-2404:~# apt-cache policy runc 3runc: 4 Installed: 1.3.3-0ubuntu1~24.04.2 5 Candidate: 1.3.3-0ubuntu1~24.04.2 6 Version table: 7 *** 1.3.3-0ubuntu1~24.04.2 500 8 500 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages 9 500 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages 10 100 /var/lib/dpkg/status 11 1.1.12-0ubuntu3 500 12 500 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages 13 14 # Ältere Version einspielen 15root@docker-2404:~# apt-cache install runc=1.1.12-0ubuntu3 Danach klappt es wieder!\nACHTUNG: Die ältere Version enthält gravierende Sicherheitslücken! Keine gute Lösung!\nZurück zu 1.3.3:\n1root@docker-2404:~# apt update 2root@docker-2404:~# apt upgrade Vorabversion von LXD/LXC einspielen Bei Verwendung von LXD/LXC funktioniert Stand 2025-11-16 die Umstellung auf eine Vorabversion:\n1 # Verfügbare SNAPs sichten 2host:~$ snap info lxd 3... 4 6/stable: 6.5-ccdfb39 2025-10-09 (36020) 118MB - 5 6/candidate: 6.5-dc8291a 2025-11-11 (36535) 118MB - 6 6/beta: ↑ 7 6/edge: git-4d61f62 2025-11-14 (36613) 119MB - 8... 9 10 # Es gibt eine SEHR neue -\u0026gt; die probieren wir! 11host:~$ snap refresh lxd --channel=edge Danach den Docker-Container durchstarten und es klappt wieder!\nSpezialversion für INCUS Bei Ubuntu-24.04 ist INCUS in der Version 6.0.0 enthalten. Für die neueste, noch nicht veröffentlichte INCUS-Version gibt es einen Patch für das Problem. Dieser kann auch in 6.0.0 eingebaut werden mit geringen Anpassungen.\nHier der angepasste Patch: 999-runc-133.patch\nBaut man INCUS-6.0.0 mit diesem Patch und startet den Docker-Container durch, dann klappt es wieder!\nVersionen Getestet unter Ubuntu 22.04 mit LXD-6.5-ccdfb39 (Snap-Version stable) und git-4d61f62 (Snap-Version edge) Getestet unter Ubuntu-2404 mit INCUS-6.0.0 Links incusd/apparmor/lxc: Don't bother with sys/proc protections when nesting enabled Historie 2025-11-16: Erste Version ","link":"https://uli.heller.cool/blog/2025-11-16_lxc-docker-startprobleme/","section":"blog","tags":["incus","lxc","lxd","docker","linux","ubuntu"],"title":"LXC/LXD: Docker - Startprobleme im Ubuntu-Container"},{"body":"","link":"https://uli.heller.cool/tags/lxd/","section":"tags","tags":null,"title":"Lxd"},{"body":"","link":"https://uli.heller.cool/tags/debian/","section":"tags","tags":null,"title":"Debian"},{"body":" Ich habe mir ein Waveshare RP2350-One gekauft und spiele nun ein wenig damit herum! Hier erste Erkenntnisse!\nErstsichtung Für die Erstsichtung habe ich das Teil einfach an meinen Rechner angeschlossen - es blinkt lustig vor sich hin!\nFirmware aufspielen und konfigurieren Firmware herunterladen von Github - pico-fido2 pico_fido2_waveshare_rp2350_one-6.6.uf2 Virencheck via VirusTotal Waveshare RP2350-One abziehen Knopf \u0026quot;BOOTSEL\u0026quot; drücken und einstecken -\u0026gt; der USB-Stick erscheint als \u0026quot;Laufwerk\u0026quot; pico_fido2_waveshare_rp2350_one-6.6.uf2 auf's Laufwerk kopieren -\u0026gt; Laufwerk wird getrennt PicoCommissioner im Browser aufrufen Dabei auswählen: Select a known vendor: Yubikey 4/5 Rest: Unverändert Commission via WebUSB Pico auswählen -\u0026gt; klappt Sichtung fido2-ls.sh dev type vendor product serial comment /dev/hidraw7 generic 0x1050 0x0407 7971524AF195DE53 Pol Henarejos Pico Key lsusb 1... 2Bus 005 Device 028: ID 1050:0407 Yubico.com Yubikey 4/5 OTP+U2F+CCID 3Device Descriptor: 4 bLength 18 5 bDescriptorType 1 6 bcdUSB 2.00 7 bDeviceClass 0 [unknown] 8 bDeviceSubClass 0 [unknown] 9 bDeviceProtocol 0 10 bMaxPacketSize0 64 11 idVendor 0x1050 Yubico.com 12 idProduct 0x0407 Yubikey 4/5 OTP+U2F+CCID 13 bcdDevice 7.00 14 iManufacturer 1 Pol Henarejos 15 iProduct 2 Pico Key 16 iSerial 3 7971524AF195DE53 17 bNumConfigurations 1 18... Beobachtung Der USB-Stick nervt! Die LED blinkt dauernd (ein- bis zweimal pro Sekunde) uns ist sehr hell!\nLinks Berrybase - Waveshare RP2350-One Github - pico-fido2 PicoCommissioner PicoKeys Versionen Getestet mit Ubuntu 24.04.3 LTS Historie 2025-11-01: Erste Version ","link":"https://uli.heller.cool/blog/2025-11-01_experimente-mit-picofido2/","section":"blog","tags":["fido2","linux","ubuntu","debian"],"title":"Experimente mit PICO-FIDO2"},{"body":"","link":"https://uli.heller.cool/tags/fido2/","section":"tags","tags":null,"title":"Fido2"},{"body":"","link":"https://uli.heller.cool/categories/linux/","section":"categories","tags":null,"title":"Linux"},{"body":"","link":"https://uli.heller.cool/categories/ubuntu/","section":"categories","tags":null,"title":"Ubuntu"},{"body":" Diese Woche habe ich es nun schon zweimal erlebt, dass meine USB-Webcam in Teams plötzlich nicht mehr funktioniert. Aus- und Einstecken hilft, Neustart des Rechners auch. Beides ist aber sehr unkomfortabel, es muß anders gehen!\nIch bin über diesen Artikel gestolpert:\nWesley Aptekar-Cassels - How to reset the USB stack on Linux Das habe ich gleich in ein Skript namens \u0026quot;reset-usb.sh\u0026quot; verpackt:\n1for d in $(lspci -Dm | grep \u0026#34;USB controller\u0026#34; | cut -f1 -d\u0026#39; \u0026#39;); do 2 echo \u0026#34;$d\u0026#34;|sudo tee /sys/bus/pci/drivers/xhci_hcd/unbind \u0026gt;/dev/null 3 echo \u0026#34;$d\u0026#34;|sudo tee /sys/bus/pci/drivers/xhci_hcd/bind \u0026gt;/dev/null 4done Test:\nUSB-Webcam funktioniert nicht (\u0026quot;Schnee\u0026quot;) sudo reset-usb.sh Danach klappts's wieder! Getestet mit Ubuntu-24.04.3.\nLinks Wesley Aptekar-Cassels - How to reset the USB stack on Linux Historie 2025-09-12: Erste Version ","link":"https://uli.heller.cool/blog/2025-09-12_ubuntu-usb-reset/","section":"blog","tags":["linux","ubuntu"],"title":"Ubuntu: Zurücksetzen der USB-Geräte"},{"body":"","link":"https://uli.heller.cool/tags/git/","section":"tags","tags":null,"title":"Git"},{"body":"","link":"https://uli.heller.cool/categories/git/","section":"categories","tags":null,"title":"Git"},{"body":" Ich arbeite seit Jahren mit Git. Manche Dinge \u0026quot;erforsche\u0026quot; ich gefühlt zum zehnten mal. Um das künftig zu vermeiden sammle ich hier alle möglichen Kniffe, die mir über den Weg laufen.\nEltern-Branch ermitteln 1git log --pretty=format:\u0026#39;%D\u0026#39; HEAD^ | grep \u0026#39;origin/\u0026#39; | head -n1 | sed \u0026#39;s@origin/@@\u0026#39; | sed \u0026#39;s@,.*@@\u0026#39; 2git log --pretty=format:\u0026#39;%D\u0026#39; \u0026#34;${BRANCH_NAME}^\u0026#34; | grep \u0026#39;origin/\u0026#39; | head -n1 | sed -e \u0026#39;s@origin/@@\u0026#39; -e \u0026#39;s@,.*@@\u0026#39; Quelle: StackOverflow - How to get git parent branch name from current branch?\nErsten Commit eines Branches anzeigen 1git log master..branch --oneline | tail -1 2git log \u0026#34;${PARENT_BRANCH_NAME}..${BRANCH_NAME}\u0026#34; --oneline --reverse |head -1 Quelle: StackOverflow - Git - how to find first commit of specific branch\nHistorie 2025-09-09: Erste Version ","link":"https://uli.heller.cool/articles/git-cheatsheet/","section":"articles","tags":["git"],"title":"Git: Tipps und Tricks"},{"body":" Einer meiner Kunden verwendet eine betreute MongoDB-Instanz (\u0026quot;Atlas\u0026quot;). Leider klappen mit der MONGOSH die Zugriffe nicht. Ich erhalte Zeitüberschreitungen (Timeouts). Die Gründe sind unklar! Zur Analyse muß ich rausfinden, welche Netzwerkzugriffe versucht werden!\nProblembeschreibung Beim Versuch, eine Verbindung zur MongoDB-Instanz aufzubauen, erhalte ich eine Fehlermeldung:\n1$ mongosh \u0026#34;mongodb+srv://(zensiert).mongodb.net?authSource=%24external\u0026amp;authMechanism=MONGODB-X509\u0026#34; --apiVersion 1 --tls --tlsCertificateKeyFile my-certificate.pem 2MongoServerSelectionError: Server selection timed out after 30000 ms. It looks like this is a MongoDB Atlas cluster. Please ensure that your Network Access List allows connections from your IP. Vermutung: Irgendwas mit dem Routing stimmt nicht! Die Zugriffe auf die MongoDB-Instanz werden nicht über das Kunden-VPN geroutet! Sollte einfach zu korrigieren sein!\nAlso: Ermittlung der IP-Adressen\n1$ nslookup (zensiert).mongodb.net 2Server:\t127.0.0.53 3Address:\t127.0.0.53#53 4 5Non-authoritative answer: 6*** Can\u0026#39;t find (zensiert).mongodb.net: No answer So einfach geht es nicht! Entgegen der naheliegenden Vermutung versucht MONGOSH nicht direkt eine Verbindung zu \u0026quot;(zensiert).mongodb.net\u0026quot; aufzubauen. Irgendwas anderes scheitert!\nErmittlung der Netzwerkzugriffe Zur Lösung muß ich zunächst ermitteln, welche Netzwerkzugriffe die MONGOSH durchführt und welche nicht klappen. Der Artikel StackOverflow - How to monitor all network traffic from a specific process in linux? gibt Hinweise:\n1$ strace -f -e trace=network -s 1000 0mongosh \u0026#34;mongodb+srv://(zensiert).mongodb.net?authSource=%24external\u0026amp;authMechanism=MONGODB-X509\u0026#34; --apiVersion 1 --tls --tlsCertificateKeyFile my-certificate.pem 2strace: Process 4063243 attached 3strace: Process 4063244 attached 4... 5[pid 4063242] socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 18 6[pid 4063242] connect(18, {sa_family=AF_INET, sin_port=htons(27017), sin_addr=inet_addr(\u0026#34;120.130.141.142\u0026#34;)}, 16) = -1 EINPROGRESS (Vorgang ist jetzt in Bearbeitung) 7MongoServerSelectionError: Server selection timed out after 30000 ms. It looks like this is a MongoDB Atlas cluster. Please ensure that your Network Access List allows connections from your IP. 8... Man sieht, dass der Zugriff auf die IP-Adresse \u0026quot;120.130.141.142\u0026quot; nicht klappt!\nRouting-Korrektur und Schlusstest Routing-Korrektur:\n1$ sudo route add 120.130.141.142 gw 192.168.1.1 2# VPN-Gateway ----------------------^^^^^^^^^^^ Schlusstest:\n1$ mongosh \u0026#34;mongodb+srv://(zensiert).mongodb.net?authSource=%24external\u0026amp;authMechanism=MONGODB-X509\u0026#34; --apiVersion 1 --tls --tlsCertificateKeyFile my-certificate.pem 2Current Mongosh Log ID:\t68bbdb411a4591f0ccfa334f 3Connecting to:\tmongodb+srv://(zensiert).mongodb.net/... 4Using MongoDB:\t7.0.23 (API Version 1) 5Using Mongosh:\t2.5.7 6 7For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/ 8 9Warning: Found ~/.mongorc.js, but not ~/.mongoshrc.js. ~/.mongorc.js will not be loaded. 10 You may want to copy or rename ~/.mongorc.js to ~/.mongoshrc.js. 11Atlas (zensiert)-shard-0 [primary] test\u0026gt; Es klappt - perfekt!\nLinks MONGOSH ... Mongodb-Shell StackOverflow - How to monitor all network traffic from a specific process in linux? Versionen Getestet mit Ubuntu 24.04.3 LTS Historie 2025-09-06: Erste Version ","link":"https://uli.heller.cool/blog/2025-09-06_netzwerkzugriffe/","section":"blog","tags":["linux","ubuntu","debian"],"title":"Netzwerkzugriffe eines Programms ermitteln"},{"body":"","link":"https://uli.heller.cool/tags/virtmanager/","section":"tags","tags":null,"title":"Virtmanager"},{"body":" Mein altes TomTom-Navi benötigt wohl eine Aktualisierung. So lautet zumindest die Mail, die ich gestern von TomTom empfangen habe.\nOffenbar benötige ich dazu Windows oder MacOS.\nAktualisierung ohne PC Gemäß Online-Hilfe kann ich mein TomTom ohne PC aktualisieren. Einfach mit WLAN verbinden und dann aktualisieren lassen.\nLeider fehlt bei meinem TomTom die betreffende Option. Eventuell hab' ich's zu lange nicht aktualisiert.\nWindows 10 in Gnome-Boxes Erster Versuch scheitert, ich bekomme keine Netzwerkverbindung.\nVorbereitungen für VirtManager VirtManager legt per Standard seine Daten ab in \u0026quot;${HOME}/.local/libvirt\u0026quot;. Ich möchte einen anderen Plattenbereich dafür verwenden:\n1sudo mkdir /data/libvirt 2sudo chown uheller:uheller /data/libvirt 3mv \u0026#34;${HOME}/.local/share/libvirt/\u0026#34;* /data/libvirt/. 4rmdir \u0026#34;${HOME}/.local/share/libvirt\u0026#34; 5ln -s /data/libvirt \u0026#34;${HOME}/.local/share/libvirt\u0026#34; Windows 11 in VirtManager Auch dieser Versuch scheitert, weil die Virtualisierung die Voraussetzungen für Windows 11 nicht erfüllt.\nWindows 10 in VirtManager Diese Versuch verhält sich sehr ähnlich zum ersten. Die Installation klappt, aber die Netzwerkverbindung klappt nicht.\nUmstellung auf VirtIO oder Hypervisor-Standard (RTLxxxx) bringt keine Besserung.\nLetztlich habe ich es so an's Fliegen bekommen:\nGerätemanager in Windows 10 öffnen Netzwerkkarte suchen - sie ist markiert mit einem gelben Kreuz Netzwerkkarte deinstallieren Nach geänderter Hardware suchen - nun erscheint die Netzwerkkarte wieder ohne Kreuz Verbindung mit TomTom Die Verbindung zu meinem TomTom-Gerät \u0026quot;zickt\u0026quot; auch:\nGerät einstecken - Anzeige \u0026quot;Verbunden mit Ihrem Computer\u0026quot; USB weiterleiten zur VM Gerät taucht im Gerätemanager auf unter Netzwerkadapter TomTom mit einem gelben Kreuz Gerät deinstallieren Nach geänderter Hardware suchen - nun erscheint TomTom ohne gelbes Kreuz und funktioniert Versionen Ubuntu-24.04 Kernel 6.14.0-24-generic Gnome-Boxes 46.0-1build1 VirtManager 1:4.1.0-3ubuntu0.1 Links ArchLinux - [SOLVED] No Network Connectivity in Virt Manager with KVM/QEMU - Antwort #4 von cryptearth Windows VirtIO Drivers TomTom - Update über MyDrive Connect oder Wi-Fi Historie 2025-07-22: Erste Version ","link":"https://uli.heller.cool/blog/2025-07-22_windows-in-virt-manager/","section":"blog","tags":["virtmanager","ubuntu","linux"],"title":"Windows in VirtManager"},{"body":" Meine ersten Erfahrungen mit Gnome-Boxes sind recht gut: Sehr einfach zu bedienen und es funktioniert.\nManchmal möchte ich aber doch ein wenig mehr Dinge einstellen können. Das sollte mit VIRTMANAGER möglich sein. Mal sehen, wie's klappt!\nInstallation 1sudo apt update 2sudo apt upgrade 3sudo apt install -y virt-manager Verbindung zwischen VIRTMANAGER und Gnome-Boxes herstellen VIRTMANAGER starten: virt-manager Datei - Verbindung hinzufügen... Hypervisor: QEMU/KVM Benutzer-Session Automatische Verbindung: Ja Verbinden Danach erscheint die unter Gnome-Boxes angelegte VM in der Oberfläche von VIRTMANAGER:\nVM starten Die VM kann einfach über die Oberfläche von VIRTMANAGER gestartet werden. \u0026quot;Sehen\u0026quot; kann man die VM erstmal nicht, dazu muß man noch \u0026quot;Öffnen\u0026quot; anwählen.\nAuffällig: Die Fenstergröße wird nicht automatisch angepasst. Dies läßt sich einfach korrigieren mit\nAnzeigen Anzeige skalieren Größe automatisch mit Fenster anpassen: Ja Konfigurationsdetails Die Konfigurationsdetails können gesichtet und geändert werden mit\nAnzeigen Details Das sieht dann so aus:\nVersionen Ubuntu-24.04 Kernel 6.11.0-29-generic Gnome-Boxes 46.0-1build1 VirtManager 1:4.1.0-3ubuntu0.1 Links Getting Started with Gnome Boxes Historie 2025-07-16: Erste Version ","link":"https://uli.heller.cool/blog/2025-07-16_virt-manager/","section":"blog","tags":["virtmanager","gnome boxes","ubuntu","linux"],"title":"VirtManager und Zugriff auf Gnome-Boxes"},{"body":" Gnome-Boxes habe ich noch nie verwendet, ich war bislang ein Fan von VirtualBox. Leider hakt das immer mal wieder, also probiere ich mal was anderes!\nInstallation 1sudo apt update 2sudo apt upgrade 3sudo apt install -y gnome-boxes 4 5# Falls VirtualBox installiert ist: Deinstallieren! 6sudo apt purge virtualbox virtualbox-dkms virtualbox-qt 7sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager 8... 9dpkg -l gnome-boxes 10# -\u0026gt; 46.0-1build1 amd64 Nutzerrechte erweitern Diesen Teil mußte ich nur auf Rechnern machen, auf denen VirtualBox installiert war!\n1sudo usermod -aG kvm,libvirt $USER Danach Rechner neu starten. Ab- und Anmelden reicht meiner Erfahrung nach nicht!\nKontrolle:\n1groups 2# libvirt und kvm muß enthalten sein! Speicherort ändern Üblicherweise speichert Gnome-Boxes die VMs in Heimatverzeichnis unterhalb von /home/(nutzer). Das passt mir nicht, ich verwende gerne einen separaten Speicherbereich unter \u0026quot;/data\u0026quot;:\nVerzeichnis anlegen: sudo mkdir /data/gnome-boxes Eigener anpassen: sudo chown uheller:uheller /data/gnome-boxes Verschieben: mv -v \u0026quot;$HOME/.local/share/gnome-boxes/\u0026quot;* /data/gnome-boxes/. Einbinden: rmdir \u0026quot;$HOME/.local/share/gnome-boxes\u0026quot; ln -s /data/gnome-boxes \u0026quot;$HOME/.local/share/gnome-boxes\u0026quot; Start Kommando: gnome-boxes \u0026quot;+\u0026quot; - Neue virtuelle Maschine Von Datei installieren ISO auswählen: ubuntu-24.04.2-desktop-amd64.iso Firmware: UEFI Speicher: 4 -\u0026gt; 8GiB Datenspeicher-Begrenzung: 25 -\u0026gt; 50 GiB Anlegen Beobachtungen Meine ersten Eindrücke:\nLäuft recht gut! Gasterweiterungen werden nicht benötigt, Größenänderungen am Fenster \u0026quot;greifen\u0026quot; unmittelbar Keinerlei Anzeigeprobleme Keinerlei sonstige Probleme Sogar \u0026quot;Kopieren und Einfügen\u0026quot; funktioniert zwischen VM und Arbeitsplatz Probleme Neue virtuelle Maschine - Hoppla! No KVM! Das Problem wurde bei mir verursacht durch VirtualBox und fehlende Nutzerrechte. Habe die Installationsanleitung entsprechend angepasst.\nDetails stehen hier bobcares - How to Fix “No KVM Error” in GNOME Boxes\nVersionen Ubuntu-24.04 Kernel 6.11.0-29-generic Gnome-Boxes 46.0-1build1 Links bobcares - How to Fix “No KVM Error” in GNOME Boxes Gnome-boxes: communication between guest and host Historie 2025-07-18: Link \u0026quot;Gnome-boxes: communication between guest and host\u0026quot; hinzugefügt, Hinweis auf VirtualBox bei Nutzerrechten 2025-07-14: Erste Version ","link":"https://uli.heller.cool/blog/2025-07-14_gnome-boxes/","section":"blog","tags":["gnome boxes","ubuntu","linux"],"title":"Gnome-Boxes mit Ubuntu-24.04"},{"body":"","link":"https://uli.heller.cool/tags/verschl%C3%BCsselung/","section":"tags","tags":null,"title":"Verschlüsselung"},{"body":"","link":"https://uli.heller.cool/categories/verschl%C3%BCsselung/","section":"categories","tags":null,"title":"Verschlüsselung"},{"body":" Ich verwende \u0026quot;manchmal\u0026quot; gerne SSH-Schlüssel für die Verschlüsselung. Für Schüssel vom Typ RSA geht das mit OPENSSL, bei ED25519 mit AGE.\nAGE installieren 1sudo apt update 2sudo apt upgrade 3sudo apt install -y age SSH-Schlüssel anlegen 1ssh-keygen -t ed25519 -f $HOME/uheller-ed25519 -C \u0026#34;SSH-Schluessel fuer AGE-Verschluesselung Testdatei anlegen 1echo \u0026#34;Dies ist mein geheimer Inhalt\u0026#34; \u0026gt;$HOME/geheime-datei-unverschluesselt Testdatei verschlüsseln 1age -R $HOME/uheller-ed25519.pub $HOME/geheime-datei-unverschluesselt \u0026gt;$HOME/geheime-datei-verschluesselt Testdatei entschlüsseln 1age -d -i $HOME/uheller-ed25519 $HOME/geheime-datei-verschluesselt \u0026gt;$HOME/geheime-datei-entschluesselt Links Github - AGE Historie 2025-07-12: Erste Version ","link":"https://uli.heller.cool/blog/2025-07-12_verschluesselung-mit-age/","section":"blog","tags":["verschlüsselung","ubuntu","linux"],"title":"Verschlüsselung mit AGE"},{"body":" Manchmal möchte ich \u0026quot;spezielle\u0026quot; SSH-Einstellungen beim Ausführen von GIT-Kommandos verwenden, bspw. um zu testen ob ein neuer SSH-Schlüssel bei Github funktioniert.\nBislang ist dann immer \u0026quot;Google\u0026quot; mein Freund. Jetzt schreib ich mir's mal auf, eventuell finde ich es dann schneller!\nWann wird SSH bei GIT verwendet? SSH wird bei GIT primär verwendet, wenn Kommunikation mit einem zentralen Git-Repo erfolgt und eine entsprechende \u0026quot;Remote-URL\u0026quot; hinterlegt ist- Die \u0026quot;Remote-URL\u0026quot; kann man sich mit git remote -v anzeigen lassen:\n\u0026quot;git@github.com\u0026quot; -\u0026gt; das ist eine Remote-URL, die SSH verwendet \u0026quot;https://github.com\u0026quot; -\u0026gt; das ist eine Remote-URL, die kein SSH verwendet sondern HTTPS Kommunikation mit einem zentralen Git-Repo erfolgt beispielsweise bei diesen Git-Kommandos:\ngit clone ... git push ... git fetch ... git pull ... Welche SSH-Einstellungen werden verwendet? Per Standard liegen die Einstellungen in der Datei \u0026quot;$HOME/.ssh/config\u0026quot;. Details zu den Einstellunge sind den Anleitungen zu SSH zu entnehmen!\nWie überschreibe ich die SSH-Einstellung? Wenn ich bspw. die Verwendung eines bestimmten SSH-Schlüssels erzwingen will, so führe ich\nstatt: git fetch --all dies aus: GIT_SSH_COMMAND='ssh -v -i $HOME/.ssh/uheller-privkey -o IdentitiesOnly=yes -o IdentityAgent=none' git fetch --all Klappt wunderbar!\nLinks Github .ssh/config ssh Historie 2025-06-30: Erste Version ","link":"https://uli.heller.cool/blog/2025-06-30_git-ssh-einstellungen/","section":"blog","tags":["git"],"title":"Git: SSH-Einstellungen anpassen"},{"body":"","link":"https://uli.heller.cool/categories/fahrrad/","section":"categories","tags":null,"title":"Fahrrad"},{"body":"","link":"https://uli.heller.cool/tags/routenplanung/","section":"tags","tags":null,"title":"Routenplanung"},{"body":"","link":"https://uli.heller.cool/tags/wahoo/","section":"tags","tags":null,"title":"Wahoo"},{"body":" Meine geplanten Touren kann ich zwar problemlos in die Wahoo-App importieren, das Übertragen an meinen Wahoo-ACE klappt aber nicht.\nDetails - Mai 2025 Hier mehr Details zum Problem:\nRoute planen in https://bikerouter.de Route exportieren: br-300-00.gpx Route importieren in die Wahoo App: wahoo-app.png und routen-liste.png Wahoo Element Ace einschalten Nach ein paar Minuten erscheint: “Synchronisierung im Gange” -\u0026gt; abwarten Im ACE erscheint zeitweise das Telefon-Piktogramm, zeitweise auch WIFI, zeitweise beides In der Wahoo App: WIFI für ACE aktivieren In der Wahoo App: Route anwählen In der Wahoo App: \u0026quot;An ELEMNT senden\u0026quot; anwählen -\u0026gt; nichts passiert senden.png Auf dem Wahoo Element ACE erscheinen keinerlei Routen keine-routen.png Juni 2025 Im Juni 2025 hat sich die Situation verbessert. Die Übertragung klappt nun. Einzig die Routen-Vorschau fehlt:\nVergleich Kopfzeilen Rohdateien bikerouter.de:\n1\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; 2\u0026lt;!-- track-length = 66312 filtered ascend = 495 plain-ascend = 15 cost=75512 energy=0.4kwh time=3h 37m 37s --\u0026gt; 3\u0026lt;gpx 4 xmlns=\u0026#34;http://www.topografix.com/GPX/1/1\u0026#34; 5 xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34; 6 xsi:schemaLocation=\u0026#34;http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\u0026#34; 7 version=\u0026#34;1.1\u0026#34; 8 creator=\u0026#34;bikerouter.de 2025.45\u0026#34;\u0026gt; 9 \u0026lt;trk\u0026gt; 10 \u0026lt;name\u0026gt;Kornwestheim - 66,3 km, 495 hm\u0026lt;/name\u0026gt; 11 \u0026lt;link href=\u0026#34;https://bikerouter.de/#map=14/48.8617/9.1327/osm-mapnik-german_style,Waymarked_Trails-Cycling\u0026amp;amp;lonlats=9.182458,48.870317;9.131003,48.95027;9.140616,48.998154;9.150827,49.0088;9.11247,49.014376;9.021516,48.998516;9.006242,48.957488;9.055223,48.940076;9.053231,48.915696;9.072796,48.902039;9.070309,48.879643;9.087213,48.858915;9.097425,48.865072;9.167445,48.868179\u0026amp;amp;profile=trekking\u0026#34;\u0026gt; 12 \u0026lt;text\u0026gt;bikerouter.de\u0026lt;/text\u0026gt; 13 \u0026lt;/link\u0026gt; 14 \u0026lt;trkseg\u0026gt; 15 \u0026lt;trkpt lat=\u0026#34;48.870304\u0026#34; lon=\u0026#34;9.182487\u0026#34;\u0026gt;\u0026lt;ele\u0026gt;308.5\u0026lt;/ele\u0026gt;\u0026lt;/trkpt\u0026gt; garminconnect:\n1\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; 2\u0026lt;gpx creator=\u0026#34;Garmin Connect\u0026#34; version=\u0026#34;1.1\u0026#34; 3 xsi:schemaLocation=\u0026#34;http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/11.xsd\u0026#34; 4 xmlns:ns3=\u0026#34;http://www.garmin.com/xmlschemas/TrackPointExtension/v1\u0026#34; 5 xmlns=\u0026#34;http://www.topografix.com/GPX/1/1\u0026#34; 6 xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34; xmlns:ns2=\u0026#34;http://www.garmin.com/xmlschemas/GpxExtensions/v3\u0026#34;\u0026gt; 7 \u0026lt;metadata\u0026gt; 8 \u0026lt;name\u0026gt;Kornwestheim - 66,3 km, 495 hm\u0026lt;/name\u0026gt; 9 \u0026lt;link href=\u0026#34;connect.garmin.com\u0026#34;\u0026gt; 10 \u0026lt;text\u0026gt;Garmin Connect\u0026lt;/text\u0026gt; 11 \u0026lt;/link\u0026gt; 12 \u0026lt;time\u0026gt;2025-06-25T16:51:52.000Z\u0026lt;/time\u0026gt; 13 \u0026lt;/metadata\u0026gt; 14 \u0026lt;trk\u0026gt; 15 \u0026lt;name\u0026gt;Kornwestheim - 66,3 km, 495 hm\u0026lt;/name\u0026gt; 16 \u0026lt;trkseg\u0026gt; 17 \u0026lt;trkpt lat=\u0026#34;48.87030397541821\u0026#34; lon=\u0026#34;9.182486990466714\u0026#34;\u0026gt; 18 \u0026lt;ele\u0026gt;309.52\u0026lt;/ele\u0026gt; 19 \u0026lt;time\u0026gt;2025-06-25T16:51:52.000Z\u0026lt;/time\u0026gt; 20 \u0026lt;/trkpt\u0026gt; Formatiert bikerouter.de:\n1\u0026lt;gpx xmlns=\u0026#34;http://www.topografix.com/GPX/1/1\u0026#34; xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34; xsi:schemaLocation=\u0026#34;http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\u0026#34; version=\u0026#34;1.1\u0026#34; creator=\u0026#34;bikerouter.de 2025.45\u0026#34;\u0026gt; 2 \u0026lt;trk\u0026gt; 3 \u0026lt;name\u0026gt;Kornwestheim - 66,3 km, 495 hm\u0026lt;/name\u0026gt; 4 \u0026lt;link href=\u0026#34;https://bikerouter.de/#map=14/48.8617/9.1327/osm-mapnik-german_style,Waymarked_Trails-Cycling\u0026amp;lonlats=9.182458,48.870317;9.131003,48.95027;9.140616,48.998154;9.150827,49.0088;9.11247,49.014376;9.021516,48.998516;9.006242,48.957488;9.055223,48.940076;9.053231,48.915696;9.072796,48.902039;9.070309,48.879643;9.087213,48.858915;9.097425,48.865072;9.167445,48.868179\u0026amp;profile=trekking\u0026#34;\u0026gt; 5 \u0026lt;text\u0026gt;bikerouter.de\u0026lt;/text\u0026gt; 6 \u0026lt;/link\u0026gt; 7 \u0026lt;trkseg\u0026gt; 8 \u0026lt;trkpt lat=\u0026#34;48.870304\u0026#34; lon=\u0026#34;9.182487\u0026#34;\u0026gt; 9 \u0026lt;ele\u0026gt;308.5\u0026lt;/ele\u0026gt; 10 \u0026lt;/trkpt\u0026gt; garminconnect:\n1\u0026lt;gpx xmlns:ns3=\u0026#34;http://www.garmin.com/xmlschemas/TrackPointExtension/v1\u0026#34; xmlns=\u0026#34;http://www.topografix.com/GPX/1/1\u0026#34; xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34; xmlns:ns2=\u0026#34;http://www.garmin.com/xmlschemas/GpxExtensions/v3\u0026#34; creator=\u0026#34;Garmin Connect\u0026#34; version=\u0026#34;1.1\u0026#34; xsi:schemaLocation=\u0026#34;http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/11.xsd\u0026#34;\u0026gt; 2 \u0026lt;metadata\u0026gt; 3 \u0026lt;name\u0026gt;Kornwestheim - 66,3 km, 495 hm\u0026lt;/name\u0026gt; 4 \u0026lt;link href=\u0026#34;connect.garmin.com\u0026#34;\u0026gt; 5 \u0026lt;text\u0026gt;Garmin Connect\u0026lt;/text\u0026gt; 6 \u0026lt;/link\u0026gt; 7 \u0026lt;time\u0026gt;2025-06-25T16:51:52.000Z\u0026lt;/time\u0026gt; 8 \u0026lt;/metadata\u0026gt; 9 \u0026lt;trk\u0026gt; 10 \u0026lt;name\u0026gt;Kornwestheim - 66,3 km, 495 hm\u0026lt;/name\u0026gt; 11 \u0026lt;trkseg\u0026gt; 12 \u0026lt;trkpt lat=\u0026#34;48.87030397541821\u0026#34; lon=\u0026#34;9.182486990466714\u0026#34;\u0026gt; 13 \u0026lt;ele\u0026gt;309.52\u0026lt;/ele\u0026gt; 14 \u0026lt;time\u0026gt;2025-06-25T16:51:52.000Z\u0026lt;/time\u0026gt; 15 \u0026lt;/trkpt\u0026gt; Tests Original-Track von bikerouter.de: br-300-00.gpx Ohne \u0026quot;link\u0026quot; bei \u0026quot;trk\u0026quot;: br-300-01.gpx -\u0026gt; damit klappt's Hier die Unterschiede:\n1--- br-300-00.gpx\t2025-06-27 20:14:11.700102852 +0200 2+++ br-300-01.gpx\t2025-06-27 20:14:11.702102866 +0200 3@@ -8,9 +8,6 @@ 4 creator=\u0026#34;bikerouter.de 2025.45\u0026#34;\u0026gt; 5 \u0026lt;trk\u0026gt; 6 \u0026lt;name\u0026gt;Kornwestheim -\u0026amp;gt; Tamm - 302,8 km, 734 hm\u0026lt;/name\u0026gt; 7- \u0026lt;link href=\u0026#34;https://bikerouter.de/#map=15/48.9270/9.1624/osm-mapnik-german_style,Waymarked_Trails-Cycling\u0026amp;amp;lonlats=9.185763,48.868796;8.592838,49.124742;8.376726,49.228749;8.436111,49.266606;8.412426,49.548609;8.470781,49.523667;8.557645,49.473829;8.62853,49.443941;8.670165,49.411899;8.692649,49.413629;8.79565,49.397699;8.822168,49.394153;8.850959,49.394739;8.920023,49.439144;8.990307,49.455542;9.040953,49.415716;9.069702,49.391991;9.087568,49.365543;9.107906,49.32368;9.152022,49.298424;9.133056,49.286282;9.156656,49.24704;9.195016,49.227211;9.207983,49.182768;9.200947,49.142582;9.152718,49.100418;9.155809,49.074476;9.149631,49.034321;9.153407,49.014689;9.140277,48.998144;9.138732,48.967347;9.138646,48.948533;9.148131,48.927264\u0026amp;amp;profile=trekking\u0026#34;\u0026gt; 8- \u0026lt;text\u0026gt;bikerouter.de\u0026lt;/text\u0026gt; 9- \u0026lt;/link\u0026gt; 10 \u0026lt;trkseg\u0026gt; 11 \u0026lt;trkpt lat=\u0026#34;48.868833\u0026#34; lon=\u0026#34;9.185966\u0026#34;\u0026gt;\u0026lt;ele\u0026gt;304.25\u0026lt;/ele\u0026gt;\u0026lt;/trkpt\u0026gt; 12 \u0026lt;trkpt lat=\u0026#34;48.868896\u0026#34; lon=\u0026#34;9.185947\u0026#34;\u0026gt;\u0026lt;ele\u0026gt;304.5\u0026lt;/ele\u0026gt;\u0026lt;/trkpt\u0026gt; Links Wahoo Element ACE Versionen Getestet mit TBD\nHistorie 2026-03-19: Tippfehler in Überschrift korrigiert 2025-06-27: Erste Version ","link":"https://uli.heller.cool/blog/2025-06-27_bikerouter-wahoo/","section":"blog","tags":["routenplanung","wahoo"],"title":"Wahoo Element Ace: Übertragen von Routen klappt nicht"},{"body":"","link":"https://uli.heller.cool/tags/ansible/","section":"tags","tags":null,"title":"Ansible"},{"body":" Einen Teil meiner Infrastruktur habe ich mit ANSIBLE aufgesetzt. Leider vor sehr langer Zeit mit einer mittlerweile veralteten Version von ANSIBLE (2.9). Diese kann mit aktuellen Ubuntu-Versionen nicht mehr verwendet werden.\nHier beschreibe ich, wie ich es in einem Container nutze\nContainer aufsetzen und aktualisieren Herunterladen LXC-Image herunterladen von Github: Ubuntu-Images für LXC.\nDanach Virencheck!\nAufsetzen 1lxc image import --alias jammy jammy-v1.12.1-amd64-lxcimage.tar.xz 2lxc launch jammy ubuntu-2204 Aktualisieren 1lxc exec ubuntu-2204 bash 2 3# Innerhalb der \u0026#34;neuen\u0026#34; bash 4apt update 5apt upgrade 6poweroff Kopieren 1lxc copy ubuntu-2204 ansible 2lxc start ansible Ansible einrichten Container vorbereiten Alle hierin beschrieben Kommandos \u0026quot;laufen\u0026quot; im Ansible-Container, also nach Eingabe von lxc exec ansible bash.\n1apt install -y python2 2apt install -y pipx 3apt install -y rsync 4apt install -y git # benötige ich zum Zugriff auf meine Playbooks Wechseln zum Benutzer \u0026quot;ubuntu\u0026quot; im Ansible-Container 1ssh -A ubuntu@ansible.lxd Herunterladen \u0026quot;ansible-tar.gz\u0026quot; herunterladen mit diesem Link. Danach Virencheck!\nKommando zum Herunterladen: wget https://codeload.github.com/ansible/ansible/tar.gz/v2.9.27 -O ansible-2.9.27.tar.gz\nEinrichten 1pipx install --include-deps $(pwd)/ansible-2.9.27.tar.gz 2pipx inject ansible dnspython 3pipx inject ansible netaddr Playbooks einspielen Wechseln zum Benutzer \u0026quot;ubuntu\u0026quot; im Ansible-Container 1ssh -A ubuntu@ansible.lxd Git-Repo clonen 1mkdir git 2cd git 3git clone (repo-url) 4cd (repo-basename) SSH-Zugriff testen Mein Testrechner hat den Namen \u0026quot;goliath\u0026quot;, also:\n1ssh goliath 2# muß klappen! Ansible-Playbook testen 1ansible-playbook site.yml --check --diff -l goliath 2# sollte nun keinen Fehler anzeigen Links Github: Ubuntu-Images für LXC Github: ansible-2.9.27.tar.gz Versionen Getestet mit\nUbuntu-22.04 und LXC-Image von Ubuntu-20.04 (focal) Historie 2025-06-26: Erste Version ","link":"https://uli.heller.cool/blog/2025-06-26_ansible-im-container/","section":"blog","tags":["ansible","linux","ubuntu"],"title":"ANSIBLE: Alte Version in einem Container verwenden"},{"body":"","link":"https://uli.heller.cool/categories/devops/","section":"categories","tags":null,"title":"Devops"},{"body":"","link":"https://uli.heller.cool/tags/akku/","section":"tags","tags":null,"title":"Akku"},{"body":"","link":"https://uli.heller.cool/tags/fahrrad/","section":"tags","tags":null,"title":"Fahrrad"},{"body":" Ketten und Kassetten ","link":"https://uli.heller.cool/articles/fahrrad/","section":"articles","tags":["fahrrad","akku"],"title":"Fahrrad - Diverse Aufzeichnungen"},{"body":"","link":"https://uli.heller.cool/tags/tesla/","section":"tags","tags":null,"title":"Tesla"},{"body":"","link":"https://uli.heller.cool/categories/tesla/","section":"categories","tags":null,"title":"Tesla"},{"body":" Irgendwie ist es immer ein Drama, die Rechnungsdaten von Ladevorgängen an Tesla-Superchargern zu sammeln und an die Buchhaltung zu übermitteln. Hier der Ablauf!\nSammel-ZIP Handy-App öffnen Ladedaten -\u0026gt; nein! Menü oben rechts Aufladen Historie \u0026quot;Download\u0026quot; - oben rechts Datum: 2025 Dateityp: PDF In E-Mail exportieren Email abrufen Enthaltenen Link aufrufen -\u0026gt; ZIP herunterladen JAN_2025-JAN_2026.zip In der ZIP-Datei sind Stand 2025-06-04 alle Rechnungen von 2025 in umgekehrt chronologischer Reihenfolge.\nHistorie 2025-06-04: Erste Version ","link":"https://uli.heller.cool/articles/tesla/","section":"articles","tags":["tesla","akku"],"title":"Tesla - Rechnungsdaten"},{"body":"","link":"https://uli.heller.cool/tags/crypto/","section":"tags","tags":null,"title":"Crypto"},{"body":" Hier zeige ich, wie ich ein Ubuntu-Paket für GOCRYPTFS aus den Github-Quellen baue.\nBestehendes Ubuntu-Paket bauen Container mit Ubuntu-24.04:\n1sudo apt update 2sudo apt upgrade 3mkdir -p build/gocryptfs 4cd build/gocryptfs 5apt source gocryptfs 6# -\u0026gt; installiert gocryptfs_2.4.0-1ubuntu0.24.04.2 7sudo apt -y build-dep gocryptfs 8cd gocryptfs-2.4.0 9dpkg-buildpackage Neue Quelltexte herunterladen gocryptfs-2.5.4.15.tar.gz Virencheck! Ablegen im Container mit Ubuntu-24.04 unter \u0026quot;build/gocryptfs/gocryptfs-2.5.4.15.tar.gz\u0026quot; Neues Ubuntu-Paket bauen Container mit Ubuntu-24.04:\n1cd build/gocryptfs 2cd gocryptfs-2.4.0 3uupdate -u ../gocryptfs-2.5.4.15.tar.gz 4cd ../gocryptfs-2.5.4.15 5dpkg-buildpackage 6# ... 0001-tests-add-TestNotIdle.patch klappt nicht 7# -\u0026gt; Patch entfernen! 8# ... 003-revert-jacobsa-fork.patch klappt nicht 9# -\u0026gt; Patch anpassen 10# ... dann klappt es \u0026#34;im Prinzip\u0026#34; Leider scheitert das Bauen dann mit:\n1$ dpkg-buildpackage 2dpkg-buildpackage: info: source package gocryptfsrn about the format. Here 3dpkg-buildpackage: info: source version 2.5.4.15-0ubuntu1 to 4... 5\t/usr/lib/go-1.22/src/github.com/mdp/qrterminal/v3 (from $GOROOT) 6\t/home/ubuntu/build/gocryptfs/gocryptfs-2.5.4.15/_build/src/github.com/mdp/qrterminal/v3 (from $GOPATH) 7dh_auto_build: error: cd _build \u0026amp;\u0026amp; go install -trimpath -v -p 8 -ldflags \u0026#34;-X main.GitVersion=2.5.4.15 -X main.GitVersionFuse=2.4.2 -X main.BuildDate=2025-06-05\u0026#34; github.com/rfjakob/gocryptfs github.com/rfjakob/gocryptfs/contrib/atomicrename github.com/rfjakob/gocryptfs/contrib/findholes github.com/rfjakob/gocryptfs/contrib/findholes/holes github.com/rfjakob/gocryptfs/contrib/getdents-debug/getdents github.com/rfjakob/gocryptfs/contrib/getdents-debug/readdirnames github.com/rfjakob/gocryptfs/contrib/statfs github.com/rfjakob/gocryptfs/contrib/statvsfstat github.com/rfjakob/gocryptfs/ctlsock github.com/rfjakob/gocryptfs/gocryptfs-xray github.com/rfjakob/gocryptfs/internal/configfile github.com/rfjakob/gocryptfs/internal/contentenc github.com/rfjakob/gocryptfs/internal/cryptocore github.com/rfjakob/gocryptfs/internal/ctlsocksrv github.com/rfjakob/gocryptfs/internal/ensurefds012 github.com/rfjakob/gocryptfs/internal/exitcodes github.com/rfjakob/gocryptfs/internal/fido2 github.com/rfjakob/gocryptfs/internal/fusefrontend github.com/rfjakob/gocryptfs/internal/fusefrontend_reverse github.com/rfjakob/gocryptfs/internal/inomap github.com/rfjakob/gocryptfs/internal/nametransform github.com/rfjakob/gocryptfs/internal/openfiletable github.com/rfjakob/gocryptfs/internal/pathiv github.com/rfjakob/gocryptfs/internal/readpassword github.com/rfjakob/gocryptfs/internal/siv_aead github.com/rfjakob/gocryptfs/internal/speed github.com/rfjakob/gocryptfs/internal/stupidgcm github.com/rfjakob/gocryptfs/internal/syscallcompat github.com/rfjakob/gocryptfs/internal/tlog returned exit code 1 8make[1]: *** [debian/rules:16: override_dh_auto_build] Error 255 9make[1]: Leaving directory \u0026#39;/home/ubuntu/build/gocryptfs/gocryptfs-2.5.4.15\u0026#39; 10make: *** [debian/rules:13: binary] Error 2 11dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2 Umstellung auf Standard-Build von GOCRYPTFS debian/rules anpassen:\n1--- gocryptfs-2.4.0/debian/rules\t2023-08-12 00:06:13.000000000 +0200 2+++ gocryptfs-2.5.4.15/debian/rules\t2025-06-05 15:46:28.777345426 +0200 3@@ -10,13 +10,16 @@ 4 DEB_LDFLAGS=\u0026#34;-X main.GitVersion=$(DEB_VERSION_UPSTREAM) -X main.GitVersionFuse=$(GOFUSE_VERSION_UPSTREAM) -X main.BuildDate=$(CHANGELOG_TIMESTAMP)\u0026#34; 5 6 %: 7+\tPATH=\u0026#34;$(CURDIR)/debian:$$PATH\u0026#34; \\ 8 dh $@ --buildsystem=golang --with=golang --builddirectory=_build 9 10 override_dh_auto_build: 11-\tdh_auto_build -- -ldflags $(DEB_LDFLAGS) 12-\tcp -r internal/* _build/src/github.com/rfjakob/gocryptfs/internal/ 13-\tcp -r tests/* _build/src/github.com/rfjakob/gocryptfs/tests 14-\tcp _build/bin/gocryptfs _build/src/github.com/rfjakob/gocryptfs/ 15+\thead -1 debian/changelog|cut -f 2 -d \u0026#39;(\u0026#39;|cut -f 1 -d \u0026#39;)\u0026#39; \u0026gt;VERSION 16+\t./build-without-openssl.bash 17+\t#dh_auto_build -- -ldflags $(DEB_LDFLAGS) 18+\t#cp -r internal/* _build/src/github.com/rfjakob/gocryptfs/internal/ 19+\t#cp -r tests/* _build/src/github.com/rfjakob/gocryptfs/tests 20+\t#cp _build/bin/gocryptfs _build/src/github.com/rfjakob/gocryptfs/ 21 pandoc Documentation/MANPAGE.md -s -t man -o debian/gocryptfs.1 22 pandoc Documentation/MANPAGE-XRAY.md -s -t man -o debian/gocryptfs-xray.1 23 pandoc Documentation/MANPAGE-STATFS.md -s -t man -o debian/statfs.1 24@@ -26,14 +29,25 @@ 25 PATH=\u0026#34;$(CURDIR)/_build/bin:$$PATH\u0026#34; \\ 26 DH_GOLANG_EXCLUDES=\u0026#34;gocryptfs-xray tests/cli tests/defaults tests/deterministic_names tests/example_filesystems tests/fsck tests/hkdf_sanity \\ 27 tests/matrix tests/plaintextnames tests/reverse tests/root_test tests/sharedstorage tests/xattr\u0026#34; \\ 28- dh_auto_test 29+ true 30+# dh_auto_test 31 32 override_dh_auto_clean: 33 rm -f debian/gocryptfs.1 34 rm -f debian/gocryptfs-xray.1 35 rm -f debian/statfs.1 36+\trm -f contrib/atomicrename/atomicrename 37+\trm -f contrib/findholes/findholes 38+\trm -f contrib/statfs/statfs 39+\trm -f gocryptfs-xray/gocryptfs-xray 40+\trm -f gocryptfs 41+\trm -f VERSION 42 dh_auto_clean 43 44 override_dh_auto_install: 45 dh_auto_install --destdir=debian/tmp 46+\tmkdir -p debian/tmp/usr/bin 47+\tcp gocryptfs debian/tmp/usr/bin 48+\tcp gocryptfs-xray/gocryptfs-xray debian/tmp/usr/bin 49+\tcp contrib/statfs/statfs debian/tmp/usr/bin 50 rm -rf debian/tmp/usr/share/gocode debian/dh_golang anlegen:\n1#!/bin/sh 2exec true debian/patches/004-uli-build.patch anlegen:\n1... 2--- gocryptfs-2.5.4.15.orig/build-without-openssl.bash 3+++ gocryptfs-2.5.4.15/build-without-openssl.bash 4@@ -5,6 +5,8 @@ cd \u0026#34;$(dirname \u0026#34;$0\u0026#34;)\u0026#34; 5 CGO_ENABLED=0 source ./build.bash -tags without_openssl 6 7 if ldd gocryptfs 2\u0026gt; /dev/null ; then 8+\techo \u0026#34;build-without-openssl.bash: error: compiled binary is static\u0026#34; 9+else 10 echo \u0026#34;build-without-openssl.bash: error: compiled binary is not static\u0026#34; 11 exit 1 12 fi debian/patches/series anpassen:\n1#0001-tests-add-TestNotIdle.patch 2001-disable-emulated-getdents.patch 3002-disable-getdents-test.patch 4#003-revert-jacobsa-fork.patch 5004-uli-build.patch debian/changelog anpassen:\n1--- gocryptfs-2.4.0/debian/changelog\t2024-11-01 10:42:11.000000000 +0100 2+++ gocryptfs-2.5.4.15/debian/changelog\t2025-06-05 15:38:11.897705339 +0200 3@@ -1,3 +1,9 @@ 4+gocryptfs (2.5.4.15-1ubuntu0.24.04.2~uh~noble) noble-security; urgency=medium 5+ 6+ * New upstream release. 7+ 8+ -- Uli Heller \u0026lt;uli.heller@daemons-point.com\u0026gt; Thu, 05 Jun 2025 15:13:07 +0200 9+ 10 gocryptfs (2.4.0-1ubuntu0.24.04.2) noble-security; urgency=medium 11 12 * No change rebuild due to golang-1.22 update Bauen Container mit Ubuntu-24.04:\n1PATH=\u0026#34;${HOME}/bin:${PATH}\u0026#34; 2export PATH 3cd build/gocryptfs 4cd gocryptfs-2.5.4.15 5dpkg-buildpackage 6# -\u0026gt; erzeugt u.a. ../gocryptfs_2.5.4.15-1ubuntu0.24.04.2~uh~noble_amd64.deb Links Homepage: gocryptfs GITHUB: gocryptfs Versionen Getestet mit\nUbuntu-24.04 und Github:gocryptfs \u0026quot;master\u0026quot; vom 2025-05-31 Historie 2025-05-31: Erste Version ","link":"https://uli.heller.cool/blog/2025-05-31_gocryptfs-ubuntu-paket-bauen/","section":"blog","tags":["crypto","linux","ubuntu"],"title":"GOCRYPTFS: Ubuntu-Paket bauen aus den Github-Quellen"},{"body":"","link":"https://uli.heller.cool/categories/browser/","section":"categories","tags":null,"title":"Browser"},{"body":" Manchmal möchte ich einen alternativen Browser nutzen um das Erscheinungsbild von Webseiten zu überprüfen. Unter Ubuntu bietet sich hierzu der Browser \u0026quot;Epiphany\u0026quot; an.\nGrundinstallation 1sudo apt update 2sudo apt upgrade 3sudo apt install epiphany-browser Kurztest 1epiphany-browser https://heise.de Sichten der Webseite klappt wunderbar!\nVideos 1epiphany-browser https://ard.de Sobald man ein Video anwählt erscheint eine Anzeige wie diese:\nAuf der Konsole sieht man diverse Fehlermeldung. Diese erscheinen auch nach der Korrekturmaßnahme noch, sind also wohl irrelevant!\nKorrektur mittels Anleitung GStreamer - Installing on Linux:\n1sudo apt install gstreamer1.0-plugins-bad Danach klappt es!\nLinks GStreamer - Installing on Linux Versionen Getestet mit Ubuntu 24.04.2 LTS Historie 2025-05-29: Erste Version ","link":"https://uli.heller.cool/blog/2025-05-29_epiphany-und-ubuntu-2404/","section":"blog","tags":["linux","ubuntu","debian"],"title":"Ubuntu: Alternativer Browser Epiphany"},{"body":"","link":"https://uli.heller.cool/categories/pdf/","section":"categories","tags":null,"title":"Pdf"},{"body":" Für das Ausfüllen von PDF-Dokumenten verwende ich gerne XournalPP und davon die AppImage-Variante. Bislang hat das immer problemlos geklappt. Nach der Umstellung auf Ubuntu-24.04 (noble) startet die Anwendung nicht mehr.\nFehlermeldung beim Start Ich starte XournalPP mit diesem Kommando:\n~/Software/xournalpp-1.2.7-x86_64.AppImage Leider klappt der Start nicht und wirft stattdessen die nachfolgende Fehlermeldung:\n1$ ~/Software/xournalpp-1.2.7-x86_64.AppImage 2/tmp/.mount_xournagPlJCb/AppRun.wrapped: error while loading shared libraries: libjack.so.0: cannot open shared object file: No such file or directory Quercheck mit Version 1.2.0 liefert denselben Fehler!\nAbhilfe Das Problem wird korrigiert mit diesen Kommandos:\n1sudo apt update 2sudo apt upgrade 3sudo apt install libjack0 Links Github - XournalPP Github - AppImage relies on external libjack.so.0: cannot open shared obj. file Versionen Getestet mit Ubuntu 24.04.2 LTS Historie 2025-05-25: Erste Version ","link":"https://uli.heller.cool/blog/2025-05-25_xournalpp-und-ubuntu-2404/","section":"blog","tags":["linux","ubuntu","debian"],"title":"Ubuntu: XournalPP - Probleme beim Start"},{"body":"","link":"https://uli.heller.cool/categories/incus/","section":"categories","tags":null,"title":"INCUS"},{"body":" Ich bin intensiver Nutzer von LXC/LXD. Leider gab es vor einiger Zeit ja eine Auftrennung und das ursprüngliche Kern-Entwickerteam arbeitet nun an INCUS. Hier beschreibe ich, wie ich einen Container umziehe von LXC/LXD nach INCUS.\nAusganglage Ich habe einen Plattenbereich \u0026quot;ubuntu--vg-lxdlv\u0026quot;, auf dem diverse LXC/LXD-Container rumliegen. Die LXC/LXD-Container habe ich bislang mit Ubuntu-20.04 betrieben.\nZwischenzeitlich habe ich meinen Rechner aktualisiert auf Ubuntu-24.04 und INCUS. Ich möchte nun die Container übernehmen in INCUS.\nPlattenbereich einbinden 1sudo mount /dev/mapper/ubuntu--vg-lxdlv /mnt Image importieren 1$ sudo du -hs /mnt/containers/noble-32 2513M\t/mnt/containers/noble-32 3 4$ time sudo incus image import /mnt/containers/noble-32 --alias noble-32-image 5Image imported with fingerprint: 1e03aa9015a0ac1ffa7f09b94aa0a11d7fbbeaeae73af170e3a8ade540f2fd8e 6 7real\t2m44,910s 8user\t2m38,183s 9sys\t0m1,514s 10 11$ incus image ls 12+----------------+--------------+--------+------------------------------------+--------------+-----------+-----------+-----------------------+ 13| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE | UPLOAD DATE | 14+----------------+--------------+--------+------------------------------------+--------------+-----------+-----------+-----------------------+ 15| noble-32-image | 77b38a70a668 | no | Ubuntu noble i386 - Created by uli | i686 | CONTAINER | 109.36MiB | 2025/05/23 19:28 CEST | 16+----------------+--------------+--------+------------------------------------+--------------+-----------+-----------+-----------------------+ Container starten 1$ incus launch noble-32-image noble-32 Container testen 1$ ssh root@noble-32.incus 2Welcome to Ubuntu 24.04.1 LTS (GNU/Linux 6.11.0-26-generic i686) 3... Image löschen Der Container bleibt erhalten!\n1$ incus image delete noble-32-image 2 3$ incus image ls 4+-------+-------------+--------+-------------+--------------+------+------+-------------+ 5| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE | UPLOAD DATE | 6+-------+-------------+--------+-------------+--------------+------+------+-------------+ 7 8$ incus ls noble-32 9+----------+---------+----------------------+------+-----------+-----------+ 10| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | 11+----------+---------+----------------------+------+-----------+-----------+ 12| noble-32 | RUNNING | 10.38.231.114 (eth0) | | CONTAINER | 0 | 13+----------+---------+----------------------+------+-----------+-----------+ Links INCUS: Grundeinrichtung mit Netzwerk Versionen Getestet mit Ubuntu 24.04.2 LTS und INCUS-6.0.0-1ubuntu0.2 LXC/LXD-Container erzeugt mit Ubuntu-20.04 Historie 2025-05-23: Erste Version ","link":"https://uli.heller.cool/blog/2025-05-23_von-lxclxd-zu-incus/","section":"blog","tags":["incus","lxc","lxd","linux","ubuntu","debian"],"title":"Von LXC/LXD zu INCUS"},{"body":" Ich bin zufällig über dieses Video (Stop Releasing Shell Scripts. Do This Instead) gestolpert. Darin wird das Werkzeug BUNSTER vorgestellt. Das wandelt Shell-Skripte in ausführbare Binärdateien. Hier meine Erfahrungen.\nHerunterladen und installieren Grobablauf:\nPassende Version von Github - Bunster - Releases herunterladen (ich verwende bunster_linux_amd64.tar.gz) Virencheck Auspacken Also:\n1VERSION=\u0026#34;v0.13.0\u0026#34; 2INSTALL_DIR=\u0026#34;${HOME}/mySoftware/bunster-${VERSION}\u0026#34; 3curl -L https://github.com/yassinebenaid/bunster/releases/download/${VERSION}/bunster_linux-amd64.tar.gz \u0026gt;\u0026#34;bunster-${VERSION}_linux-amd64.tar.gz\u0026#34; 4# virus check 5mkdir \u0026#34;${INSTALL_DIR}\u0026#34; 6gzip -cd \u0026#34;bunster-${VERSION}_linux-amd64.tar.gz\u0026#34;|( cd \u0026#34;${INSTALL_DIR}\u0026#34; \u0026amp;\u0026amp; tar -xf - ) 7\u0026#34;${INSTALL_DIR}/bunster\u0026#34; --version 8# shows \u0026#34;bunster version v0.12.1\u0026#34; Kurztest Skript (Quelle: Github GIST, ablegen unter /tmp/login.sh):\n1#!/bin/bash 2 3EMAIL=\u0026#39;YOUR_EMAIL\u0026#39; # edit this 4PASS=\u0026#39;YOUR_PASSWORD\u0026#39; # edit this 5 6COOKIES=\u0026#39;cookies.txt\u0026#39; 7USER_AGENT=\u0026#39;Firefox/3.5\u0026#39; 8 9curl -X POST \u0026#39;https://github.com/login\u0026#39; --verbose --user-agent $USER_AGENT --data-urlencode \u0026#34;name=${EMAIL}\u0026#34; --data-urlencode \u0026#34;pass=${PASS}\u0026#34; --cookie $COOKIES --cookie-jar $COOKIES 10curl -X GET \u0026#39;https://github.com/dashboard/pulls\u0026#39; --verbose --user-agent $USER_AGENT --cookie $COOKIES --cookie-jar $COOKIES Wandeln:\n1\u0026#34;${INSTALL_DIR}/bunster\u0026#34; build /tmp/login.sh -o /tmp/login Sichten - ls -ln /tmp/login* liefert:\n1-rwxrwxr-x 1 1000 1000 3233729 Mai 18 08:01 /tmp/login 2-rw-rw-r-- 1 1000 1000 430 Mai 18 08:00 /tmp/login.sh Test - tmp/login liefert:\n1Note: Unnecessary use of -X or --request, POST is already inferred. 2 % Total % Received % Xferd Average Speed Time Time Time Current 3 Dload Upload Total Spent Left Speed 4... Scheint zu klappen!\nGeheimnisse Im Video Youtube - Stop Releasing Shell Scripts. Do This Instead wird die Wandlung vorgeschlagen, um Geheimnisse zu verstecken. Ein kurzer Test zeigt, dass das nicht gut klappt (klar!):\n1$ strings /tmp/login|grep YOUR_EMAIL 2YOUR_EMAILUSER_AGENT/dev/stdinreaddirentpidfd_openpidfd_waitembed: %v 3$ strings /tmp/login|grep YOUR_PASSWORD 4...anynotnl -\u0026gt; YOUR_PASSWORDstop signal:... Die Geheimnisse stecken also auch im Binärprogramm, sie sind nur schwieriger zu finden! Ich denke, ich würde sie im Fall der Fälle finden auch ohne sie zu kennen.\nLinks Github - Bunster Youtube - Stop Releasing Shell Scripts. Do This Instead Versionen Getestet mit Ubuntu 24.04.2 LTS Historie 2025-05-18: Erste Version ","link":"https://uli.heller.cool/blog/2025-05-18_shell-skript-wandeln/","section":"blog","tags":["linux","ubuntu","debian"],"title":"Shell-Skripte wandeln in Binärdatei mit BUNSTER"},{"body":" Bei Verwendung von LXC/LXD/INCUS werden bei mir innerhalb der betreffenden Container andere IDs für die typischen Unix-Nutzer verwendet als außerhalb, also bspw. habe ich einen INCUS-Container \u0026quot;u-2404\u0026quot; und dessen Nutzer \u0026quot;root\u0026quot; mit einer UID von 0 innerhalb vom Container nutzt \u0026quot;real\u0026quot; die UID 165536.\nIm Dateisystem auf dem Arbeitsplatzrechner tauchen dann die \u0026quot;realen\u0026quot; UIDs auf. Manchmal möchte man das Dateisystem aber mit den \u0026quot;richtigen\u0026quot; UIDs \u0026quot;sehen\u0026quot; - also so, wie innerhalb des Containers. Das kann man mit \u0026quot;Bind Mounts\u0026quot; erreichen und hier beschreibe ich, wie das geht.\nSichtung des Container-Dateisystems Das zugehörige Container-Dateisystem sieht so aus:\n1$ sudo ls -la /var/lib/incus/storage-pools/default/containers/u-2404/rootfs/ 2insgesamt 16 3drwxr-xr-x 1 165536 165536 236 Apr 22 09:56 . 4d--x------ 1 165536 root 78 Apr 24 18:58 .. 5lrwxrwxrwx 1 165536 165536 7 Apr 22 2024 bin -\u0026gt; usr/bin 6drwxr-xr-x 1 165536 165536 0 Feb 26 2024 bin.usr-is-merged 7drwxr-xr-x 1 165536 165536 0 Apr 22 2024 boot 8... Man sieht: Statt \u0026quot;root\u0026quot; taucht die \u0026quot;merkwürdige\u0026quot; UID auf.\nEinbinden mit \u0026quot;X-mount.idmap\u0026quot; Wenn man einen Arbeitsplatzrechner hat, der eine hinreichend neue Version von util-linux verwendet, dann kann man \u0026quot;X-mount.idmap\u0026quot; verwenden.\nKO: util-linux 2.37.2-4ubuntu3.4 (= Ubuntu-22.04) OK: util-linux 2.39.3-9ubuntu6.2 (= Ubuntu-24.04) Man benötigt wohl mindestens die Version 2.39 Überprüfen mit dpkg -l util-linux Wenn die Voraussetzungen erfüllt sind, dann klappt es so:\n1$ INCUS_FS=/var/lib/incus/storage-pools/default/containers/u-2404/rootfs/ 2$ INCUS_UID=165536 3$ INCUS_UID_CNT=65535 4$ MOUNT_PT=/tmp/mount-test 5$ mkdir \u0026#34;${MOUNT_PT}\u0026#34; # Einhängepunkt anlegen 6$ sudo mount -o \u0026#34;bind,X-mount.idmap=b:${INCUS_UID}:0:${INCUS_UID_CNT}\u0026#34; \u0026#34;${INCUS_FS}\u0026#34; \u0026#34;${MOUNT_PT}\u0026#34; 7 8$ ls -al \u0026#34;${MOUNT_PT}\u0026#34; 9insgesamt 20 10drwxr-xr-x 1 root root 236 Apr 22 09:56 . 11drwxrwxrwt 32 root root 4096 Mai 17 07:46 .. 12lrwxrwxrwx 1 root root 7 Apr 22 2024 bin -\u0026gt; usr/bin 13drwxr-xr-x 1 root root 0 Feb 26 2024 bin.usr-is-merged 14drwxr-xr-x 1 root root 0 Apr 22 2024 boot 15... 16 17$ la -aln \u0026#34;${MOUNT_PT}/home/ubuntu\u0026#34; 18insgesamt 16 19drwxr-x--- 1 1000 1000 80 Apr 24 19:00 . 20drwxr-xr-x 1 0 0 12 Apr 22 09:46 .. 21-rw------- 1 1000 1000 5 Apr 24 19:00 .bash_history 22-rw-r--r-- 1 1000 1000 220 Mär 31 2024 .bash_logout 23... 24 25$ sudo umount \u0026#34;${MOUNT_PT}\u0026#34; 26$ rmdir \u0026#34;${MOUNT_PT}\u0026#34; Einbinden mit \u0026quot;bindfs\u0026quot; Bei fast allen Varianten von Arbeitsplatzrechnern klappt das Einbingen mit \u0026quot;bindfs\u0026quot;:\n1$ INCUS_FS=/var/lib/incus/storage-pools/default/containers/u-2404/rootfs/ 2$ INCUS_UID=165536 3$ INCUS_GID=${INCUS_UID} 4$ MOUNT_PT=/tmp/mount-test 5$ mkdir \u0026#34;${MOUNT_PT}\u0026#34; # Einhängepunkt anlegen 6$ sudo bindfs \u0026#34;--uid-offset=-${INCUS_UID}\u0026#34; \u0026#34;--gid-offset=-${INCUS_GID}\u0026#34; \u0026#34;${INCUS_FS}\u0026#34; \u0026#34;${MOUNT_PT}\u0026#34; 7 8$ ls -al \u0026#34;${MOUNT_PT}\u0026#34; 9insgesamt 20 10drwxr-xr-x 1 root root 236 Apr 22 09:56 . 11drwxrwxrwt 32 root root 4096 Mai 17 07:46 .. 12lrwxrwxrwx 1 root root 7 Apr 22 2024 bin -\u0026gt; usr/bin 13drwxr-xr-x 1 root root 0 Feb 26 2024 bin.usr-is-merged 14drwxr-xr-x 1 root root 0 Apr 22 2024 boot 15... 16 17$ la -aln \u0026#34;${MOUNT_PT}/home/ubuntu\u0026#34; 18insgesamt 16 19drwxr-x--- 1 1000 1000 80 Apr 24 19:00 . 20drwxr-xr-x 1 0 0 12 Apr 22 09:46 .. 21-rw------- 1 1000 1000 5 Apr 24 19:00 .bash_history 22-rw-r--r-- 1 1000 1000 220 Mär 31 2024 .bash_logout 23... 24 25$ sudo umount \u0026#34;${MOUNT_PT}\u0026#34; 26$ rmdir \u0026#34;${MOUNT_PT}\u0026#34; Links ArchLinux - Anleitung zu X-mount.idmap Anleitung bindfs Versionen Getestet mit Ubuntu 24.04.2 LTS und Ubuntu-22.04.5 LTS (nur BINDFS) Historie 2025-05-17: Erste Version ","link":"https://uli.heller.cool/blog/2025-05-17_mount-mapped-uids/","section":"blog","tags":["linux","ubuntu","debian"],"title":"Ubuntu: Dateisystem mit Nutzeranpassung einhängen"},{"body":"","link":"https://uli.heller.cool/categories/multimedia/","section":"categories","tags":null,"title":"Multimedia"},{"body":" Für die Betrachtung von Videos nutze ich unter Ubuntu gerne VLC. Leider gibt es bei Ubuntu-24.04 (noble) ein paar Probleme!\nVLC-Start ohne Installation Wenn man direkt nach dem Aufsetzen einer Standard-Installation von Ubuntu-24.04 versucht VLC zu starten, dann erhält man diese Ausgaben:\n1$ vlc 2Der Befehl \u0026#39;vlc\u0026#39; wurde nicht gefunden, kann aber installiert werden mit: 3sudo snap install vlc # version 3.0.20-1-g2617de71b6, or 4sudo apt install vlc-bin # version 3.0.20-1build1 5Informationen zu neuen Versionen sind mit \u0026#39;snap info vlc\u0026#39; zu finden. Als SNAP-Hasser kommt für mich nur die obere Variante nicht in Betracht!\nVLC installieren gemäß Hinweisen Leider klappt die APT-Variante überhaupt nicht:\n1$ sudo apt install vlc-bin 2Paketlisten werden gelesen… Fertig 3Abhängigkeitsbaum wird aufgebaut… Fertig 4Statusinformationen werden eingelesen… Fertig 5... 6Entpacken von vlc-bin (3.0.20-3build6) ... 7vlc-bin (3.0.20-3build6) wird eingerichtet ... 8Trigger für man-db (2.12.0-4build2) werden verarbeitet ... 9 10$ vlc mein-film.mp4 11VLC media player 3.0.20 Vetinari (revision 3.0.20-0-g6f0d0ab126b) 12 13$ Beim Versuch einen Film abzuspielen wird nur die Versionsnummer ausgegeben und es erscheint wieder ein Kommandozeilen-Prompt!\nVLC \u0026quot;richtig\u0026quot; installieren So klappt es:\n1$ sudo apt install vlc 2... 3 4$ vlc mein-film.mp4 5VLC media player 3.0.20 Vetinari (revision 3.0.20-0-g6f0d0ab126b) 6 # Film wird abgespielt Der Hinweis stammt aus dieser Reddit-Diskussion.\nLinks Reddit-Diskussion. Versionen Getestet mit Ubuntu 24.04.2 LTS Historie 2025-05-13: Erste Version ","link":"https://uli.heller.cool/blog/2025-05-13_ubuntu-vlc/","section":"blog","tags":["linux","ubuntu","debian"],"title":"Ubuntu: Installation von VLC"},{"body":" Hier beschreibe ich, wie ich INCUS auf meinem Ubuntu-Rechner einrichte. INCUS ist der Nachfolger von LXC/LXD. Er steht bei Ubuntu-24.04 per Standard zur Verfügung. LXC/LXD gibt es auch noch. \u0026quot;Im Notfall\u0026quot; kehre ich dazu zurück, falls es mit INCUS nicht so richtig klappt.\nDieser Artikel orientiert sich an LXC/LXD: Grundeinrichtung mit Netzwerk.\nZiele:\nAbgeschottete Container Container wahlweise mit und ohne Zugriff in's Internet Container netzwerktechnisch erreichbar via Containername (.incus) INCUS installieren 1$ sudo apt install incus Nutzer als INCUS-Admin freischalten 1$ sudo usermod -a -G incus-admin uli Danach: Neustart und Kontrolle mit id|grep incus-admin- Abmelden und neu anmelden hat bei mir nicht geklappt!\nINCUS-Grundinitialisierung 1 # Speicherplatz 2$ sudo vgdisplay 3 --- Volume group --- 4 VG Name ubuntu-vg 5 System ID 6 Format lvm2 7 Metadata Areas 1 8 Metadata Sequence No 7 9 VG Access read/write 10 VG Status resizable 11 MAX LV 0 12 Cur LV 5 13 Open LV 4 14 Max PV 0 15 Cur PV 1 16 Act PV 1 17 VG Size \u0026lt;475,42 GiB 18 PE Size 4,00 MiB 19 Total PE 121707 20 Alloc PE / Size 31744 / 124,00 GiB 21 Free PE / Size 89963 / \u0026lt;351,42 GiB 22 VG UUID He3sn9-GGjP-ZPBt-vvea-SDHc-SXOg-zUZ9DF 23 24$ sudo lvcreate -n incuslv -L 50G ubuntu-vg 25 Logical volume \u0026#34;incuslv\u0026#34; created. 26 27 # Initialisierung 28$ incus admin init 29Would you like to use clustering? (yes/no) [default=no]: no 30Do you want to configure a new storage pool? (yes/no) [default=yes]: yes 31Name of the new storage pool [default=default]: default 32Name of the storage backend to use (dir, lvm, lvmcluster, btrfs) [default=btrfs]: btrfs 33Create a new BTRFS pool? (yes/no) [default=yes]: yes 34Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]: yes 35Path to the existing block device: /dev/mapper/ubuntu--vg-incuslv 36Would you like to create a new local network bridge? (yes/no) [default=yes]: yes 37What should the new bridge be called? [default=incusbr0]: incusbr0 38What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: auto 39What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: auto 40Would you like the server to be available over the network? (yes/no) [default=no]: no 41Would you like stale cached images to be updated automatically? (yes/no) [default=yes]: yes 42Would you like a YAML \u0026#34;init\u0026#34; preseed to be printed? (yes/no) [default=no]: yes 43config: {} 44networks: 45- config: 46 ipv4.address: auto 47 ipv6.address: auto 48 description: \u0026#34;\u0026#34; 49 name: incusbr0 50 type: \u0026#34;\u0026#34; 51 project: default 52storage_pools: 53- config: 54 source: /dev/mapper/ubuntu--vg-incuslv 55 description: \u0026#34;\u0026#34; 56 name: default 57 driver: btrfs 58profiles: 59- config: {} 60 description: \u0026#34;\u0026#34; 61 devices: 62 eth0: 63 name: eth0 64 network: incusbr0 65 type: nic 66 root: 67 path: / 68 pool: default 69 type: disk 70 name: default 71projects: [] 72cluster: null Testcontainer 1$ incus launch images:ubuntu/24.04 ubuntu-2404 2Launching ubuntu-2404 3 4$ incus exec ubuntu-2404 bash 5root@ubuntu-2404:~# apt update 6... 7root@ubuntu-2404:~# apt upgrade 8... 9root@ubuntu-2404:~# exit 10 11$ incus exec ubuntu-2404 -- sudo -u ubuntu -i 12To run a command as administrator (user \u0026#34;root\u0026#34;), use \u0026#34;sudo \u0026lt;command\u0026gt;\u0026#34;. 13See \u0026#34;man sudo_root\u0026#34; for details. 14 15ubuntu@ubuntu-2404:~$ exit 16logout Isolierte Benutzerkennungen Bei Ubuntu-24.04 sind /etc/subuid und /etc/subgid schon (fast) korrekt erweitert. Es muß bei \u0026quot;root\u0026quot; jeweils die erste Zahl angepasst werden von \u0026quot;1000000\u0026quot; auf \u0026quot;100000\u0026quot;:\n/etc/subuid 1uheller:100000:65536 2root:100000:1000000000 /etc/subgid 1uheller:100000:65536 2root:100000:1000000000 Aktivieren der isolierten UIDs:\n1$ incus profile set default security.idmap.isolated=true 2$ sudo systemctl restart incus.service Skript für die Durchführung der Änderungen:\n1for es in /etc/subuid /etc/subgid; do 2 for u in root; do 3 grep \u0026#34;^${u}:100000:1000000000\u0026#34; \u0026#34;${es}\u0026#34; \u0026gt;/dev/null \u0026amp;\u0026amp; continue 4 if grep \u0026#34;^${u}:\u0026#34; \u0026#34;${es}\u0026#34; \u0026gt;/dev/null 2\u0026gt;\u0026amp;1; then 5 sed -i -e \u0026#34;s/^${u}:.*/${u}:100000:1000000000\u0026#34; \u0026#34;${es}\u0026#34; 6 else 7 echo \u0026#34;${u}:100000:1000000000\u0026#34; \u0026gt;\u0026gt;\u0026#34;${es}\u0026#34; 8 fi 9 done 10done 11incus profile set default security.idmap.isolated=true 12systemctl restart incus.service Diese Änderung ist auch Teil des Initialisierungsskripts: initialize-incus.sh\nNetzwerkbrücken 1 # Network 2$ incus network create incushostonly ipv4.address=10.2.210.1/24 ipv4.nat=false ipv6.address=none 3Network incushostonly created 4 5$ incus network create incusnat ipv4.address=10.38.231.1/24 ipv4.nat=false ipv6.address=none 6Network incusnat created 7 8$ incus profile device set default eth0 network=incushostonly 9$ incus profile device add default eth1 nic network=incusnat 10 11$ incus network delete incusbr0 12Network incusbr0 deleted 13 14$ incus network list 15+-----------------+----------+---------+----------------+------+-------------+---------+---------+ 16| NAME | TYPE | MANAGED | IPV4 | IPV6 | DESCRIPTION | USED BY | STATE | 17+-----------------+----------+---------+----------------+------+-------------+---------+---------+ 18| enp3s0 | physical | NO | | | | 0 | | 19+-----------------+----------+---------+----------------+------+-------------+---------+---------+ 20| enx0023575c9346 | physical | NO | | | | 0 | | 21+-----------------+----------+---------+----------------+------+-------------+---------+---------+ 22| incushostonly | bridge | YES | 10.2.210.1/24 | none | | 0 | CREATED | 23+-----------------+----------+---------+----------------+------+-------------+---------+---------+ 24| incusnat | bridge | YES | 10.38.231.1/24 | none | | 3 | CREATED | 25+-----------------+----------+---------+----------------+------+-------------+---------+---------+ 26| wlp4s0 | physical | NO | | | | 0 | | 27+-----------------+----------+---------+----------------+------+-------------+---------+---------+ Diese Änderung ist auch Teil des Initialisierungsskripts: initialize-incus.sh\nNamensauflösung - erste Tests Aktuelle Anleitung: How to integrate with systemd-resolved\nBasierend auf vorgenannter Anleitung unter ausschliesslicher Berücksichtigung von IPV4:\n1$ incus network get incusnat ipv4.address 210.38.231.1/24 3$ incus network get incushostonly ipv4.address 410.2.210.1/24 5 6$ incus network get incusnat dns.domain 7$ incus network get incushostonly dns.domain 8 # If this option is not set, the default domain name is incus(?) 9 10$ sudo resolvectl dns incusnat 10.38.231.1 11$ sudo resolvectl domain incusnat \u0026#39;~incus\u0026#39; 12$ sudo resolvectl dns incushostonly 10.2.210.1 13$ sudo resolvectl domain incushostonly \u0026#39;~incus\u0026#39; Kurztest:\n1$ ping ubuntu-2404.incus 2PING ubuntu-2404.incus (10.38.231.74) 56(84) bytes of data. 364 bytes from ubuntu-2404.incus (10.38.231.74): icmp_seq=1 ttl=64 time=0.023 ms 464 bytes from ubuntu-2404.incus (10.38.231.74): icmp_seq=2 ttl=64 time=0.050 ms 5^C 6--- ubuntu-2404.incus ping statistics --- 72 packets transmitted, 2 received, 0% packet loss, time 1005ms 8rtt min/avg/max/mdev = 0.023/0.036/0.050/0.013 ms Namensauflösung - dauerhafte Einrichtung Aktuelle Anleitung (basierend auf INCUS): How to integrate with systemd-resolved\nBasierend auf vorgenannter Anleitung unter ausschliesslicher Berücksichtigung von IPV4 sind diese Schritte notwendig:\nNetzwerkbrücken einrichten (wie zuvor):\n1#!/bin/bash 2# 3 4# 5# Netzwerk-Brücken 6# 7incus network info incushostonly \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 || { 8 incus network create incushostonly ipv4.address=10.2.210.1/24 ipv4.nat=false ipv6.address=none 9} 10incus network info incusnat \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 || { 11 incus network create incusnat ipv4.address=10.38.231.1/24 ipv4.nat=true ipv6.address=none 12} 13incus profile device set default eth0 network=incusnat 14 15incus network info incusbr0 \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 \u0026amp;\u0026amp; { 16 incus network delete incusbr0 17} Standardcontainer auf Nutzung von \u0026quot;incusnat\u0026quot; festlegen:\n1incus profile device set default eth0 network=incushostonly 2incus profile device add default eth1 nic network=incusnat Profile für \u0026quot;hostonly\u0026quot; und \u0026quot;nat\u0026quot;:\n1incus profile create hostonly 2incus profile set hostonly security.idmap.isolated true 3incus profile device add hostonly eth0 nic network=incushostonly 4incus profile device add hostonly root disk path=/ pool=default 5 6incus profile create nat 7incus profile set nat security.idmap.isolated true 8incus profile device add nat eth0 nic network=incushostonly 9incus profile device add nat eth1 nic network=incusnat 10incus profile device add nat root disk path=/ pool=default DNS dauerhaft aktivieren für beide Netzwerkbrücken:\n1# 2# DNS 3# 4for bridge in incushostonly incusnat; do 5ipaddress=\u0026#34;$(incus network get ${bridge} ipv4.address|cut -d \u0026#34;/\u0026#34; -f 1)\u0026#34; 6cat \u0026gt;/etc/systemd/system/incus-dns-${bridge}.service \u0026lt;\u0026lt;EOF 7[Unit] 8Description=INCUS per-link DNS configuration for ${bridge} 9BindsTo=sys-subsystem-net-devices-${bridge}.device 10After=sys-subsystem-net-devices-${bridge}.device 11 12[Service] 13Type=oneshot 14ExecStart=/usr/bin/resolvectl dns ${bridge} ${ipaddress} 15ExecStart=/usr/bin/resolvectl domain ${bridge} ~incus 16ExecStart=/usr/bin/resolvectl dnssec ${bridge} off 17ExecStart=/usr/bin/resolvectl dnsovertls ${bridge} off 18ExecStopPost=/usr/bin/resolvectl revert ${bridge} 19RemainAfterExit=yes 20 21[Install] 22WantedBy=sys-subsystem-net-devices-${bridge}.device 23EOF 24systemctl daemon-reload 25systemctl enable --now incus-dns-${bridge} 26done Diese Änderung ist auch Teil des Initialisierungsskripts: initialize-incus.sh\nOffene Punkte Reboot-Test Werden laufende Container automatisch gestartet? Funktioniert DNS? Image-Test Klappt's mit eigenen LXC/LXD-Images? Links Arch: Incus How to integrate with systemd-resolved Versionen Getestet mit Ubuntu 24.04.2 LTS und incus-6.0.0-1ubuntu0.2 auf dem Host Historie 2025-05-26: eth0, eth1 und Profile anlegen 2025-04-24: Erste Version ","link":"https://uli.heller.cool/blog/2025-04-24_incus-mit-netzwerk/","section":"blog","tags":["incus","lxc","lxd","linux","ubuntu","debian"],"title":"INCUS: Grundeinrichtung mit Netzwerk"},{"body":"","link":"https://uli.heller.cool/tags/ssh/","section":"tags","tags":null,"title":"Ssh"},{"body":"","link":"https://uli.heller.cool/categories/ssh/","section":"categories","tags":null,"title":"SSH"},{"body":" Ich nutze SSH-Schlüssel zum Anmelden auf diversen Serverrechnern. Heute habe ich festgestellt, dass ich mich mit meinem Laptop auf einem der Uraltrechner nicht mehr anmelden kann.\nAbgleich der SSH-Schlüssel Erster Ansatz: Mir fehlt der richtige SSH-Schlüssel!\nKann ich ausschliessen!\nArbeitsplatzrechner: ssh -i $HOME/.ssh/uheller-rsa old-server klappt Laptop: ssh -i $HOME/.ssh/uheller-rsa old-server klappt nicht! Detaillierte Protokollierung 1$ ssh -v -i $HOME/.ssh/uheller-rsa old-server 2OpenSSH_8.9p1 Ubuntu-3ubuntu0.10, OpenSSL 3.0.2 15 Mar 2022 3debug1: Reading configuration data /home/uheller/.ssh/config 4... 5debug1: rekey in after 134217728 blocks 6debug1: get_agent_identities: bound agent to hostkey 7debug1: get_agent_identities: agent returned 6 keys 8debug1: Will attempt key: /home/uheller/.ssh/uheller-rsa RSA SHA256:h7Xg0Eg5bOp/L0HswSMtwxs0lbNX0hOtRmBqX5qjseg explicit agent 9... 10debug1: Next authentication method: publickey 11debug1: Offering public key: /home/uheller/.ssh/uheller-rsa RSA SHA256:h7Xg0Eg5bOp/L0HswSMtwxs0lbNX0hOtRmBqX5qjseg explicit agent 12debug1: send_pubkey_test: no mutual signature algorithm 13... Google-Suche SSH-RSA key rejected with message \u0026quot;no mutual signature algorithm\u0026quot;\nCause\nThe RSA SHA-1 hash algorithm is being quickly deprecated across operating systems and SSH clients because of various security vulnerabilities, with many of these technologies now outright denying the use of this algorithm.\nAlso: Ich sollte den RSA-Schlüssel wohl schnellstmöglich tauschen durch einen moderneren!\nAktivierung von RSA 1$ ssh -o \u0026#39;PubkeyAcceptedKeyTypes=+ssh-rsa\u0026#39; -i $HOME/.ssh/uheller-rsa old-server 2Welcome to Ubuntu 14.04.6 LTS (GNU/Linux 4.4.0-148-generic x86_64) 3# Mit der Option \u0026quot;-o 'PubkeyAcceptedKeyTypes=+ssh-rsa'\u0026quot; klappt es! Offenbar muß ich nicht nur den RSA-Schlüssel dringend tauschen, sondern auch den \u0026quot;old-server\u0026quot; neu aufsetzen. Ist ja noch ein Uralt-Ubuntu, das längst nicht mehr aktualisiert wird. Zum Glück ist der Server üblicherweise ausgeschaltet!\nVersionen Getestet unter Ubuntu 20.04 - da klappt es problemlos Getestet unter Ubuntu 22.04 - da gibt es die Schwierigkeiten Links SSH-RSA key rejected with message \u0026quot;no mutual signature algorithm\u0026quot; Historie 2025-05-17: Tippfehler korrigiert 2025-02-13: Erste Version ","link":"https://uli.heller.cool/blog/2025-02-13_ssh-anmelde-problem/","section":"blog","tags":["ssh","linux","ubuntu"],"title":"SSH: Anmeldeproblem mit Ubuntu-22.04"},{"body":" Beim Starten von Podman als Nicht-Root-Benutzer erscheint eine Fehlermeldung wie diese:\n1ubuntu@podman-2404:~$ podman run hello-world 2ERRO[0000] running `/usr/bin/newuidmap 508 0 1000 1 1 100000 65536`: newuidmap: write to uid_map failed: Operation not permitted 3Error: cannot set up namespace using \u0026#34;/usr/bin/newuidmap\u0026#34;: exit status 1 Hier beschreibe ich Ursache und Korrektur!\nUrsache Das Problem tritt auf, wenn man\ndie SNAP-Version von LXD verwendet isolierte Nutzerkennungen verwendet (security.idmap.isolated) Podman im Container als Nicht-Root verwendet Test Im Container:\n1ubuntu@podman-2404:~$ cat /proc/self/uid_map 2 0 1589824 65536 Man sieht: Es stehen 65536 UIDs zur Verfügung im Container. Für den Podman-Start braucht man zusätzliche UIDs!\nAbhilfe Im LXC/LXD-Host:\n1root@lxd-host:~# lxc config set podman-2404 security.idmap.size=700000 2root@lxd-host:~# lxc stop podman-2404 3root@lxd-host:~# lxc start podman-2404 Danach klappt podman run hello-world!\nVersionen Getestet unter Ubuntu 20.04 mit LXD-6.2-bde4d03 (Snap-Version) Getestet mit Ubuntu-24.04-Container und Podman-4.9.3+ds1-1ubuntu0.2 Links linuxcontainers.org - Unable to run rootless docker/podman under a (rootless) LXD container Historie 2025-02-12: Erste Version ","link":"https://uli.heller.cool/blog/2025-02-12_podman-startproblem/","section":"blog","tags":["lxc","lxd","podman","linux","ubuntu"],"title":"LXC/LXD: Podman-Startproblem - newuidmap: write to uid_map failed"},{"body":"","link":"https://uli.heller.cool/tags/podman/","section":"tags","tags":null,"title":"Podman"},{"body":" Ich habe Probleme mit LXC/LXD-Containern und vermute, dass es an CGROUPS liegt. Mein Host-Rechner unter Ubuntu-20.04 verwendet noch CGROUPS v1 und nicht CGROUPS v2.\nHier beschreibe ich die Umstellung!\nUnterstützte Varianten von CGROUPS ermitteln 1ubuntu-20.04# grep cgroup /proc/filesystems 2nodev\tcgroup 3nodev\tcgroup2 Aktive Variante von CGROUPS ermitteln 1ubuntu-20.04# stat -fc %T /sys/fs/cgroup 2tmpfs Wenn das Kommando \u0026quot;tmpfs\u0026quot; ausgibt, dann ist CGROUPS v1 aktiv. Bei CGROUPS v2 wird \u0026quot;cgroup2fs\u0026quot; ausgegeben!\nAusgangspunkt Ubuntu-20.04 CGROUPS v1 ist aktiv CGROUPS v1 ud v2 werden unterstützt Änderungen /etc/default/grub 1--- /etc/default/grub.orig\t2025-02-10 00:10:25.236762113 +0100 2+++ /etc/default/grub\t2025-02-10 00:09:36.464777672 +0100 3@@ -8,7 +8,7 @@ 4 GRUB_HIDDEN_TIMEOUT_QUIET=false 5 GRUB_TIMEOUT=5 6 GRUB_DISTRIBUTOR=`lsb_release -i -s 2\u0026gt; /dev/null || echo Debian` 7-GRUB_CMDLINE_LINUX_DEFAULT=\u0026#34;nomodeset consoleblank=0\u0026#34; 8+GRUB_CMDLINE_LINUX_DEFAULT=\u0026#34;nomodeset consoleblank=0 systemd.unified_cgroup_hierarchy=1\u0026#34; 9 GRUB_CMDLINE_LINUX=\u0026#34;\u0026#34; Aktivieren 1update-grub 2apt upgrade 3reboot Nachkontrolle 1ubuntu-20.04# stat -fc %T /sys/fs/cgroup 2cgroup2fs Test: Klappt's nun mit Podman? 1lxc start podman-2404 2ssh ubuntu@podman-2404.lxd 3podman run hello-world 4# klappt leider nicht! Leider erscheint noch immer diese Fehlermeldung:\n1ubuntu@podman-2404:~$ podman run hello-world 2ERRO[0000] running `/usr/bin/newuidmap 257 0 1000 1 1 100000 65536`: newuidmap: write to uid_map failed: Operation not permitted 3Error: cannot set up namespace using \u0026#34;/usr/bin/newuidmap\u0026#34;: exit status 1 Lösung hierfür habe ich zwischenzeitlich gefunden und in LXC/LXD: Podman ohne \u0026quot;root\u0026quot; dokumentiert!\nVersionen Getestet unter Ubuntu 20.04 Links webuzo - So aktivieren Sie cGroups v2 LXC/LXD: Podman ohne \u0026quot;root\u0026quot; Historie 2025-02-11: Erste Version ","link":"https://uli.heller.cool/blog/2025-02-11_cgroup2/","section":"blog","tags":["linux","ubuntu"],"title":"Ubuntu-20.04: Umstellen auf CGROUPS v2"},{"body":"","link":"https://uli.heller.cool/tags/gradle/","section":"tags","tags":null,"title":"Gradle"},{"body":"","link":"https://uli.heller.cool/categories/gradle/","section":"categories","tags":null,"title":"Gradle"},{"body":" Bei Gradle-Projekten kann ich Maven-Package-Repositories hinterlegen mit URLs wie \u0026quot;file://\u0026quot; - das sind dann lokal vorhandene Repositories - oder \u0026quot;https://\u0026quot; - das sind entferne Repositories. Leider verhalten sie sich leicht unterschiedlich!\nVorbereitungen Beispielprojekt clonen: git clone git@github.com:uli-heller/java-example-gradle-local-remote.git Verzeichnis wechseln: cd java-example-gradle-local-remote Test mit lokalem Repository Sicherstellen: Es ist eine \u0026quot;file://\u0026quot;-URL hinterlegt für das Maven-Package-Repository: 1$ grep maven-repository build.gradle|grep -v \u0026#34;^\\s*//\u0026#34; 2 url(\u0026#34;file://${projectDir}/maven-repository\u0026#34;) Maven-Package-Repository füllen: 1rm -rf maven-repository 2./create-maven-repository.sh Projekt bauen: ./gradlew --refresh-dependencies build Ergebnis untersuchen: unzip -v build/libs/java-example-gradle-local-remote-0.0.2.jar|grep hello hello-world-0.9.1-plain.jar Zusätzliche neue Version anlegen: ./create-version.sh hello-world 0.9.2 Projekt nochmal bauen ohne \u0026quot;--refresh-dependencies\u0026quot;: ./gradlew build Ergebnis untersuchen: unzip -v build/libs/java-example-gradle-local-remote-0.0.2.jar|grep hello hello-world-0.9.2-plain.jar Die zusätzlich erzeugte neue Version wird verwendet! Test mit entferntem Repository Webserver starten: jwebserver --port 8888 \u0026amp; Ändern der URL für das Maven-Package-Repository: Von: url(\u0026quot;file://${projectDir}/maven-repository\u0026quot;) Nach: url(\u0026quot;http://localhost:8888/maven-repository\u0026quot;) Maven-Package-Repository füllen: 1rm -rf maven-repository 2./create-maven-repository.sh Projekt bauen: ./gradlew --refresh-dependencies build Ergebnis untersuchen: unzip -v build/libs/java-example-gradle-local-remote-0.0.2.jar|grep hello hello-world-0.9.1-plain.jar Zusätzliche neue Version anlegen: ./create-version.sh hello-world 0.9.2 Projekt nochmal bauen ohne \u0026quot;--refresh-dependencies\u0026quot;: ./gradlew build Ergebnis untersuchen: unzip -v build/libs/java-example-gradle-local-remote-0.0.2.jar|grep hello hello-world-0.9.1-plain.jar Es wird weiterhin die ursprünglichw Version verwendet! Erkenntnis Bei lokalem Maven-Package-Repository werden dynamische Abhängigkeiten bei jedem Build-Lauf akualisiert. Bei entfernten werden sie nur einmal pro Tag aktualisiert!\nVersionen Getestet mit\nGradle-8.11.1 und Java-21 Links Github:java-example-gradle-local-remote Historie 2025-02-10: Erste Version ","link":"https://uli.heller.cool/blog/2025-02-10_gradle-local-remote/","section":"blog","tags":["gradle"],"title":"Gradle: Lokales oder entferntes PackageRepository"},{"body":"","link":"https://uli.heller.cool/categories/podman/","section":"categories","tags":null,"title":"Podman"},{"body":" Bei der Verwendung von Podman und PodmanCompose werden Images heruntergeladen, gespeichert und ausgeführt. Hier möchte ich untersuchen, wo die Daten abliegen und wie ich sie bereinigen kann.\nroot 1root@podman:~# podman image ls 2REPOSITORY TAG IMAGE ID CREATED SIZE 3docker.io/library/hello-world latest 74cc54e27dc4 2 weeks ago 27.1 kB 4 5root@podman:~# podman container ps -a 6CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7ca7764721d89 docker.io/library/hello-world:latest /hello 6 days ago Exited (0) 6 days ago brave_chatterjee Speicherort /var/lib/containers/storage/overlay-images\nAufräumen 1root@podman:~# podman container prune -f 2ca7764721d8926dc9110d211c032aeb2b97fc57dbc1ba6d5d48337429eb03351 3 4root@podman:~# podman image rm hello-world 5Untagged: docker.io/library/hello-world:latest 6Deleted: 74cc54e27dc41bb10dc4b2226072d469509f2f22f1a3ce74f4a59661a1d44602 ubuntu 1root@podman:~# sudo -u ubuntu -i podman image ls 2REPOSITORY TAG IMAGE ID CREATED SIZE 3docker.io/library/hello-world latest 74cc54e27dc4 2 weeks ago 27.1 kB 4docker.io/library/nginx alpine 93f9c72967db 2 months ago 48.5 MB 5docker.io/library/ubuntu latest b1d9df8ab815 2 months ago 80.6 MB Speicherort /home/ubuntu/.local/share/containers/storage/overlay\n1root@podman:~# du -hs /home/ubuntu/.local/share/containers/storage/overlay 2133M\t/home/ubuntu/.local/share/containers/storage/overlay Aufräumen 1root@podman:~# sudo -u ubuntu -i podman container prune -f 2f338e08c9e3ef1819938a5b8f75257d26cc9fb09ab0bb3c79f07aadcb79b6634 32d5e5e8aaaea19567c617ea810eb7f8a52a0e531172fce2387bf77cba2edf79f 43a9222cb719bafc9abf28c14cbdaf45fdb6de3eb87f0de8fb82922e794d95be8 578e5a68a19c0b4793743572519d0d471f0be8912fa2e0013a9b0a00468eddb7a 6878f64eb0be7bdc1c9aaa8f45d199faecb4a2684fbad67c09e89c9f41e694c30 7 8root@podman:~# sudo -u ubuntu -i podman image rm hello-world 9Untagged: docker.io/library/hello-world:latest 10Deleted: 74cc54e27dc41bb10dc4b2226072d469509f2f22f1a3ce74f4a59661a1d44602 11 12root@podman:~# sudo -u ubuntu -i podman image rm nginx:alpine 13Untagged: docker.io/library/nginx:alpine 14Deleted: 93f9c72967dbcfaffe724ae5ba471e9568c9bbe67271f53266c84f3c83a409e3 15 16root@podman:~# sudo -u ubuntu -i podman image rm ubuntu 17Untagged: docker.io/library/ubuntu:latest 18Deleted: b1d9df8ab81559494794e522b380878cf9ba82d4c1fb67293bcf931c3aa69ae4 19 20root@podman:~# du -hs /home/ubuntu/.local/share/containers/storage/overlay 214.0K\t/home/ubuntu/.local/share/containers/storage/overlay Alles aufräumen Wenn man Podman mit \u0026quot;root\u0026quot; und \u0026quot;ubuntu\u0026quot; genutzt hat, dann räumen diese Befehle alles auf:\n1podman# podman system reset 2WARNING! This will remove: 3 - all containers 4 - all pods 5 - all images 6 - all networks 7 - all build cache 8 - all machines 9 - all volumes 10 - the graphRoot directory: \u0026#34;/var/lib/containers/storage\u0026#34; 11 - the runRoot directory: \u0026#34;/run/containers/storage\u0026#34; 12Are you sure you want to continue? [y/N] y 13 14podman# sudo -u ubuntu -i podman system reset 15WARNING! This will remove: 16 - all containers 17 - all pods 18 - all images 19 - all networks 20 - all build cache 21 - all machines 22 - all volumes 23 - the graphRoot directory: \u0026#34;/home/ubuntu/.local/share/containers/storage\u0026#34; 24 - the runRoot directory: \u0026#34;/run/user/1000/containers\u0026#34; 25Are you sure you want to continue? [y/N] y Versionen Getestet mit einem Ubuntu-24.04-Container und podman-4.9.3+ds1-1ubuntu0.2 und podman-compose-1.0.6-1 Links LXC/LXD: Podman im Container mit Ubuntu-24.04 Historie 2025-02-11: Alles löschen mit podman system reset 2025-02-09: Erste Version ","link":"https://uli.heller.cool/blog/2025-02-09_podman-speicherplatz/","section":"blog","tags":["podman","linux","ubuntu"],"title":"Podman - Speicherplatz"},{"body":" Ubuntu hat irgendwann mal die Idee entwickelt, Aktualisierungen erstmal in begrenztem Maße bei einer Teilmenge der Installationen auszurollen und bei Problemen wieder zurückzuziehen.\nLeider mit ganz eigenen Problemen! Ich mag' den Mechanismus nicht!\nGrundidee Die Grundidee besteht darin, gewisse \u0026quot;unsichere\u0026quot; Aktualisierungen erstmal bei einem begrenzten Teil der Installationen auszurollen, bspw. bei 10%.\nWenn sich die Aktualisierung als gut herausstellt, dann wird die Prozentzahl sukzessive erhöht bis schlussendlich alle Installationen aktualisiert sind.\nBei Fehlern wird die Aktualisierung zurückgezogen und nicht weiter verteilt.\nProbleme Etwas problematisch wird's, wenn man zur Teilmenge gehört, die \u0026quot;früh\u0026quot; die Aktualisierung eingespielt bekommen. Wenn sich die Aktualisierung als schlecht herausstellt, dann wird sie von den Installationsquellen gelöscht. Auf dem eigenen Rechner bleibt sie aber erhalten.\nDas verursacht zwei Arten von Problemen:\nMan hat ein \u0026quot;kaputtes\u0026quot; Paket auf seinem Rechner. Wenn's gut läuft, dann sind nur kleinere funktionale Störungen vorhanden die bei einem selbst nicht auftreten. Es könnten aber auch sicherheits-relevante Störungen sein. Schlecht!\nMan hat ein Paket auf seinem Rechner, von dem man nicht mehr nachweisen kann, dass es aus einer offiziellen Quelle eingespielt wurde. apt policy (paketname) gibt als Quelle nur \u0026quot;/var/lib/dpkg/status\u0026quot; an. Das Paket kann also von überall herkommen. Angenommen, es enthält einen Virus - dann sieht es so aus, als hätte man grob fahrlässig ein Fremdpaket eingespielt und sich damit den Virus eingehandelt!\nIch mag den Mechanismus nicht!\nAbhilfe Leider funktioniert dies nicht mehr:\n1Update-Manager::Never-Include-Phased-Updates; 2APT::Get::Never-Include-Phased-Updates \u0026#34;true\u0026#34;; Also: Keine Abhilfe möglich!\nNotizen Zurückgehaltene Aktualisierungen 1root@ubuntu-2404:~# apt update 2Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease 3Hit:2 http://archive.ubuntu.com/ubuntu noble-updates InRelease 4Hit:3 http://archive.ubuntu.com/ubuntu noble-backports InRelease 5Hit:4 http://archive.ubuntu.com/ubuntu noble-security InRelease 6Reading package lists... Done 7Building dependency tree... Done 8Reading state information... Done 914 packages can be upgraded. Run \u0026#39;apt list --upgradable\u0026#39; to see them. 10root@ubuntu-2404:~# apt upgrade -y 11Reading package lists... Done 12Building dependency tree... Done 13Reading state information... Done 14Calculating upgrade... Done 15The following upgrades have been deferred due to phasing: 16 libnss-systemd libpam-systemd libsystemd-shared libsystemd0 libudev1 systemd 17 systemd-dev systemd-resolved systemd-sysv systemd-timesyncd 18The following packages have been kept back: 19 libnetplan1 netplan-generator netplan.io python3-netplan 200 upgraded, 0 newly installed, 0 to remove and 14 not upgraded. 21N: Some packages may have been kept back due to phasing. Never-Include-Phased-Updates ... funktioniert nicht\n1root@ubuntu-2404:~# apt -o APT::Get::Never-Include-Phased-Updates=true upgrade -y 2Reading package lists... Done 3Building dependency tree... Done 4Reading state information... Done 5Calculating upgrade... Done 6The following upgrades have been deferred due to phasing: 7 libnss-systemd libpam-systemd libsystemd-shared libsystemd0 libudev1 systemd 8 systemd-dev systemd-resolved systemd-sysv systemd-timesyncd 9The following packages have been kept back: 10 libnetplan1 netplan-generator netplan.io python3-netplan 110 upgraded, 0 newly installed, 0 to remove and 14 not upgraded. 12N: Some packages may have been kept back due to phasing. 13 14root@ubuntu-2404:~# apt -o APT::Get::Never-Include-Phased-Updates=true -o Update-Manager::Never-Include-Phased-Updates upgrade -y 15E: Option Update-Manager::Never-Include-Phased-Updates: Configuration item specification must have an =\u0026lt;val\u0026gt;. 16root@ubuntu-2404:~# apt -o APT::Get::Never-Include-Phased-Updates=true -o Update-Manager::Never-Include-Phased-Updates=true upgrade -y 17Reading package lists... Done 18Building dependency tree... Done 19Reading state information... Done 20Calculating upgrade... Done 21The following upgrades have been deferred due to phasing: 22 libnss-systemd libpam-systemd libsystemd-shared libsystemd0 libudev1 systemd 23 systemd-dev systemd-resolved systemd-sysv systemd-timesyncd 24The following packages have been kept back: 25 libnetplan1 netplan-generator netplan.io python3-netplan 260 upgraded, 0 newly installed, 0 to remove and 14 not upgraded. 27N: Some packages may have been kept back due to phasing. Ausgabe von \u0026quot;apt policy\u0026quot; bei Phasen-Aktualierungen Noch nicht installiert 1root@ubuntu-2404:~# apt policy systemd 2systemd: 3 Installed: 255.4-1ubuntu8.4 4 Candidate: 255.4-1ubuntu8.5 5 Version table: 6 255.4-1ubuntu8.5 500 (phased 40%) 7 500 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages 8 *** 255.4-1ubuntu8.4 100 9 100 /var/lib/dpkg/status 10 255.4-1ubuntu8 500 11 500 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages 12 13root@ubuntu-2404:~# apt policy libudev1 14libudev1: 15 Installed: 255.4-1ubuntu8.4 16 Candidate: 255.4-1ubuntu8.5 17 Version table: 18 255.4-1ubuntu8.5 500 (phased 40%) 19 500 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages 20 *** 255.4-1ubuntu8.4 100 21 100 /var/lib/dpkg/status 22 255.4-1ubuntu8 500 23 500 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages Installiert 1root@ubuntu-2404:~# apt policy systemd 2systemd: 3 Installed: 255.4-1ubuntu8.5 4 Candidate: 255.4-1ubuntu8.5 5 Version table: 6 *** 255.4-1ubuntu8.5 500 (phased 40%) 7 500 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages 8 100 /var/lib/dpkg/status 9 255.4-1ubuntu8 500 10 500 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages 11 12root@ubuntu-2404:~# apt policy libudev1 13libudev1: 14 Installed: 255.4-1ubuntu8.5 15 Candidate: 255.4-1ubuntu8.5 16 Version table: 17 *** 255.4-1ubuntu8.5 500 (phased 40%) 18 500 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages 19 100 /var/lib/dpkg/status 20 255.4-1ubuntu8 500 21 500 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages Immer installieren mit \u0026quot;always include\u0026quot; 1root@ubuntu-2404:~# apt -o APT::Get::Always-Include-Phased-Updates=true -o Update-Manager::Always-Include-Phased-Updates=true upgrade -y 2Reading package lists... Done 3Building dependency tree... Done 4Reading state information... Done 5Calculating upgrade... Done 6The following package was automatically installed and is no longer required: 7 python3-netifaces 8Use \u0026#39;apt autoremove\u0026#39; to remove it. 9The following NEW packages will be installed: 10 ethtool systemd-hwe-hwdb udev 11The following packages will be upgraded: 12 libnetplan1 libnss-systemd libpam-systemd libsystemd-shared libsystemd0 13 libudev1 netplan-generator netplan.io python3-netplan systemd systemd-dev 14 systemd-resolved systemd-sysv systemd-timesyncd 1514 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. 16Need to get 9379 kB of archives. 17After this operation, 11.9 MB of additional disk space will be used. 18Get:1 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libnss-systemd amd64 255.4-1ubuntu8.5 [159 kB] 19Get:2 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 systemd-sysv amd64 255.4-1ubuntu8.5 [11.9 kB] 20Get:3 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 systemd-timesyncd amd64 255.4-1ubuntu8.5 [35.3 kB] 21Get:4 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 systemd-resolved amd64 255.4-1ubuntu8.5 [296 kB] 22Get:5 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 systemd-dev all 255.4-1ubuntu8.5 [104 kB] 23Get:6 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libpam-systemd amd64 255.4-1ubuntu8.5 [235 kB] 24Get:7 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 systemd amd64 255.4-1ubuntu8.5 [3471 kB] 25Get:8 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsystemd-shared amd64 255.4-1ubuntu8.5 [2069 kB] 26Get:9 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libsystemd0 amd64 255.4-1ubuntu8.5 [433 kB] 27Get:10 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libudev1 amd64 255.4-1ubuntu8.5 [175 kB] 28Get:11 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 netplan-generator amd64 1.1.1-1~ubuntu24.04.1 [60.8 kB] 29Get:12 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-netplan amd64 1.1.1-1~ubuntu24.04.1 [24.3 kB] 30Get:13 http://archive.ubuntu.com/ubuntu noble/main amd64 ethtool amd64 1:6.7-1build1 [229 kB] 31Get:14 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 udev amd64 255.4-1ubuntu8.5 [1874 kB] 32Get:15 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 netplan.io amd64 1.1.1-1~ubuntu24.04.1 [68.5 kB] 33Get:16 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libnetplan1 amd64 1.1.1-1~ubuntu24.04.1 [131 kB] 34Get:17 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 systemd-hwe-hwdb all 255.1.4 [3200 B] 35Fetched 9379 kB in 6s (1469 kB/s) 36(Reading database ... 18117 files and directories currently installed.) 37Preparing to unpack .../0-libnss-systemd_255.4-1ubuntu8.5_amd64.deb ... 38Unpacking libnss-systemd:amd64 (255.4-1ubuntu8.5) over (255.4-1ubuntu8.4) ... 39Preparing to unpack .../1-systemd-sysv_255.4-1ubuntu8.5_amd64.deb ... 40Unpacking systemd-sysv (255.4-1ubuntu8.5) over (255.4-1ubuntu8.4) ... 41Preparing to unpack .../2-systemd-timesyncd_255.4-1ubuntu8.5_amd64.deb ... 42Unpacking systemd-timesyncd (255.4-1ubuntu8.5) over (255.4-1ubuntu8.4) ... 43Preparing to unpack .../3-systemd-resolved_255.4-1ubuntu8.5_amd64.deb ... 44Unpacking systemd-resolved (255.4-1ubuntu8.5) over (255.4-1ubuntu8.4) ... 45Preparing to unpack .../4-systemd-dev_255.4-1ubuntu8.5_all.deb ... 46Unpacking systemd-dev (255.4-1ubuntu8.5) over (255.4-1ubuntu8.4) ... 47Preparing to unpack .../5-libpam-systemd_255.4-1ubuntu8.5_amd64.deb ... 48Unpacking libpam-systemd:amd64 (255.4-1ubuntu8.5) over (255.4-1ubuntu8.4) ... 49Preparing to unpack .../6-systemd_255.4-1ubuntu8.5_amd64.deb ... 50Unpacking systemd (255.4-1ubuntu8.5) over (255.4-1ubuntu8.4) ... 51Preparing to unpack .../7-libsystemd-shared_255.4-1ubuntu8.5_amd64.deb ... 52Unpacking libsystemd-shared:amd64 (255.4-1ubuntu8.5) over (255.4-1ubuntu8.4) ... 53Preparing to unpack .../8-libsystemd0_255.4-1ubuntu8.5_amd64.deb ... 54Unpacking libsystemd0:amd64 (255.4-1ubuntu8.5) over (255.4-1ubuntu8.4) ... 55Setting up libsystemd0:amd64 (255.4-1ubuntu8.5) ... 56(Reading database ... 18117 files and directories currently installed.) 57Preparing to unpack .../libudev1_255.4-1ubuntu8.5_amd64.deb ... 58Unpacking libudev1:amd64 (255.4-1ubuntu8.5) over (255.4-1ubuntu8.4) ... 59Setting up libudev1:amd64 (255.4-1ubuntu8.5) ... 60(Reading database ... 18117 files and directories currently installed.) 61Preparing to unpack .../0-netplan-generator_1.1.1-1~ubuntu24.04.1_amd64.deb ... 62Adding \u0026#39;diversion of /lib/systemd/system-generators/netplan to /lib/systemd/syst 63em-generators/netplan.usr-is-merged by netplan-generator\u0026#39; 64Unpacking netplan-generator (1.1.1-1~ubuntu24.04.1) over (1.0.1-1ubuntu2~24.04.1 65) ... 66Preparing to unpack .../1-python3-netplan_1.1.1-1~ubuntu24.04.1_amd64.deb ... 67Unpacking python3-netplan (1.1.1-1~ubuntu24.04.1) over (1.0.1-1ubuntu2~24.04.1) 68... 69Selecting previously unselected package ethtool. 70Preparing to unpack .../2-ethtool_1%3a6.7-1build1_amd64.deb ... 71Unpacking ethtool (1:6.7-1build1) ... 72Selecting previously unselected package udev. 73Preparing to unpack .../3-udev_255.4-1ubuntu8.5_amd64.deb ... 74Unpacking udev (255.4-1ubuntu8.5) ... 75Preparing to unpack .../4-netplan.io_1.1.1-1~ubuntu24.04.1_amd64.deb ... 76Unpacking netplan.io (1.1.1-1~ubuntu24.04.1) over (1.0.1-1ubuntu2~24.04.1) ... 77Preparing to unpack .../5-libnetplan1_1.1.1-1~ubuntu24.04.1_amd64.deb ... 78Unpacking libnetplan1:amd64 (1.1.1-1~ubuntu24.04.1) over (1.0.1-1ubuntu2~24.04.1 79) ... 80Selecting previously unselected package systemd-hwe-hwdb. 81Preparing to unpack .../6-systemd-hwe-hwdb_255.1.4_all.deb ... 82Unpacking systemd-hwe-hwdb (255.1.4) ... 83Setting up systemd-dev (255.4-1ubuntu8.5) ... 84Setting up libnetplan1:amd64 (1.1.1-1~ubuntu24.04.1) ... 85Setting up libsystemd-shared:amd64 (255.4-1ubuntu8.5) ... 86Setting up python3-netplan (1.1.1-1~ubuntu24.04.1) ... 87Setting up ethtool (1:6.7-1build1) ... 88Setting up systemd (255.4-1ubuntu8.5) ... 89/usr/lib/tmpfiles.d/static-nodes-permissions.conf:18: Failed to resolve group \u0026#39;k 90vm\u0026#39;: No such process 91/usr/lib/tmpfiles.d/static-nodes-permissions.conf:19: Failed to resolve group \u0026#39;k 92vm\u0026#39;: No such process 93/usr/lib/tmpfiles.d/static-nodes-permissions.conf:20: Failed to resolve group \u0026#39;k 94vm\u0026#39;: No such process 95Setting up systemd-timesyncd (255.4-1ubuntu8.5) ... 96Setting up udev (255.4-1ubuntu8.5) ... 97Creating group \u0026#39;input\u0026#39; with GID 994. 98Creating group \u0026#39;sgx\u0026#39; with GID 993. 99Creating group \u0026#39;kvm\u0026#39; with GID 992. 100Creating group \u0026#39;render\u0026#39; with GID 991. 101systemd-udevd.service is a disabled or a static unit, not starting it. 102Setting up systemd-hwe-hwdb (255.1.4) ... 103Setting up netplan-generator (1.1.1-1~ubuntu24.04.1) ... 104Removing \u0026#39;diversion of /lib/systemd/system-generators/netplan to /lib/systemd/sy 105stem-generators/netplan.usr-is-merged by netplan-generator\u0026#39; 106Setting up systemd-resolved (255.4-1ubuntu8.5) ... 107Setting up systemd-sysv (255.4-1ubuntu8.5) ... 108Setting up libnss-systemd:amd64 (255.4-1ubuntu8.5) ... 109Setting up netplan.io (1.1.1-1~ubuntu24.04.1) ... 110Setting up libpam-systemd:amd64 (255.4-1ubuntu8.5) ... 111Processing triggers for dbus (1.14.10-4ubuntu4.1) ... 112Processing triggers for libc-bin (2.39-0ubuntu8.3) ... Links ubuntuusers - phased update Historie 2025-02-08: Erste Version ","link":"https://uli.heller.cool/blog/2025-02-08_ubuntu-phasing/","section":"blog","tags":["linux","ubuntu"],"title":"Ubuntu: Ausroll-Phasen"},{"body":"","link":"https://uli.heller.cool/tags/network/","section":"tags","tags":null,"title":"Network"},{"body":"","link":"https://uli.heller.cool/categories/netzwerk/","section":"categories","tags":null,"title":"Netzwerk"},{"body":" Das Programm HTTPTAP scheint es auf sehr einfache Art und Weise zu ermöglichen, den HTTP/HTTPS-Verkehr zu protokollieren. Ein Testbericht!\nVorabtest: Release herunterladen und auf Viren prüfen httptap_linux_x86_64.tar.gz herunterladen Hochladen nach VirusTotal.com Prüfergebnis: OK Quellen clonen 1git clone git@github.com:monasticacademy/httptap.git 2cd httptap Bauen 1make 2# httptap Test 1$ ./httptap --help 2Usage: httptap [--verbose] [--no-new-user-namespace] [--stderr] [--tun TUN] [--subnet SUBNET] [--gateway GATEWAY] [--webui WEBUI] [--user USER 3] [--no-overlay] [--stack STACK] [--dump-tcp] [--dump-har DUMP-HAR] [--http HTTP] [--https HTTPS] [--head] [--body] [COMMAND [COMMAND ...]] 4 5Positional arguments: 6 COMMAND 7 8Options: 9 --verbose, -v [env: HTTPTAP_VERBOSE] 10 --no-new-user-namespace 11 do not create a new user namespace (must be run as root) [env: HTTPTAP_NO_NEW_USER_NAMESPACE] 12 --stderr log to standard error (default is standard out) [env: HTTPTAP_LOG_TO_STDERR] 13 --tun TUN name of the TUN device that will be created [default: httptap] 14 --subnet SUBNET IP address of the network interface that the subprocess will see [default: 10.1.1.100/24] 15 --gateway GATEWAY IP address of the gateway that intercepts and proxies network packets [default: 10.1.1.1] 16 --webui WEBUI address and port to serve API on [env: HTTPTAP_WEB_UI] 17 --user USER run command as this user (username or id) 18 --no-overlay do not mount any overlay filesystems [env: HTTPTAP_NO_OVERLAY] 19 --stack STACK which tcp implementation to use: \u0026#39;gvisor\u0026#39; or \u0026#39;homegrown\u0026#39; [default: gvisor, env: HTTPTAP_STACK] 20 --dump-tcp dump all TCP packets sent and received to standard out [env: HTTPTAP_DUMP_TCP] 21 --dump-har DUMP-HAR path to dump HAR capture to [env: HTTPTAP_DUMP_HAR] 22 --http HTTP list of TCP ports to intercept HTTPS traffic on [default: [80]] 23 --https HTTPS list of TCP ports to intercept HTTP traffic on [default: [443]] 24 --head whether to include HTTP headers in terminal output 25 --body whether to include HTTP payloads in terminal output 26 --help, -h display this help and exit 27 28$ ./httptap -- firefox 29... 30error reading http request over tls server conn: remote error: tls: unknown certificate authority, aborting 31error reading http request over tls server conn: remote error: tls: bad certificate, aborting 32---\u0026gt; GET https://detectportal.firefox.com/canonical.html 33\u0026lt;--- 200 https://detectportal.firefox.com/canonical.html (90 bytes) 34error reading http request over tls server conn: remote error: tls: bad certificate, aborting 35error reading http request over tls server conn: remote error: tls: bad certificate, aborting 36---\u0026gt; GET https://detectportal.firefox.com/success.txt?ipv4 37\u0026lt;--- 200 https://detectportal.firefox.com/success.txt?ipv4 (8 bytes) 38error reading http request over tls server conn: remote error: tls: bad certificate, aborting 39... Fazit Es klappt nicht so richtig, weil der Browser der CA von HTTPTAP nicht vertraut! Eigentlich klar! Trotzdem schade ...oder auch beruhigend!\nLinks Github - httptap Historie 2025-02-07: Erste Version ","link":"https://uli.heller.cool/blog/2025-02-07_httptap/","section":"blog","tags":["network","linux","ubuntu"],"title":"Protokollieren von HTTP/HTTPS-Anfragen und -Antworten"},{"body":" Ich möchte ausprobieren, ob \u0026quot;podman compose\u0026quot; grundsätzlich funktioniert und ob man dabei ohne \u0026quot;root\u0026quot; klarkommt.\nAusgangspunkt Container mit Podman, bspw.\nLXC/LXD: Podman im Container mit Ubuntu-24.04 Sichten von Github: podman-compose.\n\u0026quot;podman-compose\u0026quot; einspielen Vorgefertigtes Paket 1lxc exec podman apt install podman-compose Damit wird Version 1.0.6-1 eingespielt.\nManuell Die manuelle Installation verwende ich vorerst nicht!\nHerunterladen: podman-compose-1.3.0.tar.gz Virencheck via Virustotal: OK LXC-Container starten: lxc start podman \u0026quot;podman-compose\u0026quot; in LXC-Container kopieren: Entweder: scp podman-compose-1.3.0.tar.gz ubuntu@podman.lxd: Oder: lxc exec podman --user 1000 --group 1000 --cwd /home/ubuntu tee podman-compose-1.3.0.tar.gz \u0026gt;/dev/null \u0026lt;podman-compose-1.3.0.tar.gz Auspacken: 1uheller:~$ lxc exec podman -- sudo -u ubuntu -i 2 3ubuntu@podman:~$ gzip -cd podman-compose-1.3.0.tar.gz|tar xf - podman-compose-1.3.0/podman_compose.py 4ubuntu@podman:~$ mkdir -p ~/.local/bin 5ubuntu@podman:~$ mv podman-compose-1.3.0/podman_compose.py ~/.local/bin 6ubuntu@podman:~$ ln -s podman_compose.py ~/.local/bin/podman-compose 7ubuntu@podman:~$ rm -rf podman-compose-1.3.0 8ubuntu@podman:~$ .local/bin/podman-compose --version 9podman-compose version 1.3.0 10podman version 4.9.3 Versionstest 1ubuntu@podman:~/compose-demo$ podman-compose --version 2podman-compose version: 1.0.6 3[\u0026#39;podman\u0026#39;, \u0026#39;--version\u0026#39;, \u0026#39;\u0026#39;] 4using podman version: 4.9.3 5podman-compose version 1.0.6 6podman --version 7podman version 4.9.3 8exit code: 0 Kurztest Übernommen aus daemons-point.com: Docker mit docker-compose in LXD/LXC-Container und DigitalOcean: How To Install and Use Docker Compose on Ubuntu 20.04.\nProjektverzeichnis anlegen 1ubuntu@podman:~$ mkdir -p compose-demo/app compose-demo/app/index.html 1\u0026lt;!doctype html\u0026gt; 2\u0026lt;html lang=\u0026#34;en\u0026#34;\u0026gt; 3\u0026lt;head\u0026gt; 4 \u0026lt;meta charset=\u0026#34;utf-8\u0026#34;\u0026gt; 5 \u0026lt;title\u0026gt;Docker Compose Demo\u0026lt;/title\u0026gt; 6 \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/dark.min.css\u0026#34;\u0026gt; 7\u0026lt;/head\u0026gt; 8\u0026lt;body\u0026gt; 9 10 \u0026lt;h1\u0026gt;This is a Docker Compose Demo Page.\u0026lt;/h1\u0026gt; 11 \u0026lt;p\u0026gt;This content is being served by an Nginx container.\u0026lt;/p\u0026gt; 12 13\u0026lt;/body\u0026gt; 14\u0026lt;/html\u0026gt; compose-demo/docker-compose.yml 1version: \u0026#39;3.7\u0026#39; 2services: 3 web: 4 image: docker.io/library/nginx:alpine 5 ports: 6 - \u0026#34;8000:80\u0026#34; 7 volumes: 8 - ./app:/usr/share/nginx/html Ausführen 1ubuntu@podman:~$ cd compose-demo/ 2ubuntu@podman:~/compose-demo $ podman-compose up -d 3podman-compose version: 1.0.6 4[\u0026#39;podman\u0026#39;, \u0026#39;--version\u0026#39;, \u0026#39;\u0026#39;] 5using podman version: 4.9.3 6** excluding: set() 7[\u0026#39;podman\u0026#39;, \u0026#39;ps\u0026#39;, \u0026#39;--filter\u0026#39;, \u0026#39;label=io.podman.compose.project=compose-demo\u0026#39;, \u0026#39;-a\u0026#39;, \u0026#39;--format\u0026#39;, \u0026#39;{{ index .Labels \u0026#34;io.podman.compose.config-hash\u0026#34;}}\u0026#39;] 8[\u0026#39;podman\u0026#39;, \u0026#39;network\u0026#39;, \u0026#39;exists\u0026#39;, \u0026#39;compose-demo_default\u0026#39;] 9podman run --name=compose-demo_web_1 -d --label io.podman.compose.config-hash=be7ff51131af7f196fd632cfa16569e788b3c2d559bfd96addb9f1eb5ef8eb69 --label io.podman.compose.project=compose-demo --label io.podman.compose.version=1.0.6 --label PODMAN_SYSTEMD_UNIT=podman-compose@compose-demo.service --label com.docker.compose.project=compose-demo --label com.docker.compose.project.working_dir=/home/ubuntu/compose-demo --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=web -v /home/ubuntu/compose-demo/app:/usr/share/nginx/html --net compose-demo_default --network-alias web -p 8000:80 docker.io/library/nginx:alpine 10Trying to pull docker.io/library/nginx:alpine... 11Getting image source signatures 12Copying blob 5d777e0071f6 done | 13Copying blob e0350d1fd4dd done | 14Copying blob dbcfe8732ee6 done | 15Copying blob 37d775ecfbb9 done | 16Copying blob 66a3d608f3fa done | 17Copying blob 58290db888fa done | 18Copying blob 1f4aa363b71a done | 19Copying blob e74fff0a393a done | 20Copying config 93f9c72967 done | 21Writing manifest to image destination 22878f64eb0be7bdc1c9aaa8f45d199faecb4a2684fbad67c09e89c9f41e694c30 23exit code: 0 24 25ubuntu@podman:~/compose-demo$ podman compose ps 26[\u0026#39;podman\u0026#39;, \u0026#39;--version\u0026#39;, \u0026#39;\u0026#39;] 27using podman version: 4.9.3 28podman ps -a --filter label=io.podman.compose.project=compose-demo 29CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 30878f64eb0be7 docker.io/library/nginx:alpine nginx -g daemon o... 3 minutes ago Up 3 minutes 0.0.0.0:8000-\u0026gt;80/tcp compose-demo_web_1 31exit code: 0 Test mit Browser Testseite - http://podman.lxd:8000\nProbleme Error: short-name \u0026quot;nginx:alpine\u0026quot; did not resolve Fehlermeldung:\n1ubuntu@podman:~/compose-demo$ podman-compose up -d 2podman-compose version: 1.0.6 3[\u0026#39;podman\u0026#39;, \u0026#39;--version\u0026#39;, \u0026#39;\u0026#39;] 4using podman version: 4.9.3 5** excluding: set() 6[\u0026#39;podman\u0026#39;, \u0026#39;ps\u0026#39;, \u0026#39;--filter\u0026#39;, \u0026#39;label=io.podman.compose.project=compose-demo\u0026#39;, \u0026#39;-a\u0026#39;, \u0026#39;--format\u0026#39;, \u0026#39;{{ index .Labels \u0026#34;io.podman.compose.config-hash\u0026#34;}}\u0026#39;] 7[\u0026#39;podman\u0026#39;, \u0026#39;network\u0026#39;, \u0026#39;exists\u0026#39;, \u0026#39;compose-demo_default\u0026#39;] 8[\u0026#39;podman\u0026#39;, \u0026#39;network\u0026#39;, \u0026#39;create\u0026#39;, \u0026#39;--label\u0026#39;, \u0026#39;io.podman.compose.project=compose-demo\u0026#39;, \u0026#39;--label\u0026#39;, \u0026#39;com.docker.compose.project=compose-demo\u0026#39;, \u0026#39;compose-demo_default\u0026#39;] 9[\u0026#39;podman\u0026#39;, \u0026#39;network\u0026#39;, \u0026#39;exists\u0026#39;, \u0026#39;compose-demo_default\u0026#39;] 10podman run --name=compose-demo_web_1 -d --label io.podman.compose.config-hash=1267f1fcc2605edffffac19ad9686d7cb3f189e3f1fa80ccc2e27e3d4d8b2e66 --label io.podman.compose.project=compose-demo --label io.podman.compose.version=1.0.6 --label PODMAN_SYSTEMD_UNIT=podman-compose@compose-demo.service --label com.docker.compose.project=compose-demo --label com.docker.compose.project.working_dir=/home/ubuntu/compose-demo --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=web -v /home/ubuntu/compose-demo/app:/usr/share/nginx/html --net compose-demo_default --network-alias web -p 8000:80 nginx:alpine 11Error: short-name \u0026#34;nginx:alpine\u0026#34; did not resolve to an alias and no unqualified-search registries are defined in \u0026#34;/etc/containers/registries.conf\u0026#34; 12exit code: 125 13podman start compose-demo_web_1 14Error: no container with name or ID \u0026#34;compose-demo_web_1\u0026#34; found: no such container 15exit code: 125 Korrektur:\n1--- docker-compose.yml.orig\t2025-02-02 11:20:35.377085085 +0100 2+++ docker-compose.yml\t2025-02-02 11:18:51.776290702 +0100 3@@ -1,7 +1,7 @@ 4 version: \u0026#39;3.7\u0026#39; 5 services: 6 web: 7- image: nginx:alpine 8+ image: docker.io/library/nginx:alpine 9 ports: 10 - \u0026#34;8000:80\u0026#34; 11 volumes: Versionen Getestet unter Ubuntu 22.04 mit LXD-6.2-bde4d03 (Snap-Version) Getestet mit einem Ubuntu-24.04-Container und podman-4.9.3+ds1-1ubuntu0.2 und podman-compose-1.0.6-1 Links LXC/LXD: Podman im Container mit Ubuntu-24.04 daemons-point.com - Docker in LXD/LXC-Container daemons-point.com: Docker mit docker-compose in LXD/LXC-Container DigitalOcean: How To Install and Use Docker Compose on Ubuntu 20.04 Historie 2025-02-06: Erste Version ","link":"https://uli.heller.cool/blog/2025-02-06_podman-compose/","section":"blog","tags":["lxc","lxd","docker","podman","linux","ubuntu"],"title":"LXC/LXD: Podman Compose"},{"body":" Ich experimentiere mit dem Docker-Ersatz \u0026quot;podman\u0026quot; in meinen Containern und schaue, was beim Einsatz ohne \u0026quot;root\u0026quot; so geht. Idealerweise ist's damit schwieriger Systemlücken auszunutzen.\nAusgangspunkt Container mit Podman, bspw.\nLXC/LXD: Podman im Container mit Ubuntu-24.04 LXC/LXD: Podman im Container mit Ubuntu-22.04 Kurztest LXC-Container starten: lxc start podman Im LXC-Container anmelden als \u0026quot;Nicht-Root\u0026quot;: ssh ubuntu@podman.lxd Test: 1ubuntu@podman:~$ podman run hello-world 2Resolved \u0026#34;hello-world\u0026#34; as an alias (/etc/containers/registries.conf.d/shortnames.conf) 3Trying to pull docker.io/library/hello-world:latest... 4Getting image source signatures 5... 6Hello from Docker! 7... Klappt! Super! Bind-Mount-Lücke Ich versuche, im LXC-Container einen Podman/Docker-Container zu starten mit Zugriff auf Teile des Dateisystems vom LXC-Container. Genauer soll der Podman/Docker-Container auf das Verzeichnis \u0026quot;/etc\u0026quot; zugreifen können.\nMit Docker klappt das problemlos. Der Docker-Container kann \u0026quot;/etc\u0026quot; vom LXC-Container \u0026quot;sehen\u0026quot; und auch modifizieren. Hoffentlich geht es mit Podman \u0026quot;besser\u0026quot; im Sinne: Modifizieren klappt nicht!\nInnerhalb des LXC-Containers:\n1ubuntu@podman:~$ podman run --volume /etc:/mnt -it ubuntu bash 2... 3root@3a9222cb719b:/# ls -l /mnt/passwd 4-rw-r--r-- 1 nobody nogroup 1193 Nov 15 14:11 /mnt/passwd 5 6root@2d5e5e8aaaea:/# touch /mnt/uli-war-da 7touch: cannot touch \u0026#39;/mnt/uli-war-da\u0026#39;: Permission denied 8 9root@3a9222cb719b:/# cat /mnt/shadow 10cat: /mnt/shadow: Permission denied 11 12root@3a9222cb719b:/# cat /mnt/shadow- 13cat: /mnt/shadow-: Permission denied Sieht ziemlich perfekt aus. \u0026quot;root\u0026quot; innerhalb vom Podman/Docker-Container hat gleiche/ähnliche Rechte wie \u0026quot;ubuntu\u0026quot; im LXC-Container!\nTests mit anderen Varianten LXC-Container: Ubuntu-24.04, Podman -\u0026gt; Rechte eingeschränkt LXC-Container: Ubuntu-22.04, Podman -\u0026gt; Rechte eingeschränkt LXC-Container: Ubuntu-24.04, Docker -\u0026gt; Rechte nicht eingeschränkt LXC-Container: Ubuntu-22.04, Docker -\u0026gt; Rechte nicht eingeschränkt Damit Docker im LXC-Container unter dem Benutzer \u0026quot;ubuntu\u0026quot; ausgeführt werden kann, muß dieser der Gruppe \u0026quot;docker\u0026quot; hinzugefügt werden:\n1root@docker-2204:~# usermod -aG docker ubuntu Eventuell hilft \u0026quot;rootless docker\u0026quot; etwas. Das habe ich (noch) nicht untersucht!\nProbleme Ubuntu-20.04: \u0026quot;newuidmap: write to uid_map failed\u0026quot; Ich habe PODMAN auch getestet auf einem Rechner mit Ubuntu-20.04, dabei gibt es Probleme.\n/etc/lsb-release:\n1DISTRIB_ID=Ubuntu 2DISTRIB_RELEASE=20.04 3DISTRIB_CODENAME=focal 4DISTRIB_DESCRIPTION=\u0026#34;Ubuntu 20.04.6 LTS\u0026#34; Sonstige Versionen:\n1ubuntu-20.04:~ # uname -r 25.15.0-131-generic 3 4ubuntu-20.04:~ # lxc version 5Client version: 6.2 6Server version: 6.2 7 8ubuntu-20.04:~ # snap list lxd 9Name Version Rev Tracking Publisher Notes 10lxd 6.2-bde4d03 31820 latest/stable canonical✓ - Damit:\n1ubuntu-20.04:~ # lxc copy ubuntu-2404 podman-2404 2ubuntu-20.04:~ # lxc config set podman-2404 security.idmap.size=700000 security.nesting=true security.syscalls.intercept.mknod=true security.syscalls.intercept.setxattr=true 3ubuntu-20.04:~ # lxc start podman-2404 4ubuntu-20.04:~ # lxc ls podman-2404 5+-------------+---------+---------------------+------+-----------+-----------+ 6| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | 7+-------------+---------+---------------------+------+-----------+-----------+ 8| podman-2404 | RUNNING | 10.38.131.38 (eth0) | | CONTAINER | 0 | 9+-------------+---------+---------------------+------+-----------+-----------+ 10ubuntu-20.04:~ # lxc exec podman-2404 bash 11 12root@podman-2404:~# apt install -y podman 13Reading package lists... Done 14Building dependency tree... Done 15Reading state information... Done 16The following package was automatically installed and is no longer required: 17 libfuse2t64 18Use \u0026#39;apt autoremove\u0026#39; to remove it. 19The following additional packages will be installed: 20... 21 22root@podman-2404:~# podman run hello-world 23Resolved \u0026#34;hello-world\u0026#34; as an alias (/etc/containers/registries.conf.d/shortnames.conf) 24Trying to pull docker.io/library/hello-world:latest... 25Getting image source signatures 26Copying blob e6590344b1a5 done | 27Copying config 74cc54e27d done | 28Writing manifest to image destination 29 30Hello from Docker! 31... 32 33root@podman-2404:~# exit 34ubuntu-20.04:~ # ssh ubuntu@podman-2404.lxd 35 36ubuntu@podman-2404:~$ podman run hello-world 37ERRO[0000] running `/usr/bin/newuidmap 508 0 1000 1 1 100000 65536`: newuidmap: write to uid_map failed: Operation not permitted 38Error: cannot set up namespace using \u0026#34;/usr/bin/newuidmap\u0026#34;: exit status 1 Umstellung auf \u0026quot;cgroups v2\u0026quot; bringt keine Besserung!\nLösung: Unable to run rootless docker/podman under a (rootless) LXD container\nIm Podman-Container: cat /proc/self/uid_map -\u0026gt; nur 65536 UIDs sind möglich Host-Rechner: lxc config set podman-2404 security.idmap.size=700000 lxc stop podman-2404 lxc start podman-2404 Danach klappt es! Versionen Getestet unter Ubuntu 22.04 mit LXD-6.2-bde4d03 (Snap-Version) Getestet mit Ubuntu-24.04 und Ubuntu-22.04-Containern jeweils mit Docker und Podman Links LXC/LXD: Podman im Container mit Ubuntu-24.04 LXC/LXD: Podman im Container mit Ubuntu-22.04 Github - Ubuntu 24.04 AppArmor breaks pivot_root inside LXD containers daemons-point.com - Docker in LXD/LXC-Container linuxcontainers.org - Unable to run rootless docker/podman under a (rootless) LXD container Historie 2025-02-10: Problemlösung, security.idmap.size=700000 2025-02-08: Korrektur des Formatierungsproblems, Problem mit 20.04 2025-02-05: Erste Version ","link":"https://uli.heller.cool/blog/2025-02-05_podman-ohne-root/","section":"blog","tags":["lxc","lxd","docker","podman","linux","ubuntu"],"title":"LXC/LXD: Podman ohne \"root\""},{"body":" Wenn man sich für OpenSource-Software interessiert, kommt man heutzutage fast nicht an Docker vorbei. Zahlreiche Programme werden als Docker-Container angeboten und können so sehr einfach getestet werden.\nProblem: Die Kombination aus Dockerfile und Image trennt den Arbeitsplatzrechner nur sehr ungenügend von der Fremdsoftware. Ohne detaillierte Prüfung kann ich nicht sicher sein, dass mein Rechner nicht kompromittiert wird.\nAbhilfe: Docker im LXC/LXD-Container!\nContainer anlegen 1$ lxc copy ubuntu-2404 docker Container konfigurieren 1$ lxc config set docker \\ 2 security.idmap.size=700000 \\ 3 security.nesting=true \\ 4 security.syscalls.intercept.mknod=true \\ 5 security.syscalls.intercept.setxattr=true Container starten 1$ lxc start docker 2$ lxc ls docker 3+--------+---------+----------------------+------+-----------+-----------+ 4| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | 5+--------+---------+----------------------+------+-----------+-----------+ 6| docker | RUNNING | 10.38.231.226 (eth0) | | CONTAINER | 0 | 7+--------+---------+----------------------+------+-----------+-----------+ Docker im Container installieren 1$ lxc exec docker bash 2 3root@docker:~# apt update 4Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease 5Get:2 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB] 6Get:3 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB] 7... 8Building dependency tree... Done 9Reading state information... Done 1042 packages can be upgraded. Run \u0026#39;apt list --upgradable\u0026#39; to see them. 11 12root@docker:~# apt upgrade -y 13... 14Setting up netplan.io (1.1.1-1~ubuntu24.04.1) ... 15Setting up ssh-import-id (5.11-0ubuntu2.24.04.1) ... 16Processing triggers for systemd (255.4-1ubuntu8.4) ... 17Processing triggers for dbus (1.14.10-4ubuntu4.1) ... 18Processing triggers for libc-bin (2.39-0ubuntu8.3) ... 19 20root@docker:~# apt install docker.io -y 21... Kurztest 1root@docker:~# docker run hello-world 2Unable to find image \u0026#39;hello-world:latest\u0026#39; locally 3latest: Pulling from library/hello-world 4e6590344b1a5: Pull complete 5Digest: sha256:d715f14f9eca81473d9112df50457893aa4d099adeb4729f679006bf5ea12407 6Status: Downloaded newer image for hello-world:latest 7 8Hello from Docker! 9This message shows that your installation appears to be working correctly. 10 11To generate this message, Docker took the following steps: 12 1. The Docker client contacted the Docker daemon. 13 2. The Docker daemon pulled the \u0026#34;hello-world\u0026#34; image from the Docker Hub. 14 (amd64) 15 3. The Docker daemon created a new container from that image which runs the 16 executable that produces the output you are currently reading. 17 4. The Docker daemon streamed that output to the Docker client, which sent it 18 to your terminal. 19 20To try something more ambitious, you can run an Ubuntu container with: 21 $ docker run -it ubuntu bash 22... Probleme error jailing process inside rootfs: pivot_root .: permission denied Ausführen des Kurztests scheitert mit obiger Meldung:\n1root@docker:~# docker run hello-world 2Unable to find image \u0026#39;hello-world:latest\u0026#39; locally 3latest: Pulling from library/hello-world 4e6590344b1a5: Pull complete 5Digest: sha256:d715f14f9eca81473d9112df50457893aa4d099adeb4729f679006bf5ea12407 6Status: Downloaded newer image for hello-world:latest 7docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error jailing process inside rootfs: pivot_root .: permission denied: unknown. Zur Korrektur im Container dies ausführen:\n1root@docker:~# ln -s /etc/apparmor.d/runc /etc/apparmor.d/disable/ 2root@docker:~# apparmor_parser -R /etc/apparmor.d/runc Danach klappt's:\n1root@docker:~# docker run hello-world 2 3Hello from Docker! 4This message shows that your installation appears to be working correctly. 5 6To generate this message, Docker took the following steps: 7 1. The Docker client contacted the Docker daemon. 8 2. The Docker daemon pulled the \u0026#34;hello-world\u0026#34; image from the Docker Hub. 9 (amd64) 10... Nachtrag 2025-11-16: Abklemmen von AppArmor im Container ist nicht mehr notwendig!\nVersionen Getestet unter Ubuntu 22.04 mit LXD-6.2-bde4d03 (Snap-Version) Getestet mit einem Ubuntu 24.04 Container und docker.io 26.1.3-0ubuntu1~24.04.1 Links Github - Ubuntu 24.04 AppArmor breaks pivot_root inside LXD containers daemons-point.com - Docker in LXD/LXC-Container Historie 2025-11-16: AppArmor im Container kann aktiviert bleiben 2025-02-10: security.idmap.size=700000 2025-02-04: Erste Version ","link":"https://uli.heller.cool/blog/2025-02-04_lxc-docker-2404/","section":"blog","tags":["lxc","lxd","docker","linux","ubuntu"],"title":"LXC/LXD: Docker im Ubuntu-24.04-Container"},{"body":" Podman soll ziemlich ähnlich funktionieren wie Docker. Also schnell mal austesten in einem LXC-Container mit mit Ubuntu-22.04!\nContainer anlegen 1$ lxc copy ubuntu-2204 podman-2204 Container konfigurieren 1$ lxc config set podman-2204 \\ 2 security.idmap.size=700000 \\ 3 security.nesting=true \\ 4 security.syscalls.intercept.mknod=true \\ 5 security.syscalls.intercept.setxattr=true Container starten 1$ lxc start podman-2204 2$ lxc ls podman-2204 3+-------------+---------+----------------------+------+-----------+-----------+ 4| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | 5+-------------+---------+----------------------+------+-----------+-----------+ 6| podman-2204 | RUNNING | 10.38.231.205 (eth0) | | CONTAINER | 0 | 7+-------------+---------+----------------------+------+-----------+-----------+ Podman im Container installieren 1$ lxc exec podman-2204 bash 2 3root@podman-2204:~# apt update 4Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease 5Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [126 kB] 6Get:3 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [126 kB] 7... 8Building dependency tree... Done 9Reading state information... Done 10 11root@podman-2204:~# apt upgrade -y 12... 13 14root@podman-2204:~# apt install podman -y 15... Kurztest 1root@podman-2204:~# podman run hello-world 2Unable to find image \u0026#39;hello-world:latest\u0026#39; locally 3latest: Pulling from library/hello-world 4e6590344b1a5: Pull complete 5Digest: sha256:d715f14f9eca81473d9112df50457893aa4d099adeb4729f679006bf5ea12407 6Status: Downloaded newer image for hello-world:latest 7 8Hello from Docker! 9This message shows that your installation appears to be working correctly. 10 11To generate this message, Docker took the following steps: 12 1. The Docker client contacted the Docker daemon. 13 2. The Docker daemon pulled the \u0026#34;hello-world\u0026#34; image from the Docker Hub. 14 (amd64) 15 3. The Docker daemon created a new container from that image which runs the 16 executable that produces the output you are currently reading. 17 4. The Docker daemon streamed that output to the Docker client, which sent it 18 to your terminal. 19 20To try something more ambitious, you can run an Ubuntu container with: 21 $ docker run -it ubuntu bash 22... Versionen Getestet unter Ubuntu 22.04 mit LXD-6.2-bde4d03 (Snap-Version) Getestet mit einem Ubuntu 22.04 Container und podman 3.4.4+ds1-1ubuntu1.22.04.3 Links Github - Ubuntu 24.04 AppArmor breaks pivot_root inside LXD containers daemons-point.com - Docker in LXD/LXC-Container Historie 2025-02-10: security.idmap.size=700000 2025-02-03: Erste Version ","link":"https://uli.heller.cool/blog/2025-02-03_lxc-podman-2204/","section":"blog","tags":["lxc","lxd","docker","podman","linux","ubuntu"],"title":"LXC/LXD: Podman im Container mit Ubuntu-22.04"},{"body":" Mit einem Container mit Ubuntu-22.04 ist vieles leichter als mit 24.04!\nContainer anlegen 1$ lxc copy ubuntu-2204 docker-2204 Container konfigurieren 1$ lxc config set docker-2204 \\ 2 security.idmap.size=700000 \\ 3 security.nesting=true \\ 4 security.syscalls.intercept.mknod=true \\ 5 security.syscalls.intercept.setxattr=true Container starten 1$ lxc start docker-2204 2$ lxc ls docker-2204 3+-------------+---------+----------------------+------+-----------+-----------+ 4| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | 5+-------------+---------+----------------------+------+-----------+-----------+ 6| docker-2204 | RUNNING | 10.38.231.163 (eth0) | | CONTAINER | 0 | 7+-------------+---------+----------------------+------+-----------+-----------+ Docker im Container installieren 1$ lxc exec docker-2204 bash 2 3root@docker-2204:~# apt update 4Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease 5Get:2 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB] 6Get:3 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB] 7... 8Building dependency tree... Done 9Reading state information... Done 10 11root@docker-2204:~# apt upgrade -y 12... 13 14root@docker-2204:~# apt install docker.io -y 15... Kurztest 1root@docker-2204:~# docker run hello-world 2Unable to find image \u0026#39;hello-world:latest\u0026#39; locally 3latest: Pulling from library/hello-world 4e6590344b1a5: Pull complete 5Digest: sha256:d715f14f9eca81473d9112df50457893aa4d099adeb4729f679006bf5ea12407 6Status: Downloaded newer image for hello-world:latest 7 8Hello from Docker! 9This message shows that your installation appears to be working correctly. 10 11To generate this message, Docker took the following steps: 12 1. The Docker client contacted the Docker daemon. 13 2. The Docker daemon pulled the \u0026#34;hello-world\u0026#34; image from the Docker Hub. 14 (amd64) 15 3. The Docker daemon created a new container from that image which runs the 16 executable that produces the output you are currently reading. 17 4. The Docker daemon streamed that output to the Docker client, which sent it 18 to your terminal. 19 20To try something more ambitious, you can run an Ubuntu container with: 21 $ docker run -it ubuntu bash 22... Versionen Getestet unter Ubuntu 22.04 mit LXD-6.2-bde4d03 (Snap-Version) Getestet mit einem Ubuntu 22.04 Container und docker.io 26.1.3-0ubuntu1~22.04.1 Links Github - Ubuntu 24.04 AppArmor breaks pivot_root inside LXD containers daemons-point.com - Docker in LXD/LXC-Container Historie 2025-02-10: security.idmap.size=700000 2025-02-02: Erste Version ","link":"https://uli.heller.cool/blog/2025-02-02_lxc-docker-2204/","section":"blog","tags":["lxc","lxd","docker","linux","ubuntu"],"title":"LXC/LXD: Docker im Container mit Ubuntu-22.04"},{"body":" Podman soll ziemlich ähnlich funktionieren wie Docker. Also schnell mal austesten in einem LXC-Container mit mit Ubuntu-22.04!\nContainer anlegen 1$ lxc copy ubuntu-2404 podman Container konfigurieren 1$ lxc config set podman \\ 2 security.idmap.size=700000 \\ 3 security.nesting=true \\ 4 security.syscalls.intercept.mknod=true \\ 5 security.syscalls.intercept.setxattr=true Container starten 1$ lxc start podman 2$ lxc ls podman 3+-------------+---------+---------------------+------+-----------+-----------+ 4| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | 5+-------------+---------+---------------------+------+-----------+-----------+ 6| podman | RUNNING | 10.38.231.76 (eth0) | | CONTAINER | 0 | 7+-------------+---------+---------------------+------+-----------+-----------+ Podman im Container installieren 1$ lxc exec podman bash 2 3root@podman:~# apt update 4Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease 5Get:2 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB] 6Get:3 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB] 7... 8Building dependency tree... Done 9Reading state information... Done 10 11root@podman:~# apt upgrade -y 12... 13 14root@podman:~# apt install podman -y 15... Kurztest 1root@podman:~# podman run hello-world 2Unable to find image \u0026#39;hello-world:latest\u0026#39; locally 3latest: Pulling from library/hello-world 4e6590344b1a5: Pull complete 5Digest: sha256:d715f14f9eca81473d9112df50457893aa4d099adeb4729f679006bf5ea12407 6Status: Downloaded newer image for hello-world:latest 7 8Hello from Docker! 9This message shows that your installation appears to be working correctly. 10 11To generate this message, Docker took the following steps: 12 1. The Docker client contacted the Docker daemon. 13 2. The Docker daemon pulled the \u0026#34;hello-world\u0026#34; image from the Docker Hub. 14 (amd64) 15 3. The Docker daemon created a new container from that image which runs the 16 executable that produces the output you are currently reading. 17 4. The Docker daemon streamed that output to the Docker client, which sent it 18 to your terminal. 19 20To try something more ambitious, you can run an Ubuntu container with: 21 $ docker run -it ubuntu bash 22... Podman läuft in einem Ubuntu-24.04-Container wesentlich problemloser als Docker! Für Docker müssen Anpassungen bzgl. AppArmor vorgenommen werden, für Podman nicht!\nVersionen Getestet unter Ubuntu 22.04 mit LXD-6.2-bde4d03 (Snap-Version) Getestet mit einem Ubuntu 24.04 Container und podman 4.9.3+ds1-1ubuntu0.2 Links Github - Ubuntu 24.04 AppArmor breaks pivot_root inside LXD containers daemons-point.com - Docker in LXD/LXC-Container Historie 2025-02-10: security.idmap.size=700000 2025-02-01: Erste Version ","link":"https://uli.heller.cool/blog/2025-02-01_lxc-podman-2404/","section":"blog","tags":["lxc","lxd","docker","podman","linux","ubuntu"],"title":"LXC/LXD: Podman im Container mit Ubuntu-24.04"},{"body":"","link":"https://uli.heller.cool/tags/cdxgen/","section":"tags","tags":null,"title":"Cdxgen"},{"body":"","link":"https://uli.heller.cool/tags/container/","section":"tags","tags":null,"title":"Container"},{"body":" Für Kundenprojekte verwende ich häufig Container-Images als Ergebnis der CICD-Pipeline. Diese werden dann in einer Cloud-Umgebung eingespielt.\nWir erstellen für die Container-Images SBOMs. Diese sind im JSON-Format. Für Auswertungen möchte ich sie als CSV-Datei bereitstellen und danach in eine Datenbank importieren.\nSPDX-Format Wandlung nach CSV spdx-2-csv.sh:\n1#!/bin/sh 2jq -r \u0026#39;[\u0026#34;type\u0026#34;,\u0026#34;group\u0026#34;, \u0026#34;name\u0026#34;, \u0026#34;version\u0026#34;], ( 3 .packages[] 4 | ( 5 [ 6 .primaryPackagePurpose, 7 ( 8 .name|split(\u0026#34;:\u0026#34;) as $splitted|($splitted[-2], $splitted[-1]) 9 ), .versionInfo 10 ] 11 ) 12 ) | @csv\u0026#39; Damit wird aus der SBOM im SPDX-JSON-Format diese CSV-Datei trivy-spdx-jib-sbom.csv:\n1\u0026#34;type\u0026#34;,\u0026#34;group\u0026#34;,\u0026#34;name\u0026#34;,\u0026#34;version\u0026#34; 2\u0026#34;CONTAINER\u0026#34;,,\u0026#34;build/jib-image.tar\u0026#34;, 3\u0026#34;LIBRARY\u0026#34;,,\u0026#34;adduser\u0026#34;,\u0026#34;3.137ubuntu1\u0026#34; 4\u0026#34;LIBRARY\u0026#34;,,\u0026#34;apt\u0026#34;,\u0026#34;2.7.14build2\u0026#34; 5\u0026#34;LIBRARY\u0026#34;,,\u0026#34;base-files\u0026#34;,\u0026#34;13ubuntu10.1\u0026#34; 6... 7\u0026#34;LIBRARY\u0026#34;,\u0026#34;ch.qos.logback\u0026#34;,\u0026#34;logback-classic\u0026#34;,\u0026#34;1.5.12\u0026#34; 8\u0026#34;LIBRARY\u0026#34;,\u0026#34;ch.qos.logback\u0026#34;,\u0026#34;logback-core\u0026#34;,\u0026#34;1.5.12\u0026#34; 9\u0026#34;LIBRARY\u0026#34;,\u0026#34;com.fasterxml.jackson.core\u0026#34;,\u0026#34;jackson-annotations\u0026#34;,\u0026#34;2.18.2\u0026#34; 10\u0026#34;LIBRARY\u0026#34;,\u0026#34;com.fasterxml.jackson.core\u0026#34;,\u0026#34;jackson-core\u0026#34;,\u0026#34;2.18.2\u0026#34; 11\u0026#34;LIBRARY\u0026#34;,\u0026#34;com.fasterxml.jackson.core\u0026#34;,\u0026#34;jackson-databind\u0026#34;,\u0026#34;2.18.2\u0026#34; 12... Schön wäre es, wenn man erkennen könnte, ob es sich jeweils um ein Betriebssystem-Paket oder um ein Java-Paket handelt. Falls eine Sicherheitslücke entdeckt wird, muß man bei Betriebsystem-Paketen das Basisimage aktualisieren. Bei Java-Paketen die Anwendung.\nIdee: \u0026quot;referenceLocator\u0026quot; könnte helfen!\n1 \u0026#34;externalRefs\u0026#34;: [ 2 { 3 \u0026#34;referenceCategory\u0026#34;: \u0026#34;PACKAGE-MANAGER\u0026#34;, 4 \u0026#34;referenceType\u0026#34;: \u0026#34;purl\u0026#34;, 5 \u0026#34;referenceLocator\u0026#34;: \u0026#34;pkg:deb/ubuntu/adduser@3.137ubuntu1?arch=all\\u0026distro=ubuntu-24.04\u0026#34; 6 } 7 ], 8... 9 \u0026#34;externalRefs\u0026#34;: [ 10 { 11 \u0026#34;referenceCategory\u0026#34;: \u0026#34;PACKAGE-MANAGER\u0026#34;, 12 \u0026#34;referenceType\u0026#34;: \u0026#34;purl\u0026#34;, 13 \u0026#34;referenceLocator\u0026#34;: \u0026#34;pkg:maven/org.springframework.boot/spring-boot@3.4.1\u0026#34; 14 } 15 ], Umsetzung mit JQ:\n1--- a/content/blog/2025-01-30_trivy-container-sbom/spdx-2-csv-2.sh 2+++ b/content/blog/2025-01-30_trivy-container-sbom/spdx-2-csv-2.sh 3@@ -1,9 +1,12 @@ 4 #!/bin/sh 5-jq -r \u0026#39;[\u0026#34;type\u0026#34;,\u0026#34;group\u0026#34;, \u0026#34;name\u0026#34;, \u0026#34;version\u0026#34;], ( 6+jq -r \u0026#39;[\u0026#34;type\u0026#34;,\u0026#34;ref\u0026#34;,\u0026#34;group\u0026#34;, \u0026#34;name\u0026#34;, \u0026#34;version\u0026#34;], ( 7 .packages[] 8 | ( 9 [ 10 .primaryPackagePurpose, 11+ ( 12+ .externalRefs|..|.referenceLocator?|strings|split(\u0026#34;/\u0026#34;)[0] 13+ ), 14 ( 15 .name|split(\u0026#34;:\u0026#34;) as $splitted|($splitted[-2], $splitted[-1]) 16 ), .versionInfo Damit erhält man dann die CVS-Datei trivy-spdx-jib-sbom-2.csv:\n1type\u0026#34;,\u0026#34;ref\u0026#34;,\u0026#34;group\u0026#34;,\u0026#34;name\u0026#34;,\u0026#34;version\u0026#34; 2\u0026#34;CONTAINER\u0026#34;,,\u0026#34;build/jib-image.tar\u0026#34;, 3\u0026#34;LIBRARY\u0026#34;,\u0026#34;pkg:deb\u0026#34;,,\u0026#34;adduser\u0026#34;,\u0026#34;3.137ubuntu1\u0026#34; 4\u0026#34;LIBRARY\u0026#34;,\u0026#34;pkg:deb\u0026#34;,,\u0026#34;apt\u0026#34;,\u0026#34;2.7.14build2\u0026#34; 5\u0026#34;LIBRARY\u0026#34;,\u0026#34;pkg:deb\u0026#34;,,\u0026#34;base-files\u0026#34;,\u0026#34;13ubuntu10.1\u0026#34; 6... 7\u0026#34;LIBRARY\u0026#34;,\u0026#34;pkg:deb\u0026#34;,,\u0026#34;wget\u0026#34;,\u0026#34;1.21.4-1ubuntu4.1\u0026#34; 8\u0026#34;LIBRARY\u0026#34;,\u0026#34;pkg:deb\u0026#34;,,\u0026#34;zlib1g\u0026#34;,\u0026#34;1:1.3.dfsg-3.1ubuntu2.1\u0026#34; 9\u0026#34;OPERATING-SYSTEM\u0026#34;,,\u0026#34;ubuntu\u0026#34;,\u0026#34;24.04\u0026#34; CycloneDX-Format 1 \u0026#34;bom-ref\u0026#34;: \u0026#34;pkg:deb/ubuntu/adduser@3.137ubuntu1?arch=all\u0026amp;distro=ubuntu-24.04\u0026#34;, 2 \u0026#34;type\u0026#34;: \u0026#34;library\u0026#34;, 3 \u0026#34;supplier\u0026#34;: { 4 \u0026#34;name\u0026#34;: \u0026#34;Ubuntu Developers \u0026lt;ubuntu-devel-discuss@lists.ubuntu.com\u0026gt;\u0026#34; 5 }, 6 \u0026#34;name\u0026#34;: \u0026#34;adduser\u0026#34;, 7 \u0026#34;version\u0026#34;: \u0026#34;3.137ubuntu1\u0026#34;, Also: \u0026quot;bom-ref\u0026quot; verwenden!\nDazu muß die ursprüngliche Wandlung leider komplett umgestellt werden!\ncdx-2-csv.sh\n1#!/bin/sh 2jq -r \u0026#39;[ \u0026#34;type\u0026#34;, \u0026#34;group\u0026#34;, \u0026#34;name\u0026#34;, \u0026#34;version\u0026#34; ] as $cols | .components | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv\u0026#39; cdx-2-csv-2.sh\n1#!/bin/sh 2jq -r \u0026#39;[\u0026#34;type\u0026#34;,\u0026#34;ref\u0026#34;,\u0026#34;group\u0026#34;, \u0026#34;name\u0026#34;, \u0026#34;version\u0026#34;], ( 3 .components[] 4 | ( 5 [ 6 .type, 7 (.\u0026#34;bom-ref\u0026#34;|split(\u0026#34;/\u0026#34;)[0]), 8 .group, 9 .name, 10 .version 11 ] 12 ) 13 ) | @csv\u0026#39; Damit erhält man dann die CVS-Datei trivy-cdx-jib-sbom-2.csv:\n1.\u0026#34;type\u0026#34;,\u0026#34;ref\u0026#34;,\u0026#34;group\u0026#34;,\u0026#34;name\u0026#34;,\u0026#34;version\u0026#34; 2\u0026#34;operating-system\u0026#34;,\u0026#34;b085e671-e87c-4e93-977b-a6d88eae88ad\u0026#34;,,\u0026#34;ubuntu\u0026#34;,\u0026#34;24.04\u0026#34; 3\u0026#34;library\u0026#34;,\u0026#34;pkg:deb\u0026#34;,,\u0026#34;adduser\u0026#34;,\u0026#34;3.137ubuntu1\u0026#34; 4\u0026#34;library\u0026#34;,\u0026#34;pkg:deb\u0026#34;,,\u0026#34;apt\u0026#34;,\u0026#34;2.7.14build2\u0026#34; 5\u0026#34;library\u0026#34;,\u0026#34;pkg:deb\u0026#34;,,\u0026#34;base-files\u0026#34;,\u0026#34;13ubuntu10.1\u0026#34; 6... 7\u0026#34;library\u0026#34;,\u0026#34;pkg:maven\u0026#34;,\u0026#34;org.springframework\u0026#34;,\u0026#34;spring-web\u0026#34;,\u0026#34;6.2.1\u0026#34; 8\u0026#34;library\u0026#34;,\u0026#34;pkg:maven\u0026#34;,\u0026#34;org.springframework\u0026#34;,\u0026#34;spring-webmvc\u0026#34;,\u0026#34;6.2.1\u0026#34; 9\u0026#34;library\u0026#34;,\u0026#34;pkg:maven\u0026#34;,\u0026#34;org.yaml\u0026#34;,\u0026#34;snakeyaml\u0026#34;,\u0026#34;2.3\u0026#34; Links Erstellung einer Software-Inventurliste (SBOM) für eine Java-App - JSON und CSV Änderungen 2025-02-02: Link korrigiert 2025-01-30: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-30_trivy-container-sbom/","section":"blog","tags":["trivy","cdxgen","spdx","sicherheit","sbom","container"],"title":"Container-SBOM nach CSV wandeln"},{"body":"","link":"https://uli.heller.cool/tags/sbom/","section":"tags","tags":null,"title":"Sbom"},{"body":"","link":"https://uli.heller.cool/tags/sicherheit/","section":"tags","tags":null,"title":"Sicherheit"},{"body":"","link":"https://uli.heller.cool/tags/spdx/","section":"tags","tags":null,"title":"Spdx"},{"body":"","link":"https://uli.heller.cool/tags/trivy/","section":"tags","tags":null,"title":"Trivy"},{"body":"","link":"https://uli.heller.cool/categories/trivy/","section":"categories","tags":null,"title":"Trivy"},{"body":"","link":"https://uli.heller.cool/tags/csv/","section":"tags","tags":null,"title":"Csv"},{"body":"","link":"https://uli.heller.cool/tags/jq/","section":"tags","tags":null,"title":"Jq"},{"body":"","link":"https://uli.heller.cool/categories/jq/","section":"categories","tags":null,"title":"JQ"},{"body":" Bei der Wandlung der SBOM-JSON-Dokumente nach CSV fällt auf, dass die JSON-Struktur beim SPDX-Format leider keine Trennung von \u0026quot;group\u0026quot; und \u0026quot;name\u0026quot; aufweist. Dies möchte ich bei der Wandlung mit JQ \u0026quot;nachholen\u0026quot;.\nProblembeschreibung Ausgangsdatei: trivy-spdx-sbom.json\nDirekte Wandlung nach CSV:\n1jq -r \u0026#39;[ \u0026#34;name\u0026#34;, \u0026#34;versionInfo\u0026#34; ] as $cols | .packages | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv\u0026#39; \u0026lt;trivy-spdx-sbom.json \u0026gt;trivy-spdx-sbom-ko.csv Das erzeugt eine CSV-Datei wie diese - trivy-spdx-sbom-ko.csv:\n1\u0026#34;name\u0026#34;,\u0026#34;versionInfo\u0026#34; 2\u0026#34;gradle.lockfile\u0026#34;, 3\u0026#34;ch.qos.logback:logback-classic\u0026#34;,\u0026#34;1.5.12\u0026#34; 4\u0026#34;ch.qos.logback:logback-core\u0026#34;,\u0026#34;1.5.12\u0026#34; 5\u0026#34;com.fasterxml.jackson.core:jackson-annotations\u0026#34;,\u0026#34;2.18.2\u0026#34; 6... Ich hätte gerne:\n1\u0026#34;group\u0026#34;,\u0026#34;name\u0026#34;,\u0026#34;version\u0026#34; 2\u0026#34;\u0026#34;,\u0026#34;gradle.lockfile\u0026#34;,\u0026#34;\u0026#34; 3\u0026#34;ch.qos.logback\u0026#34;,\u0026#34;logback-classic\u0026#34;,\u0026#34;1.5.12\u0026#34; 4\u0026#34;ch.qos.logback\u0026#34;,\u0026#34;logback-core\u0026#34;,\u0026#34;1.5.12\u0026#34; 5\u0026#34;com.fasterxml.jackson.core\u0026#34;,\u0026#34;jackson-annotations\u0026#34;,\u0026#34;2.18.2\u0026#34; 6... Also: Feld \u0026quot;name\u0026quot; aufsplitten bei \u0026quot;:\u0026quot;!\nEine erste Variante 1jq -r \u0026#39;[\u0026#34;group\u0026#34;, \u0026#34;name\u0026#34;, \u0026#34;version\u0026#34;], (.packages[] | ([(.name|split(\u0026#34;:\u0026#34;)|.[]), .versionInfo])) | @csv\u0026#39; \u0026lt;trivy-spdx-sbom.json \u0026gt;trivy-spdx-sbom-ok1.csv Hier die gelieferte CSV-Datei - trivy-spdx-sbom-ok1.json:\n1\u0026#34;group\u0026#34;,\u0026#34;name\u0026#34;,\u0026#34;version\u0026#34; 2\u0026#34;gradle.lockfile\u0026#34;, 3\u0026#34;ch.qos.logback\u0026#34;,\u0026#34;logback-classic\u0026#34;,\u0026#34;1.5.12\u0026#34; 4\u0026#34;ch.qos.logback\u0026#34;,\u0026#34;logback-core\u0026#34;,\u0026#34;1.5.12\u0026#34; 5\u0026#34;com.fasterxml.jackson.core\u0026#34;,\u0026#34;jackson-annotations\u0026#34;,\u0026#34;2.18.2\u0026#34; 6... Verbeibendes Problem Wenn \u0026quot;name\u0026quot; keinen Doppelpunkt enthält, so sieht die erzeugte Datei so aus:\n1\u0026#34;group\u0026#34;,\u0026#34;name\u0026#34;,\u0026#34;version\u0026#34; 2\u0026#34;myname-kein-doppelpunkt\u0026#34;,\u0026#34;1.0\u0026#34; Bei zwei Doppelpunkten:\n1\u0026#34;group\u0026#34;,\u0026#34;name\u0026#34;,\u0026#34;version\u0026#34; 2\u0026#34;eins\u0026#34;,\u0026#34;zwei\u0026#34;,\u0026#34;myname-zwei-doppelpunkte\u0026#34;,\u0026#34;1.0\u0026#34; Hier eine Testausführung:\n1jq -r \u0026#39;[\u0026#34;group\u0026#34;, \u0026#34;name\u0026#34;, \u0026#34;version\u0026#34;], (.packages[] | ([(.name|split(\u0026#34;:\u0026#34;)|.[]), .versionInfo])) | @csv\u0026#39; \u0026lt;doppelpunkt-probleme.json \u0026gt;doppelpunkt-probleme-ko.csv ... führt zu doppelpunkt-probleme-ko.csv:\n1\u0026#34;group\u0026#34;,\u0026#34;name\u0026#34;,\u0026#34;version\u0026#34; 2\u0026#34;ohne-doppelpunkt\u0026#34;,\u0026#34;1.5.12\u0026#34; 3\u0026#34;mit\u0026#34;,\u0026#34;zwei\u0026#34;,\u0026#34;doppelpunkten\u0026#34;,\u0026#34;1.5.12\u0026#34; 4\u0026#34;ganz\u0026#34;,\u0026#34;ganz\u0026#34;,\u0026#34;ganz\u0026#34;,\u0026#34;ganz\u0026#34;,\u0026#34;viele\u0026#34;,\u0026#34;doppelpunkte\u0026#34;,\u0026#34;2.18.2\u0026#34; Lösungsversuch Neuer Versuch:\n1jq -r \u0026#39;[\u0026#34;group\u0026#34;, \u0026#34;name\u0026#34;, \u0026#34;version\u0026#34;], ( 2 .packages[] 3 | ( 4 [ 5 ( 6 .name|split(\u0026#34;:\u0026#34;) as $splitted|($splitted[-2], $splitted[-1]) 7 ), .versionInfo 8 ] 9 ) 10 ) | @csv\u0026#39; \u0026lt;doppelpunkt-probleme.json \u0026gt;doppelpunkt-probleme-ok.csv Damit sieht die [CSV-Datei doppelpunkt-probleme-ok.csv] so aus:\n1\u0026#34;group\u0026#34;,\u0026#34;name\u0026#34;,\u0026#34;version\u0026#34; 2,\u0026#34;ohne-doppelpunkt\u0026#34;,\u0026#34;1.5.12\u0026#34; 3\u0026#34;zwei\u0026#34;,\u0026#34;doppelpunkten\u0026#34;,\u0026#34;1.5.12\u0026#34; 4\u0026#34;viele\u0026#34;,\u0026#34;doppelpunkte\u0026#34;,\u0026#34;2.18.2\u0026#34; Mit der SBOM-Datei:\n1jq -r \u0026#39;[\u0026#34;group\u0026#34;, \u0026#34;name\u0026#34;, \u0026#34;version\u0026#34;], ( 2 .packages[] 3 | ( 4 [ 5 ( 6 .name|split(\u0026#34;:\u0026#34;) as $splitted|($splitted[-2], $splitted[-1]) 7 ), .versionInfo 8 ] 9 ) 10 ) | @csv\u0026#39; \u0026lt;trivy-spdx-sbom.json \u0026gt;trivy-spdx-sbom-ok2.csv CSV-Datei - trivy-spdx-sbom-ok2.csv:\n1\u0026#34;group\u0026#34;,\u0026#34;name\u0026#34;,\u0026#34;version\u0026#34; 2,\u0026#34;gradle.lockfile\u0026#34;, 3\u0026#34;ch.qos.logback\u0026#34;,\u0026#34;logback-classic\u0026#34;,\u0026#34;1.5.12\u0026#34; 4\u0026#34;ch.qos.logback\u0026#34;,\u0026#34;logback-core\u0026#34;,\u0026#34;1.5.12\u0026#34; 5\u0026#34;com.fasterxml.jackson.core\u0026#34;,\u0026#34;jackson-annotations\u0026#34;,\u0026#34;2.18.2\u0026#34; 6... Links Erstellung einer Software-Inventurliste (SBOM) für eine Java-App - JSON und CSV Historie 2025-02-02: Link korrigiert 2025-01-29: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-29_jq-feld-aufsplitten/","section":"blog","tags":["jq","csv"],"title":"JQ: Feld aufsplitten beim Wandeln nach CSV"},{"body":" Hier beschreibe ich, wie ich eine Software-Inventurliste (SBOM) für eine Java-App mit Trivy und auch dem CycloneDX-Plugin erstelle.\nDie SBOM wandle ich auch noch nach CSV, damit ich sie leichter in einer Datenbank ablegen kann.\nSBOM für ein Java-Projekt Java-Projekt clonen 1git clone https://github.com/uli-heller/java-example-sbom.git 2cd java-example-sbom Maven-Repo erzeugen 1cd java-example-sbom 2rm -rf maven-repository 3./create-maven-repository.sh SBOM mit CDXGEN-Plugin erzeugen Damit die SBOM mit dem CDXGEN-Plugin erzeugt werden kann, muß dieses in der Datei \u0026quot;build.gradle\u0026quot; eingebunden sein:\n1diff -u build.gradle.orig build.gradle 2--- build.gradle.orig\t2025-01-25 14:08:52.613830464 +0100 3+++ build.gradle\t2025-01-25 14:09:11.644940000 +0100 4@@ -7,6 +7,7 @@ 5 plugins { 6 id \u0026#39;java\u0026#39; 7 id \u0026#39;maven-publish\u0026#39; 8+ id \u0026#39;org.cyclonedx.bom\u0026#39; version \u0026#39;+\u0026#39; // or \u0026#39;2.0.0\u0026#39; 9 id \u0026#39;org.springframework.boot\u0026#39; version \u0026#39;3.4.1\u0026#39; 10 } Die SBOM erzeugt man dann mit:\n1cd java-example-sbom 2./gradlew cyclonedxBom 3mv build/reports/application.cdx.json plugin-cdx-sbom.json plugin-cdx-sbom.json\nSBOM mit TRIVY erzeugen Damit die SBOM mit TRIVY erzeugt werden kann, muß das DepencencyLocking aktiv sein. Außerdem müssen die entsprechenden Lock-Dateien erzeugt werden.\nbuild.gradle mit DependencyLocking:\n1diff --git a/build.gradle b/build.gradle 2index f5551dd..04ffb52 100644 3--- a/build.gradle 4+++ b/build.gradle 5@@ -1,3 +1,9 @@ 6+buildscript { 7+ configurations.classpath { 8+ resolutionStrategy.activateDependencyLocking() 9+ } 10+} 11+ 12 plugins { 13 id \u0026#39;java\u0026#39; 14 id \u0026#39;maven-publish\u0026#39; 15@@ -12,6 +18,10 @@ java { 16 sourceCompatibility = \u0026#39;17\u0026#39; 17 } 18 19+dependencyLocking { 20+ lockAllConfigurations() 21+} 22+ 23 repositories { 24 mavenCentral() Die SBOM erzeugt man dann mit:\n1cd java-example-sbom 2./gradlew --write-locks dependencies 3trivy filesystem gradle.lockfile --format spdx-json --output trivy-spdx-sbom.json 4trivy filesystem gradle.lockfile --format cyclonedx --output trivy-cdx-sbom.json trivy-spdx-sbom.json trivy-cdx-sbom.json\nWandeln nach CSV trivy-spdx-sbom.json 1jq -r \u0026#39;[ \u0026#34;name\u0026#34;, \u0026#34;versionInfo\u0026#34; ] as $cols | .packages | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv\u0026#39; \u0026lt;trivy-spdx-sbom.json \u0026gt;trivy-spdx-sbom.csv trivy-spdx-sbom.csv\ntrivy-cdx-sbom.json 1jq -r \u0026#39;[ \u0026#34;group\u0026#34;, \u0026#34;name\u0026#34;, \u0026#34;version\u0026#34; ] as $cols | .components | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv\u0026#39; \u0026lt;trivy-cdx-sbom.json \u0026gt;trivy-cdx-sbom.csv trivy-cdx-sbom.csv\nplugin-cdx-sbom.json 1jq -r \u0026#39;[ \u0026#34;group\u0026#34;, \u0026#34;name\u0026#34;, \u0026#34;version\u0026#34; ] as $cols | .components | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv\u0026#39; \u0026lt;plugin-cdx-sbom.json \u0026gt;plugin-cdx-sbom.csv plugin-cdx-sbom.csv\nVergleich 1$ wc -l *.csv 2 40 plugin-cdx-sbom.csv 3 41 trivy-cdx-sbom.csv 4 42 trivy-spdx-sbom.csv 5 123 insgesamt Die Anzahl der Komponenten scheint unterschiedlich zu sein!\nDetailvergleich:\nplugin-cdx-sbom.csv -\u0026gt; trivy-cdx-sbom.csv: gradle.lockfile trivy-cdx-sbom.csv -\u0026gt; trivy-spdx-sbom.csv: gradle.lockfile taucht 2x auf Allgemeine Erkenntnisse Plugin-Locking Wenn beim DependencyLocking to GradlePlugins mit einbezogen sind, dann wird die Datei \u0026quot;buildscript-gradle.lockfile\u0026quot; angelegt und auch in die SBOM eingebunden. Damit erhält man dann die Komponenten der Plugins in des SBOM. Das ist eher unerwünscht!\nAbhilfe:\nStatt: trivy filesystem . ... Dies: trivy filesystem gradle.lockfile ... Links Github - Trivy - Releases Github - java-example-sbom Versionen Getestet mit Ubuntu-22.04 und Trivy-v0.58.0 und dem Gradle-CycloneDX-Plugin-2.0.0.\nHistorie 2025-01-28: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-28_sbom-java-app/","section":"blog","tags":["trivy","cdxgen","sicherheit","sbom","java"],"title":"Erstellung einer Software-Inventurliste (SBOM) für eine Java-App - JSON und CSV"},{"body":"","link":"https://uli.heller.cool/tags/java/","section":"tags","tags":null,"title":"Java"},{"body":"","link":"https://uli.heller.cool/categories/bildchen/","section":"categories","tags":null,"title":"Bildchen"},{"body":" Manchmal bekomme ich einen Scan eines Dokumentes als Bild zugespielt und soll dies unterschreiben. Ich nutze dafür \u0026quot;WriteToPDF\u0026quot; und dies funktioniert nur für PDFs, nicht für JPGs oder PNGs. Also: Wandeln ist angesagt!\nVoraussetzung Ubuntu-22.04 ImageMagick einspielen: 1sudo apt update 2sudo apt install imagemagick Ablauf 1# convert (document).png (document.pdf) 2convert a.png a.pdf ... wandelt das Bildchen \u0026quot;a.png\u0026quot; nach \u0026quot;a.pdf\u0026quot;. Funktioniert analog auch mit \u0026quot;a.jpg\u0026quot;.\n1convert s1.png s2.png s3.png -auto-orient result.pdf ... wandelt mehrere Seiten nach PDF.\nProblem Fehlermeldung 1$ convert a.png a.pdf 2convert-im6.q16: attempt to perform an operation not allowed by the security policy `PDF\u0026#39; @ error/constitute.c/IsCoderAuthorized/426. Korrektur Anpassung von \u0026quot;/etc/ImageMagick-6/policy.xml\u0026quot;:\n1--- /etc/ImageMagick-6/policy.xml.orig\t2025-01-23 22:34:09.965329480 +0100 2+++ /etc/ImageMagick-6/policy.xml\t2025-01-23 22:34:34.931335854 +0100 3@@ -94,6 +94,6 @@ 4 \u0026lt;policy domain=\u0026#34;coder\u0026#34; rights=\u0026#34;none\u0026#34; pattern=\u0026#34;PS2\u0026#34; /\u0026gt; 5 \u0026lt;policy domain=\u0026#34;coder\u0026#34; rights=\u0026#34;none\u0026#34; pattern=\u0026#34;PS3\u0026#34; /\u0026gt; 6 \u0026lt;policy domain=\u0026#34;coder\u0026#34; rights=\u0026#34;none\u0026#34; pattern=\u0026#34;EPS\u0026#34; /\u0026gt; 7- \u0026lt;policy domain=\u0026#34;coder\u0026#34; rights=\u0026#34;none\u0026#34; pattern=\u0026#34;PDF\u0026#34; /\u0026gt; 8+ \u0026lt;!-- \u0026lt;policy domain=\u0026#34;coder\u0026#34; rights=\u0026#34;none\u0026#34; pattern=\u0026#34;PDF\u0026#34; /\u0026gt;--\u0026gt; 9 \u0026lt;policy domain=\u0026#34;coder\u0026#34; rights=\u0026#34;none\u0026#34; pattern=\u0026#34;XPS\u0026#34; /\u0026gt; 10 \u0026lt;/policymap\u0026gt; Versionen Ubuntu-22.04 ImageMagick-8:6.9.11.60+dfsg-1.3ubuntu0.22.04.5 Links StackOverflow - ImageMagick security policy 'PDF' blocking conversion Historie 2025-01-27: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-27_bildchen-nach-pdf/","section":"blog","tags":["pdf","imagemagick"],"title":"Bildchen nach PDF wandeln"},{"body":"","link":"https://uli.heller.cool/tags/imagemagick/","section":"tags","tags":null,"title":"Imagemagick"},{"body":"","link":"https://uli.heller.cool/tags/pdf/","section":"tags","tags":null,"title":"Pdf"},{"body":" Gelegentlich baue ich Paket für Debian/Ubuntu. Dazu verwende ich dpkg-buildpackage. Wenn beim Bauen was schief läuft, wird üblicherweise die komplette oft langwierige Prozedur wiederholt.\nEs gibt auch eine Abkürzung!\nProblem Paket-Quelltexte liegen vor Bauen wird gestartet mit dpkg-buildpackage Prozess bricht nach mehreren Minuten ab mit einem Fehler Manuelle Fehlerkorrektur Bauen wiederholen mit dpkg-buildpackage -\u0026gt; dauert wieder mehrere Minuten! Beschleunigung Wenn ich das Bauen wiederhole mit dpkg-buildpackage --no-pre-clean, dann wird ein Großteil der Aktionen übersprungen und das Bauen läuft sehr viel schneller ab!\nVersionen Ubuntu-22.04 Links StackExchange - How to resume package building in debian? Historie 2025-01-26: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-26_debian-paket-bauen-nochmal/","section":"blog","tags":["dpkg-buildpackage","ubuntu","linux"],"title":"Debian-Paket bauen: Wiederholen nach Fehler"},{"body":"","link":"https://uli.heller.cool/tags/dpkg-buildpackage/","section":"tags","tags":null,"title":"Dpkg-Buildpackage"},{"body":"","link":"https://uli.heller.cool/categories/paket-bauen/","section":"categories","tags":null,"title":"Paket Bauen"},{"body":"","link":"https://uli.heller.cool/tags/virtualbox/","section":"tags","tags":null,"title":"Virtualbox"},{"body":"","link":"https://uli.heller.cool/categories/virtualbox/","section":"categories","tags":null,"title":"Virtualbox"},{"body":" Virtualbox verwende ich seit Jahren, der Einsatz sollte unkompliziert sein!\nInstallation 1sudo apt update 2sudo apt upgrade 3sudo apt install virtualbox 4... 5dpkg -l virtualbox 6# -\u0026gt; 6.1.50-dfsg-1~ubuntu1.22.04.3 Start Kommando: virtualbox Maschine - Neu Name: test-vb Typ: Linux Version: Ubuntu (64-bit) Weiter Speicher: 1024 MB Keine Festplatte Erzeugen Fortfahren \u0026quot;test-vb\u0026quot; anwählen Starten Es erscheint relativ schnell eine Fehlermeldung Nutzer in Gruppe \u0026quot;vboxusers\u0026quot; aufnehmen 1$ sudo adduser uheller vboxusers 2Benutzer »uheller« wird der Gruppe »vboxusers« hinzugefügt … 3Benutzer uheller wird zur Gruppe vboxusers hinzugefügt. 4Fertig. Abmelden/Anmelden id -\u0026gt; vboxusers wird angezeigt Nochmal testen -\u0026gt; klappt nicht! Diverse Variationen mit den VM-Einstellungen: Nix hilft! Paket bauen Grob geht es mit \u0026quot;lxc-ubuntu-i386-amd64\u0026quot; wie folgt:\n./build-proot.sh -s noble -o jammy -S -a amd64 kbuild ./build.proot.sh -s noble -o jammy -S -a amd64 -k virtualbox (scheitert mit einem Fehler) proot.sh build-jammy-amd64/rootfs bash cd /src/virtualbox/virtualbox-7*/debian \u0026quot;rules\u0026quot; anpassen - systemd-Zeugs weg \u0026quot;control\u0026quot; anpassen - breaks-Zeugs weg cd .. dpkg-buildpackage - dauert sehr lange! Man erhält virtualbox-7.0.16.\nTest mit neuem Paket Einspielen:\n1$ sudo apt install \\ 2 ./virtualbox_7.0.16-dfsg-2ubuntu1.1~uh~jammy1_amd64.deb \\ 3 ./virtualbox-dkms_7.0.16-dfsg-2ubuntu1.1~uh~jammy1_amd64.deb \\ 4 ./virtualbox-qt_7.0.16-dfsg-2ubuntu1.1~uh~jammy1_amd64.deb 5... 6 7$ virtualbox Test\nMaschine auf Vorgängerschritt anwählen Ändern - Massenspeicher - ControllerIDE - \u0026quot;leer\u0026quot; Rechts CD-Symbol Abbild auswählen alpine*.iso OK Gleiche Maschine anwählen Starten -\u0026gt; klappt! Fenster schliessen - \u0026quot;... die virtuelle Maschine ausschalten\u0026quot; - OK Paket bauen für 20.04 ./build-proot.sh -S -a amd64 -s noble -o focal -k virtualbox -\u0026gt; meckert an: dh-sequence-dkms und später kbuild\n./build-proot.sh -S -a amd64 -s noble -o focal -k dh-dkms\n./build-proot.sh -S -a amd64 -s noble -o focal -k kbuild\n./build-proot.sh -S -a amd64 -s noble -o focal -k virtualbox -\u0026gt; meckert an: libtpms-dev:amd64\n./build-proot.sh -S -a amd64 -s noble -o focal -k libtpms-dev\n./build-proot.sh -S -a amd64 -s noble -o focal -k virtualbox -\u0026gt; bricht ab mit Fehler wegen KMOD_SCROLL\n1In file included from /src/virtualbox/virtualbox-7.0.16-dfsg/include/iprt/stream.h:42, 2 from /src/virtualbox/virtualbox-7.0.16-dfsg/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp:35: 3/src/virtualbox/virtualbox-7.0.16-dfsg/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp: In function \u0026#39;const char* keyModToStr(unsigned int)\u0026#39;: 4/src/virtualbox/virtualbox-7.0.16-dfsg/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp:713:25: error: \u0026#39;KMOD_SCROLL\u0026#39; was not declared in this scope; did you mean \u0026#39;KMOD_RALT\u0026#39;? 5 713 | RT_CASE_RET_STR(KMOD_SCROLL); 6 | ^~~~~~~~~~~ 7/src/virtualbox/virtualbox-7.0.16-dfsg/include/iprt/cdefs.h:2404:43: note: in definition of macro \u0026#39;RT_CASE_RET_STR\u0026#39; 8 2404 | #define RT_CASE_RET_STR(a_Const) case a_Const: return #a_Const 9 | ^~~~~~~ 10kmk: *** [/usr/share/kBuild/footer-pass2-compiling-targets.kmk:277: /src/virtualbox/virtualbox-7.0.16-dfsg/out/obj/VBoxSDL/VBoxSDL.o] Error 1 11make[1]: *** [debian/rules:62: override_dh_auto_build] Error 2 12make[1]: Leaving directory \u0026#39;/src/virtualbox/virtualbox-7.0.16-dfsg\u0026#39; Anpassen: Zeile 713 auskommentieren debian/control: libsdb2 auskommentieren, breaks-Zeugs weg ./build-proot.sh -S -a amd64 -s noble -o focal -k virtualbox -\u0026gt; klappt!\nVersionen Ubuntu-22.04 Kernel 6.8.0-51-generic Virtualbox 6.1.50-dfsg-1~ubuntu1.22.04.3 von Ubuntu-22.04 Virtualbox 7.0.16-dfsg-2ubuntu1.1 von Ubuntu-24.04 Links Github: lxc-ubuntu-i386-amd64 ... bauen von Paketen AlpineLinux-3.21 - ISO Historie 2025-01-25: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-25_virtualbox/","section":"blog","tags":["virtualbox","ubuntu","linux"],"title":"Virtualbox mit Ubuntu-22.04"},{"body":"","link":"https://uli.heller.cool/tags/sed/","section":"tags","tags":null,"title":"Sed"},{"body":"","link":"https://uli.heller.cool/categories/sed/","section":"categories","tags":null,"title":"SED"},{"body":" Manchmal muß ich in Dateien Zeichenketten suchen und ersetzen. Das geht mit SED und Kommandos wie sed -i -e s/suche/ersetze/ dateiname. Kompliziert wird's, wenn in der Such- oder Ersatzzeichenkette ein Schrägstrich enthalten ist.\nEinfache Ersetzung 1$ SUCHE=\u0026#34;Ernie\u0026#34; 2$ ERSETZE=\u0026#34;Bert\u0026#34; 3$ echo \u0026#34;Ernie war da\u0026#34;|sed -e \u0026#34;s/${SUCHE}/${ERSETZE}/\u0026#34; 4Bert war da Ersetzung mit Schrägstrich 1$ SUCHE=\u0026#34;Apfel/Birne\u0026#34; 2$ ERSETZE=\u0026#34;Kirsche/Erdbeere\u0026#34; 3$ echo \u0026#34;Ich esse gerne Apfel/Birne\u0026#34;|sed -e \u0026#34;s/${SUCHE}/${ERSETZE}/\u0026#34; 4sed: -e Ausdruck #1, Zeichen 15: Unbekannte Option für »s« Das klappt wohl nicht!\n1$ maskiere () { echo \u0026#34;$1\u0026#34;|sed -e \u0026#34;s,/,\\\\\\/,g\u0026#34;; } 2$ SUCHE=\u0026#34;$(maskiere \u0026#34;Apfel/Birne\u0026#34;)\u0026#34; 3$ ERSETZE=\u0026#34;$(maskiere \u0026#34;Kirsche/Erdbeere\u0026#34;)\u0026#34; 4$ echo \u0026#34;Ich esse gerne Apfel/Birne\u0026#34;|sed -e \u0026#34;s/${SUCHE}/${ERSETZE}/\u0026#34; 5Ich esse gerne Kirsche/Erdbeere Viel besser!\nErsetzen mit weiteren \u0026quot;Sonderzeichen\u0026quot; Insbesondere:\n\u0026quot;/\u0026quot; \u0026quot;(\u0026quot; und \u0026quot;)\u0026quot; Unklar:\n\u0026quot;[\u0026quot; und \u0026quot;]\u0026quot; \u0026quot;\u0026quot; Das geht mit:\n1$ maskiere () { echo \u0026#34;$1\u0026#34;|sed -e \u0026#34;s,\\([/()]\\),\\\\\\\\\\1,g\u0026#34;; } Lösungsvorschlag aus StackOverflow StackOverflow - Escape a string for a sed replace pattern:\n1$ maskiere_suche () { echo \u0026#34;$1\u0026#34; | sed -e \u0026#39;s/[]\\/$*.^[]/\\\\\u0026amp;/g\u0026#39;; } 2$ maskiere_ersetze () { echo \u0026#34;$1\u0026#34; | sed -e \u0026#39;s/[\\/\u0026amp;]/\\\\\u0026amp;/g\u0026#39;; } 3$ SUCHE=\u0026#34;$(maskiere_suche \u0026#34;Ein [Text] mit \u0026amp;Sonder(Zeichen)\u0026#34;)\u0026#34; 4$ ERSETZE=\u0026#34;$(maskiere_ersetze \u0026#34;/meine/ Ersetzung\u0026amp;\u0026#34;)\u0026#34; 5$ echo \u0026#34;Dies ist Ein [Text] mit \u0026amp;Sonder(Zeichen)\u0026#34;|sed -e \u0026#34;s/${SUCHE}/${ERSETZE}/g\u0026#34; 6Dies ist /meine/ Ersetzung\u0026amp; Links StackOverflow - Escape a string for a sed replace pattern Historie 2025-01-24: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-24_sed-sonderzeichen/","section":"blog","tags":["sed","linux"],"title":"SED: Suchen und Ersetzen mit \"Sonderzeichen\""},{"body":" Manchmal muß ich in Dateien bei einzelnen Zeilen Zeichenketten suchen und ersetzen.\nAusgangsdatei uli-blog.txt:\n1Hugo, Hugo, Hugo! 2Das ist dreimal Hugo 3und damit Schluß! Suchen und Ersetzen in gesamter Datei Ich möchte in der Datei \u0026quot;uli-blog.txt\u0026quot; überall die Zeichenkette \u0026quot;Hugo\u0026quot; durch \u0026quot;Heinz\u0026quot; ersetzen:\n1$ sed -i -e \u0026#34;s/Hugo/Heinz/g\u0026#34; uli-blog.txt 2$ cat uli-blog.txt 3Heinz, Heinz, Heinz! 4Das ist dreimal Heinz 5und damit Schluß! Suchen und Ersetzen nur in Komma-Zeilen Ich möchte in der Datei \u0026quot;uli-blog.txt\u0026quot; bei allen Zeilen mit Komma (\u0026quot;,\u0026quot;) die Zeichenkette \u0026quot;Hugo\u0026quot; durch \u0026quot;Heinz\u0026quot; ersetzen:\n1$ sed -i -e \u0026#34;/,/ s/Hugo/Heinz/g\u0026#34; uli-blog.txt 2$ cat uli-blog.txt 3Heinz, Heinz, Heinz! 4Das ist dreimal Hugo 5und damit Schluß! Suchen und Ersetzen nur in Nicht-Komma-Zeilen Ich möchte in der Datei \u0026quot;uli-blog.txt\u0026quot; bei allen Zeilen ohne Komma (\u0026quot;,\u0026quot;) die Zeichenkette \u0026quot;Hugo\u0026quot; durch \u0026quot;Heinz\u0026quot; ersetzen:\n1$ sed -i -e \u0026#34;/,/! s/Hugo/Heinz/g\u0026#34; uli-blog.txt 2$ cat uli-blog.txt 3Hugo, Hugo, Hugo! 4Das ist dreimal Heinz 5und damit Schluß! Suchen und Ersetzen nur in Zeile 2 Ich möchte in der Datei \u0026quot;uli-blog.txt\u0026quot; bei Zeile 2 die Zeichenkette \u0026quot;Hugo\u0026quot; durch \u0026quot;Heinz\u0026quot; ersetzen:\n1$ sed -i -e \u0026#34;2 s/Hugo/Heinz/g\u0026#34; uli-blog.txt 2$ cat uli-blog.txt 3Hugo, Hugo, Hugo! 4Das ist dreimal Heinz 5und damit Schluß! Suchen und Ersetzen in allen Zeilen außer Zeile 2 Ich möchte in der Datei \u0026quot;uli-blog.txt\u0026quot; bei allen Zeilen außer Zeile 2 die Zeichenkette \u0026quot;Hugo\u0026quot; durch \u0026quot;Heinz\u0026quot; ersetzen:\n1$ sed -i -e \u0026#34;2! s/Hugo/Heinz/g\u0026#34; uli-blog.txt 2$ cat uli-blog.txt 3Heinz, Heinz, Heinz! 4Das ist dreimal Hugo 5und damit Schluß! Links TBD\nHistorie 2025-01-23: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-23_sed-suchen-und-ersetzen-in-einzelnen-zeilen/","section":"blog","tags":["sed","linux"],"title":"SED: Suchen und Ersetzen in einzelnen Zeilen"},{"body":" Ich möchte, dass alle Pakete der Gruppe \u0026quot;cool.heller.uli\u0026quot; bei einem Build mit gleicher Versionsnummer angezogen werden. Da ich nicht weiß, welche Pakete künftig zur Gruppe gehören, kann ich sie nicht einzeln auflisten und Gradle-Constraints für die definieren\nBeispielprojekt und build.gradle Github:java-example-gradle-useversion\nAblauf ohne Dependency-Locking 1cd java-example-gradle-useversion 2./create-maven-repository.sh 0 2 3./create-maven-repository.sh 1 2 4./gradlew build # --\u0026gt; BUILD SUCCESSFUL 5unzip -v build/libs/java-*-SNAPSHOT.jar |grep hello # --\u0026gt; 1.2.0 6unzip -v build/libs/java-*-SNAPSHOT.jar |grep bye # --\u0026gt; 1.2.0 Ohne Dependency-Locking klappt das Bauen. Nun noch mit aktualisiertem MavenRepository:\n1./create-maven-repository.sh 1 3 2./gradlew build # --\u0026gt; BUILD SUCCESSFUL 3unzip -v build/libs/java-*-SNAPSHOT.jar |grep hello # --\u0026gt; 1.3.0 4unzip -v build/libs/java-*-SNAPSHOT.jar |grep bye # --\u0026gt; 1.3.0 Wie erwartet wird die aktualisierte Version 1.3.0 verwenden!\nAblauf mit Dependency-Locking 1cd java-example-gradle-useversion 2./create-maven-repository.sh 0 2 3./create-maven-repository.sh 1 2 4./gradlew dependencies --write-locks 5./gradlew build # --\u0026gt; BUILD SUCCESSFUL 6unzip -v build/libs/java-*-SNAPSHOT.jar |grep hello # --\u0026gt; 1.2.0 7unzip -v build/libs/java-*-SNAPSHOT.jar |grep bye # --\u0026gt; 1.2.0 Auch mit Dependency-Locking klappt das Bauen, sofern nach dem Erzeugen der Lockfiles keine Aktualisierung am Maven-Repository erfolgt.\nNun noch mit aktualisiertem MavenRepository:\n1./create-maven-repository.sh 1 3 2./gradlew build # --\u0026gt; BUILD FAILED Meine Erwartung wäre, dass das Bauen klappt und die Versionen 1.2.0 verwendet werden. Leider klappt das Bauen nicht und es erscheint diese Fehlermeldung:\n1java-example-gradle-useversion$ ./gradlew build 2\u0026gt; Task :compileJava FAILED 3 4FAILURE: Build failed with an exception. 5 6* What went wrong: 7Execution failed for task \u0026#39;:compileJava\u0026#39;. 8\u0026gt; Could not resolve all files for configuration \u0026#39;:compileClasspath\u0026#39;. 9 \u0026gt; Did not resolve \u0026#39;cool.heller.uli:bye-moon:1.2.0\u0026#39; which has been forced / substituted to a different version: \u0026#39;1.3.0\u0026#39; 10 \u0026gt; Did not resolve \u0026#39;cool.heller.uli:hello-world:1.2.0\u0026#39; which has been forced / substituted to a different version: \u0026#39;1.3.0\u0026#39; 11 12* Try: 13\u0026gt; Run with --stacktrace option to get the stack trace. 14\u0026gt; Run with --info or --debug option to get more log output. 15\u0026gt; Run with --scan to get full insights. 16\u0026gt; Get more help at https://help.gradle.org. 17 18BUILD FAILED in 576ms 191 actionable task: 1 executed Mit und ohne \u0026quot;useVersion\u0026quot; Ich habe eine neue Abhängigkeit mit Namen \u0026quot;maybe-mars\u0026quot; hinzugefügt. Diese verwendet auch die dynamische Version \u0026quot;1.+\u0026quot;, allerdings ohne \u0026quot;useVersion()\u0026quot;.\nDamit wie zuvor:\n1rm -rf maven-repository 2./create-maven-repository.sh 0 2 3./create-maven-repository.sh 1 2 4./gradlew dependencies --write-locks # --\u0026gt; BUILD SUCCESSFUL, *lockfile created 5./create-maven-repository.sh 1 3 6./gradlew build # --\u0026gt; BUILD FAILED In der Fehlermeldung taucht \u0026quot;maybe-mars\u0026quot; nicht auf:\n1java-example-gradle-useversion$ ./gradlew build 2\u0026gt; Task :compileJava FAILED 3 4FAILURE: Build failed with an exception. 5 6* What went wrong: 7Execution failed for task \u0026#39;:compileJava\u0026#39;. 8\u0026gt; Could not resolve all files for configuration \u0026#39;:compileClasspath\u0026#39;. 9 \u0026gt; Did not resolve \u0026#39;cool.heller.uli:hello-world:1.2.0\u0026#39; which has been forced / substituted to a different version: \u0026#39;1.3.0\u0026#39; 10 \u0026gt; Did not resolve \u0026#39;cool.heller.uli:bye-moon:1.2.0\u0026#39; which has been forced / substituted to a different version: \u0026#39;1.3.0\u0026#39; 11 12* Try: 13\u0026gt; Run with --stacktrace option to get the stack trace. 14\u0026gt; Run with --info or --debug option to get more log output. 15\u0026gt; Run with --scan to get full insights. 16\u0026gt; Get more help at https://help.gradle.org. 17 18BUILD FAILED in 1s In den Dateien \u0026quot;*lockfile\u0026quot; sehen alle drei Abhängigkeiten ähnlich aus:\n1java-example-gradle-useversion$ grep heller *lockfile 2gradle.lockfile:cool.heller.uli:bye-moon:1.2.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath 3gradle.lockfile:cool.heller.uli:hello-world:1.2.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath 4gradle.lockfile:cool.heller:maybe-mars:1.2.0=compileClasspath,productionRuntimeClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath Also: Das Problem liegt an \u0026quot;useVersion()\u0026quot;!\nAbstimmung im Gradle-Forum Meine Nachfrage im GradleForum - Dependency Locking and useVersion liefert als Erkenntnis, dass man \u0026quot;useVersion()\u0026quot; besser nicht verwendet!\nVielen Dank an Björn Kautler!\nNachtrag: POM und Module Bei meinem Kundenteam gibt es die Hypothese, dass useVersion keine Auswirkung auf die Module-Datei beim Publishing hat. Dort steht wohl immer diejenige Version drin, die in der Datei \u0026quot;build.gradle\u0026quot; vorgegeben wird.\nIch habe das nachgetestet mit Github:java-example-gradle-useversion, Entwicklerzweig \u0026quot;module-and-pom\u0026quot;.\nAuschecken: git checkout \u0026quot;module-and-pom\u0026quot; Sichten: Was steht in \u0026quot;build.gradle\u0026quot;? cool.heller.uli:hello-world:0.9.0 cool.heller.uli:bye-moon (leer, keine Version) cool.heller:maybe-mars:${coolHellerUliVersion} Sichten: Was steht in \u0026quot;cool-heller-uli.gradle\u0026quot;? coolHellerUliVersion='0.1.0' Maven-Repo erzeugen: ./create-maven-repository.sh 0 2 ./create-maven-repository.sh 1 2 Sichten: Welche Version wird verwendet? ./gradlew dependencies|grep cool Erkenntnis: (Fast) Immer 0.1.0, bei \u0026quot;implementation\u0026quot; sind die Versionen aus \u0026quot;build.gradle\u0026quot; drin Veröffentlichen: ./gradlew publish Sichten POM: less build/local-repository/com/example/java-example-gradle-useversion/0.0.2/java-example-gradle-useversion-0.0.2.pom cool.heller.uli:hello-world:0.9.0 cool.heller.uli:bye-moon (leer, keine Version) cool.heller:maybe-mars:0.1.0 Sichten Module: less build/local-repository/com/example/java-example-gradle-useversion/0.0.2/java-example-gradle-useversion-0.0.2.module cool.heller.uli:hello-world:0.9.0 cool.heller.uli:bye-moon (leer, keine Version) cool.heller:maybe-mars:0.1.0 Also: Sowohl in der POM-Datei, als auch in der Modules-Datei tauchen die mit \u0026quot;useVersion\u0026quot; überschriebenen Versionen nicht auf!\nVersionen Getestet mit\nGradle-8.11.1 Links Github:java-example-gradle-useversion GradleForum - Dependency Locking and useVersion Historie 2025-01-22: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-22_gradle-use-version/","section":"blog","tags":["gradle"],"title":"Gradle: Verwendung von useVersion"},{"body":" Hier beschreibe ich verschiedene Varianten der Einbindung von Plugins in Gradle. Für die Beschreibung verwende ich das Plugin \u0026quot;Nebula Dependency Lock\u0026quot;. Mittlerweile weiß ich, dass ich dieses spezielle Plugin NICHT verwenden werde. Es dient nur zur Illustration der Einbinde-Varianten!\nStandard-Einbindung Locking Dependency Versions in Gradle\nbuild.gradle:\n1plugins { 2 id \u0026#34;nebula.dependency-lock\u0026#34; version \u0026#34;2.2.4\u0026#34; 3} Dies ist der übliche Weg, ein Plugin einzubinden. Es muß über \u0026quot;plugins.gradle.org\u0026quot; verfügbar sein.\nIch habe das Plugin in einem Artikel aus 2017 gefunden. Dementsprechend ist die Versionsnummer veraltet!\nAktuelle Version plugins.gradle.org - nebula.dependency-lock\nbuild.gradle:\n1plugins { 2 id(\u0026#34;nebula.dependency-lock\u0026#34;) version \u0026#34;12.7.1\u0026#34; 3} Ich habe auf \u0026quot;plugins.gradle.org\u0026quot; nachgesehen und dort die Version 12.7.1 gefunden.\nPlugin Hosted On Github - Version 4.+ https://github.com/nebula-plugins/gradle-dependency-lock-plugin - Usage - example\nbuild.gradle:\n1buildscript { 2 repositories { 3 mavenLocal() 4 jcenter() 5 } 6 7 dependencies { 8 classpath \u0026#39;com.netflix.nebula:gradle-dependency-lock-plugin:4.+\u0026#39; 9 } 10} 11apply plugin: \u0026#39;nebula.dependency-lock\u0026#39; 12 13... Suche auf Github liefert eine weitere Version. Auf der Wiki-Seite dort findet sich obere Variante.\nPlugin Hosted On Github - Latest Version 15.+ Github - gradle-dependency-lock-plugin\nbuild.gradle:\n1buildscript { 2 repositories { 3 mavenLocal() 4 jcenter() 5 } 6 7 dependencies { 8 classpath \u0026#39;com.netflix.nebula:gradle-dependency-lock-plugin:15.+\u0026#39; 9 } 10} 11apply plugin: \u0026#39;com.netflix.nebula.dependency-lock\u0026#39; 12... Im Github-Repo selbst finde ich Version v15.1.1. Mi etwas Rumprobieren habe ich vorstehende Variante entdeckt und damit die neueste Version vom Dezember 2024 verwendet.\nServer-Kommunikation 2.2.7 plugins.gradle.org plugins-artifacts.gradle.org 12.7.1 repo.maven.apache.org 4.+ jcenter.bintray.com repo1.maven.org 15.+ keine zusätzliche Server-Kommunikation Versionen Getestet mit\nGradle-8.12 Links \u0026quot;Nebula Dependency Lock\u0026quot; plugins.gradle.org - nebula.dependency-lock https://github.com/nebula-plugins/gradle-dependency-lock-plugin - Usage - example Github - gradle-dependency-lock-plugin github:java-example-gradle-plugin-use Historie 2025-01-21: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-21_gradle-plugin-use/","section":"blog","tags":["gradle"],"title":"Gradle: Verwendung von Plugins"},{"body":" Hier beschreibe ich meine Korrektur der Warnmeldung \u0026quot;Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.\u0026quot; Klar: Ich korrigiere nur die Warnungen, die bei mir auftreten.\nBeispielprojekt Mein Beispielprojekt liegt hier: github:java-example-gradle-plugin-use. Das Beispielprojekt möchte ich \u0026quot;eigentlich\u0026quot; verwenden, um die Einbindung von Gradle-Plugins zu beschreiben. In der Vorbereitung bin ich wieder über die Warnung gestolpert und habe mich nun entschlossen, diese vorab zu korrigieren!\nWarnungen beim Build 1java-example-gradle-plugin-use$ ./gradlew build 2To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/8.12/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation. 3Daemon will be stopped at the end of the build 4\u0026gt; Task :compileJava 5\u0026gt; Task :processResources NO-SOURCE 6\u0026gt; Task :classes 7\u0026gt; Task :resolveMainClassName 8\u0026gt; Task :bootJar 9\u0026gt; Task :jar 10\u0026gt; Task :assemble 11\u0026gt; Task :compileTestJava NO-SOURCE 12\u0026gt; Task :processTestResources NO-SOURCE 13\u0026gt; Task :testClasses UP-TO-DATE 14\u0026gt; Task :test NO-SOURCE 15\u0026gt; Task :check UP-TO-DATE 16\u0026gt; Task :build 17 18[Incubating] Problems report is available at: file:///.../java-example-gradle-plugin-use/build/reports/problems/problems-report.html 19 20Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0. 21 22You can use \u0026#39;--warning-mode all\u0026#39; to show the individual deprecation warnings and determine if they come from your own scripts or plugins. 23 24For more on this, please refer to https://docs.gradle.org/8.12/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. 25 26BUILD SUCCESSFUL in 7s 274 actionable tasks: 4 executed Sichtung von \u0026quot;problems-report.html\u0026quot; Ich öffne im Browser den Link zu \u0026quot;problems-report.html\u0026quot; - file:///.../java-example-gradle-plugin-use/build/reports/problems/problems-report.html:\n1build file \u0026#39;/home/uli/git/github/uli-heller/java-example-gradle-plugin-use/build.gradle\u0026#39;` 2 3 - [warn] The org.gradle.api.plugins.JavaPluginConvention type has been deprecated.`:10` 4 This is scheduled to be removed in Gradle 9.0. 5 The org.gradle.api.plugins.JavaPluginConvention type has been deprecated. Mit \u0026quot;Google\u0026quot; lande ich hier: StackOverflow - Project.getConvention() method has been deprecated und dort die Antwort von Taoufik Laaroussi.\nKorrekturversuch 1diff --git a/build.gradle b/build.gradle 2index 60222cc..0dcbfb6 100644 3--- a/build.gradle 4+++ b/build.gradle 5@@ -8,7 +8,9 @@ apply plugin: \u0026#39;io.spring.dependency-management\u0026#39; 6 group = \u0026#39;cool.heller.uli\u0026#39; 7 version = \u0026#39;0.0.1-SNAPSHOT\u0026#39; 8 9-sourceCompatibility = \u0026#39;17\u0026#39; 10+java { 11+ sourceCompatibility = \u0026#39;17\u0026#39; 12+} 13 14 repositories { 15 mavenCentral() Schlusstest 1java-example-gradle-plugin-use$ ./gradlew build 2To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/8.12/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation. 3Daemon will be stopped at the end of the build 4\u0026gt; Task :compileJava UP-TO-DATE 5\u0026gt; Task :processResources NO-SOURCE 6\u0026gt; Task :classes UP-TO-DATE 7\u0026gt; Task :resolveMainClassName UP-TO-DATE 8\u0026gt; Task :bootJar UP-TO-DATE 9\u0026gt; Task :jar UP-TO-DATE 10\u0026gt; Task :assemble UP-TO-DATE 11\u0026gt; Task :compileTestJava NO-SOURCE 12\u0026gt; Task :processTestResources NO-SOURCE 13\u0026gt; Task :testClasses UP-TO-DATE 14\u0026gt; Task :test NO-SOURCE 15\u0026gt; Task :check UP-TO-DATE 16\u0026gt; Task :build UP-TO-DATE 17 18BUILD SUCCESSFUL in 6s 194 actionable tasks: 4 up-to-date Die Warnung ist weg, Problem gelöst!\nVersionen Getestet mit\nGradle-8.12 Links Beispielprojekt - github:java-example-gradle-plugin-use ... mit Warnung ... mit Korrektur, ohne Warnung StackOverflow - Project.getConvention() method has been deprecated Taoufik Laaroussi Historie 2025-01-20: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-20_gradle-deprecation-90/","section":"blog","tags":["gradle"],"title":"Gradle: Anstehende Kompatibilitätsänderungen bei Version 9.0"},{"body":" Ich erzeuge relativ viele Debian-Pakete und verwende dabe gelegentlich das Programm \u0026quot;debchange\u0026quot;. Hier meine gesammelten Erkenntnisse dazu!\nNeuen Versionseintrag erstellen - debchange -i Kommando: debchange -i --changelog data/changelog\nÖffnet einen Editor mit der Changelog-Datei und einem frischen Änderungsblock:\n1gocryptfs (2.4.0-1ubuntu0.24.04.3) UNRELEASED; urgency=medium 2 3 * 4 5 -- Uli Heller \u0026lt;uli@ulicsl\u0026gt; Thu, 02 Jan 2025 19:00:17 +0100 6 7gocryptfs (2.4.0-1ubuntu0.24.04.2) noble-security; urgency=medium 8 9 * No change rebuild due to golang-1.22 update 10 11 -- Evan Caville \u0026lt;evan.caville@canonical.com\u0026gt; Fri, 01 Nov 2024 10:42:11 +0100 12... Ungünstig:\nVersionsnummer wird einfach hochgezählt - Abhilfe: -i weglassen und --local \u0026quot;~uli\u0026quot; -\u0026gt; hängt \u0026quot;~uli1\u0026quot; dran Email stimmt nicht - Abhilfe: DEBFULLNAME=\u0026quot;Uli Heller\u0026quot; DEBEMAIL=uli@heller.cool debchange ... Statt UNRELEASED sollte besser der Name der Zieldistribution erscheinen - Abhilfe: --distribution focal Änderungsnachricht leer - Abhilfe: Text hinten an's Kommando dranhängen Editor erfordert manuelle Eingriffe - Abhilfe: Text hinten an's Kommando dranhängen Neuen Versionseintrag erstellen beim Umpacken 1DEBFULLNAME=\u0026#34;Uli Heller\u0026#34; DEBEMAIL=uli@heller.cool debchange --changelog data/changelog --distribution focal --local \u0026#34;~uli\u0026#34; \u0026#34;Repackaged for focal/20.04\u0026#34; Damit ergeben sich diese Versionsnummern:\ndata/changelog: 2.4.0-1ubuntu0.24.04.2 -\u0026gt; 2.4.0-1ubuntu0.24.04.2~uli1 data/changelog: 2.4.0-1ubuntu0.24.04.2uli1 -\u0026gt; 2.4.0-1ubuntu0.24.04.2uli2 data/dh-golang: 1.53 -\u0026gt; 1.53~uli1 golang-defaults: 2:1.222build1 -\u0026gt; 2:1.222build1~uli1 golang-github-hanwen-go-fuse: 2.0.3-1 -\u0026gt; 2.0.3-1~uli1 golang-github-moby-sys: 0.0git20231105.a4e0878-1 -\u0026gt; 0.0git20231105.a4e0878-1~uli1 golang-github-sabhiram-go-gitignore: 1.0.2+git20210923.525f6e1-1 -\u0026gt; 1.0.2+git20210923.525f6e1-1~uli1 data/changelog-test1: 2.4.0-1ubuntu0.24.04.2dp01focal2 -\u0026gt; 2.4.0-1ubuntu0.24.04.2dp01focal2~uli1 Links Manual: debchange Versionen Getestet mit\nUbuntu-20.04 Historie 2025-01-19: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-19_debchange/","section":"blog","tags":["linux","ubuntu"],"title":"debchange - Werkzeug zum Verwalten der Datei \"debian/changelog\""},{"body":"","link":"https://uli.heller.cool/tags/email/","section":"tags","tags":null,"title":"Email"},{"body":"","link":"https://uli.heller.cool/categories/email/","section":"categories","tags":null,"title":"Email"},{"body":"","link":"https://uli.heller.cool/tags/roundcube/","section":"tags","tags":null,"title":"Roundcube"},{"body":" Relativ häufig verschicke ich Emails mit Anleitungen zu Terminalein- und -ausgaben. Schön ist's, wenn die dann ansprechend aussehen. Und als Text kopierbar sind. Nachfolgend ein paar Rezepte mit Roundcube.\nAufgabestellung Ich hätte gerne den nachfolgenden Terminal-Ausschnitt in einer Email. Er soll möglichst ähnlich zum Bild aussehen und kopierbaren Text enthalten. Hier das Bild:\nText Man kann die Email einfach als Textmail verfassen. Das sieht dann grob so aus:\n1Hier meine Terminalein- und Ausgaben: 2 3 uli@uliip5:~$ which gocryptfs 4 /usr/bin/gocryptfs 5 uli@uliip5:~$ file $(which gocryptfs) 6 /usr/bin/gocryptfs: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=5a482d3b812ac52299539bd4f5297d29f58ec688, for GNU/Linux 3.2.0, with debug_info, not stripped 7 uli@uliip5:~$ Vorteil: SEHR einfach zu erstellen, Terminalinhalt mittels kopieren+einfügen übertragen\nNachteil: Optisch nicht sonderlich ansprechend!\nMarkdown EMail erstellen\nWechseln in die HTML-Erstellung\nNachfolgende Markdown-Codierung eingeben:\n1 Hier meine Terminalein- und Ausgaben: 2 3 \\``` 4 uli@uliip5:~$ which gocryptfs 5 /usr/bin/gocryptfs 6 uli@uliip5:~$ file $(which gocryptfs) 7 /usr/bin/gocryptfs: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=5a482d3b812ac52299539bd4f5297d29f58ec688, for GNU/Linux 3.2.0, with debug_info, not stripped 8 uli@uliip5:~$ 9 \\``` Text markieren\nRechte Maustaste - Markdown an/aus\nDas Ergebnis sieht grob so aus wie nachfolgend! Die schwarzen Balken links und rechts kommen von meiner Hugo-Formatierung, in Mails sind die weg! Der Text ist kopierbar!\nHier meine Terminalein- und Ausgaben:\n1uli@uliip5:~$ which gocryptfs 2/usr/bin/gocryptfs 3uli@uliip5:~$ file $(which gocryptfs) 4/usr/bin/gocryptfs: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=5a482d3b812ac52299539bd4f5297d29f58ec688, for GNU/Linux 3.2.0, with debug_info, not stripped 5uli@uliip5:~$ Vorteil: Einfach zu erstellen, Terminalinhalt mittels kopieren+einfügen übertragen\nNachteil: Optisch nicht sonderlich ansprechend!\nHTML Terminal: Markieren + \u0026quot;Als HTML kopieren\u0026quot; EMail erstellen Wechseln in die HTML-Erstellung Mail-Beginn eintippen: \u0026quot;Hier meine Terminalein- und -ausgaben:\u0026quot; Mail-Formatierung: Quelltext Unterhalb der Zeile mit \u0026quot;Terminalein- und -ausgaben\u0026quot;: Leerzeile einfügen In Leerzeile: Einfügen (Strg-V) Beim \u0026quot;führenden\u0026quot; \u0026lt;pre\u0026gt;: Von: \u0026lt;pre\u0026gt; Nach: \u0026lt;pre style=\u0026quot;background-color: gray; color: white\u0026quot;\u0026gt; Speichern Das Ergebnis sieht dann grob so aus:\n\u0026nbsp; Hier meine Terminalein- und Ausgaben: uli@uliip5:~$ which gocryptfs /usr/bin/gocryptfs uli@uliip5:~$ file $(which gocryptfs) /usr/bin/gocryptfs: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=5a482d3b812ac52299539bd4f5297d29f58ec688, for GNU/Linux 3.2.0, with debug_info, not stripped uli@uliip5:~$ Versionen Getestet mit Roundcube-1.6.9 und Chrome-131.0.6778.204.\nHistorie 2025-01-18: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-18_terminal-ausgaben-in-roundcube/","section":"blog","tags":["email","roundcube"],"title":"Terminal-Ausgaben in Emails"},{"body":"","link":"https://uli.heller.cool/tags/chrome/","section":"tags","tags":null,"title":"Chrome"},{"body":"","link":"https://uli.heller.cool/categories/chrome/","section":"categories","tags":null,"title":"Chrome"},{"body":" Ich bin über diesen Artikel gestolpert: https://www.idontplaydarts.com. Leider ist das Zertifikat abgelaufen. So kann ich den Artikel in Chrome nicht ansehen. Früher konnte man man \u0026quot;Zertifikatsfehler ignorieren\u0026quot; anklicken, das geht seit einiger Zeit leider nicht mehr!\nAnzeige mittels archive.org Im Browser öffnen: https://archive.org Search: www.idontplaydarts.com Search archived web sites: Ja Go \u0026quot;Letztes\u0026quot; Datum auswählen Damit wird die Seite angezeigt!\nDirekte Anzeige in Chrome Alle Chrome-Prozesse stoppen Neuen Chrome-Prozess starten via Kommandozeile: google-chrome-stable --ignore-certificate-errors Diverse Warnungen ignorieren Nun klappts: https://www.idontplaydarts.com - Zertifikat abgelaufen Getestet mit Google-Chrome Version Version 131.0.6778.204 (Offizieller Build) (64-Bit) Links archive.org - Wayback-Machine https://www.idontplaydarts.com - Zertifikat abgelaufen Historie 2025-01-17: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-17_chrome-abgelaufenes-zertifikat/","section":"blog","tags":["chrome","zertifikat"],"title":"Chrome: Webseite mit abgelaufenem Zertifikat anzeigen"},{"body":"","link":"https://uli.heller.cool/tags/zertifikat/","section":"tags","tags":null,"title":"Zertifikat"},{"body":"","link":"https://uli.heller.cool/tags/clarity/","section":"tags","tags":null,"title":"Clarity"},{"body":"","link":"https://uli.heller.cool/tags/hugo/","section":"tags","tags":null,"title":"Hugo"},{"body":"","link":"https://uli.heller.cool/categories/hugo/","section":"categories","tags":null,"title":"Hugo"},{"body":" Ich würde gerne das Stuttgarter Rößle in der Titelzeile sehen!\nBisherige Anzeige Änderung \u0026quot;stuttgart.svg\u0026quot; ablegen unter \u0026quot;static/icons/stuttgart.svg\u0026quot;. Zusätzlich nachfolgende Anpassungen:\n1diff --git a/themes/hugo-clarity/layouts/partials/favicon.html b/themes/hugo-clarity/layouts/partials/favicon.html 2index 98bc0ab..51e1908 100644 3--- a/themes/hugo-clarity/layouts/partials/favicon.html 4+++ b/themes/hugo-clarity/layouts/partials/favicon.html 5@@ -1,6 +1,6 @@ 6 {{- $iconsDir := default \u0026#34;icons/\u0026#34; .Site.Params.iconsDir }} 7 {{- $appleTouch := absURL (printf \u0026#34;%s%s\u0026#34; $iconsDir \u0026#34;apple-touch-icon.png\u0026#34;) }} 8-{{- $favicon := absURL (printf \u0026#34;%s%s\u0026#34; $iconsDir \u0026#34;favicon-32x32.png\u0026#34; ) }} 9+{{- $favicon := absURL (printf \u0026#34;%s%s\u0026#34; $iconsDir \u0026#34;stuttgart.svg\u0026#34; ) }} 10 {{- $manifest := absURL (printf \u0026#34;%s%s\u0026#34; $iconsDir \u0026#34;site.webmanifest\u0026#34; ) }} 11 \u0026lt;link rel=\u0026#34;apple-touch-icon\u0026#34; sizes=\u0026#34;180x180\u0026#34; href=\u0026#34;{{ $appleTouch }}\u0026#34;\u0026gt; 12 \u0026lt;link rel=\u0026#34;icon\u0026#34; type=\u0026#34;image/png\u0026#34; sizes=\u0026#34;32x32\u0026#34; href=\u0026#34;{{ $favicon }}\u0026#34;\u0026gt; Neue Anzeige Links Github - Hugo-Clarity Historie 2025-01-16: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-16_hugo-clarity-favicon/","section":"blog","tags":["hugo","clarity"],"title":"Hugo-Clarity: Webseiten-Icon"},{"body":"","link":"https://uli.heller.cool/categories/dateisystem/","section":"categories","tags":null,"title":"Dateisystem"},{"body":" Hier zeige ich, wie ich ohne \u0026quot;root\u0026quot; mit Dateisystemen arbeite, die \u0026quot;root\u0026quot;-Mechanismen benötigen.\nVorbereiten 1$ uname -a 2Linux uliip5 6.8.0-49-generic #49~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Nov 6 17:42:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux 3 4$ sudo apt install -y proot 5Paketlisten werden gelesen… Fertig 6Abhängigkeitsbaum wird aufgebaut… Fertig 7Statusinformationen werden eingelesen… Fertig 8Die folgenden Pakete wurden automatisch installiert und werden nicht mehr benötigt: 9 containerd libclamav9 libpkgconf3 libtfm1 pigz runc ubuntu-fan 10Verwenden Sie »sudo apt autoremove«, um sie zu entfernen. 11Die folgenden NEUEN Pakete werden installiert: 12 proot 130 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert. 14Es müssen 75,3 kB an Archiven heruntergeladen werden. 15Nach dieser Operation werden 211 kB Plattenplatz zusätzlich benutzt. 16Holen:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 proot amd64 5.1.0-1.3 [75,3 kB] 17Es wurden 75,3 kB in 1 s geholt (65,6 kB/s). 18Vormals nicht ausgewähltes Paket proot wird gewählt. 19... 20 21$ cd $HOME/Downloads 22$ wget https://github.com/uli-heller/lxc-ubuntu-i386-amd64/releases/download/v1.12.1/noble-v1.12.1-amd64-lxcimage.tar.xz Dateisystem initialisieren 1$ mkdir /tmp/proot-tests 2$ xz -cd $HOME/Downloads/noble-v1.12.1-amd64-lxcimage.tar.xz|(cd /tmp/proot-tests \u0026amp;\u0026amp; tar xf -) 3$ proot -R /tmp/proot-tests/rootfs -0 /bin/bash 4# Test: Bauen von Paketen 1$ proot -S /tmp/proot-tests/rootfs /bin/bash 2root:~ # sed -e \u0026#34;s,^deb ,deb-src ,\u0026#34; /etc/apt/sources.list \u0026gt;/etc/apt/sources.list.d/deb-src.list 3root:~ # mkdir /src 4root:~ # cd /src 5root:/src # apt update 6Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease 7Get:2 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB] 8Get:3 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB] 9... 10root:/src # apt source at 11Reading package lists... Done 12NOTICE: \u0026#39;at\u0026#39; packaging is maintained in the \u0026#39;Git\u0026#39; version control system at: 13https://salsa.debian.org/debian/at.git -b debian 14Please use: 15git clone https://salsa.debian.org/debian/at.git -b debian 16to retrieve the latest (possibly unreleased) updates to the package. 17Need to get 157 kB of source archives. 18Get:1 http://archive.ubuntu.com/ubuntu noble/universe at 3.2.5-2.1ubuntu3 (dsc) [2078 B] 19Get:2 http://archive.ubuntu.com/ubuntu noble/universe at 3.2.5-2.1ubuntu3 (tar) [133 kB] 20Get:3 http://archive.ubuntu.com/ubuntu noble/universe at 3.2.5-2.1ubuntu3 (diff) [21.9 kB] 21Fetched 157 kB in 2s (101 kB/s) 22sh: 1: dpkg-source: not found 23E: Unpack command \u0026#39;dpkg-source --no-check -x at_3.2.5-2.1ubuntu3.dsc\u0026#39; failed. 24N: Check if the \u0026#39;dpkg-dev\u0026#39; package is installed. 25 26root:/src # apt install -y dpkg-dev 27Reading package lists... Done 28Building dependency tree... Done 29Reading state information... Done 30The following additional packages will be installed: 31 binutils binutils-common binutils-x86-64-linux-gnu build-essential bzip2 cpp cpp-13 cpp-13-x86-64-linux-gnu 32 cpp-x86-64-linux-gnu dirmngr fakeroot fontconfig-config fonts-dejavu-core fonts-dejavu-mono g++ g++-13 33... 34Setting up libheif-plugin-aomdec:amd64 (1.17.6-1ubuntu4.1) ... 35Setting up libheif-plugin-libde265:amd64 (1.17.6-1ubuntu4.1) ... 36Setting up libheif-plugin-aomenc:amd64 (1.17.6-1ubuntu4.1) ... 37Processing triggers for libc-bin (2.39-0ubuntu8.3) ... 38 39root:/src # apt source at 40Reading package lists... Done 41NOTICE: \u0026#39;at\u0026#39; packaging is maintained in the \u0026#39;Git\u0026#39; version control system at: 42https://salsa.debian.org/debian/at.git -b debian 43Please use: 44git clone https://salsa.debian.org/debian/at.git -b debian 45to retrieve the latest (possibly unreleased) updates to the package. 46Skipping already downloaded file \u0026#39;at_3.2.5-2.1ubuntu3.dsc\u0026#39; 47Skipping already downloaded file \u0026#39;at_3.2.5.orig.tar.gz\u0026#39; 48Skipping already downloaded file \u0026#39;at_3.2.5-2.1ubuntu3.debian.tar.xz\u0026#39; 49Need to get 0 B of source archives. 50perl: warning: Setting locale failed. 51perl: warning: Please check that your locale settings: 52\tLANGUAGE = (unset), 53\tLC_ALL = (unset), 54\tLANG = \u0026#34;de_DE.UTF-8\u0026#34; 55 are supported and installed on your system. 56perl: warning: Falling back to the standard locale (\u0026#34;C\u0026#34;). 57dpkg-source: info: extracting at in at-3.2.5 58dpkg-source: info: unpacking at_3.2.5.orig.tar.gz 59dpkg-source: info: unpacking at_3.2.5-2.1ubuntu3.debian.tar.xz 60 61root:/src # cd at-3.2.5 62 63root:/src/at-3.2.5 # apt build-dep at 64Reading package lists... Done 65Reading package lists... Done 66Building dependency tree... Done 67Reading state information... Done 68The following NEW packages will be installed: 69 autoconf automake autopoint autotools-dev bison bsdextrautils debhelper debugedit dh-autoreconf dh-strip-nondeterminism 70... 71Building database of manual pages ... 72setpriv: setresgid failed: Operation not permitted 73Created symlink /etc/systemd/system/timers.target.wants/man-db.timer → /usr/lib/systemd/system/man-db.timer. 74Setting up debhelper (13.14.1ubuntu5) ... 75Processing triggers for libc-bin (2.39-0ubuntu8.3) ... 76 77root:/src/at-3.2.5 # dpkg-buildpackage 78... 79perl: warning: Falling back to the standard locale (\u0026#34;C\u0026#34;). 80dpkg-buildpackage: info: binary and diff upload (original source NOT included) 81 signfile at_3.2.5-2.1ubuntu3.dsc 82gpg: skipped \u0026#34;William Grant \u0026lt;wgrant@ubuntu.com\u0026gt;\u0026#34;: No secret key 83gpg: dpkg-sign._2J_Wmec/at_3.2.5-2.1ubuntu3.dsc: clear-sign failed: No secret key 84dpkg-buildpackage: error: failed to sign at_3.2.5-2.1ubuntu3.dsc file: OpenPGP backend command cannot sign Trotz \u0026quot;scheinbarem\u0026quot; Fehler hat alles geklappt! Also: DEB-Paket bauen ohne \u0026quot;root\u0026quot; geht!\nFehler und Probleme Fehlermeldung \u0026quot;proot warning: ptrace(PEEKDATA): Input/output error\u0026quot; Die Fehlermeldung erscheint quasi immer, wenn man die Option \u0026quot;-R\u0026quot; oder \u0026quot;-S\u0026quot; verwendet:\n1$ proot -R /tmp/proot-tests/rootfs -0 /bin/bash 2... 3proot warning: ptrace(PEEKDATA): Input/output error 4proot warning: ptrace(PEEKDATA): Input/output error 5proot warning: ptrace(PEEKDATA): Input/output error 6# exit 7 8$ proot -S /tmp/proot-tests/rootfs -0 /bin/bash# 9... 10proot warning: ptrace(PEEKDATA): Input/output error 11proot warning: ptrace(PEEKDATA): Input/output error 12proot warning: ptrace(PEEKDATA): Input/output error 13# exit 14 15$ proot -r /tmp/proot-tests/rootfs -0 /bin/bash 16groups: cannot find name for group ID 108 17groups: cannot find name for group ID 113 18groups: cannot find name for group ID 10000 19To run a command as administrator (user \u0026#34;root\u0026#34;), use \u0026#34;sudo \u0026lt;command\u0026gt;\u0026#34;. 20See \u0026#34;man sudo_root\u0026#34; for details. 21 22# Korrektur: Problem tritt nicht mehr auf mit \u0026quot;proot-5.4.0\u0026quot;!\nLinks Homepage: Proot Github: Proot Versionen Getestet mit\nUbuntu-22.04 und proot-5.1.0-1.3 Ubuntu-22.04 und proot-5.4.0 (selbst kompiliert) Historie 2025-01-15: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-15_proot-dateisystem-ohne-root/","section":"blog","tags":["linux","ubuntu"],"title":"PROOT: Dateisysteme ohne \"root\""},{"body":" Nach der Umstellung auf Hugo-Theme Clarity sieht meine Webseite unter https://uli.heller.cool total zerstört aus. Mit hugo server ist alles OK...\nZerstörte Anzeige Meine Webseite unter https://uli.heller.cool nach Umstellung auf das Hugo-Theme Clarity:\nKorrektur 1diff --git a/.github/workflows/hugo.yaml b/.github/workflows/hugo.yaml 2index d0d67c2..399c5d6 100644 3--- a/.github/workflows/hugo.yaml 4+++ b/.github/workflows/hugo.yaml 5@@ -59,8 +59,7 @@ jobs: 6 hugo \\ 7 --gc \\ 8 --minify \\ 9- --source .\\ 10- --baseURL \u0026#34;${{ steps.pages.outputs.base_url }}/\u0026#34; 11+ --source . 12 - name: Upload artifact 13 uses: actions/upload-pages-artifact@v3 14 with: Also: Man muß --baseURL ... aus der Github-Action entfernen!\nLinks Github - Hugo-Clarity Historie 2025-01-14: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-14_hugo-clarity-darstellungsprobleme/","section":"blog","tags":["hugo","clarity"],"title":"Hugo-Clarity: Darstellungsprobleme"},{"body":" Das Hugo-Theme Clarity unterstützt die Verwendung von Kommentaren via GithubIssues. Hier beschreibe ich meine Erfahrungen damit!\nAktivierung 1diff --git a/config/_default/params.toml b/config/_default/params.toml 2index b4c77f1..0868baf 100644 3--- a/config/_default/params.toml 4+++ b/config/_default/params.toml 5@@ -106,11 +106,11 @@ disclaimerText = \u0026#34;Diese Webseite wird bereitgestellt auf und durch Github\u0026#34; 6 blogDir = \u0026#34;blog\u0026#34; 7 8 # Enable or disable Utterances (https://github.com/utterance/utterances) Github Issue-Based Commenting 9-# utterances = true # Run the utterances script in the single.html layout to load https://utteranc.es comments 10-# utterancesRepo = \u0026#34;GHUsername/Repository.Name\u0026#34; # Utterances is enabled when this param is set 11-# utterancesLabel = \u0026#34;blog comments ✨💬✨\u0026#34; # The label needs to be manually added to your Github repository issues before configuring here 12-# utterancesTheme = \u0026#34;github-light\u0026#34; # Default: github-dark 13-# utterancesIssueTerm = \u0026#34;pathname\u0026#34; # Default: pathname 14+utterances = true # Run the utterances script in the single.html layout to load https://utteranc.es comments 15+utterancesRepo = \u0026#34;uli-heller/uli.heller.cool\u0026#34; # Utterances is enabled when this param is set 16+utterancesLabel = \u0026#34;blog comments ✨💬✨\u0026#34; # The label needs to be manually added to your Github repository issues before configuring here 17+utterancesTheme = \u0026#34;github-light\u0026#34; # Default: github-dark 18+utterancesIssueTerm = \u0026#34;pathname\u0026#34; # Default: pathname 19 20 # Enable or disable Giscus comments globally. Default to false. 21 # giscus = true Einrichten der App Link aufrufen: UtterancesApp Nutzer auswählen: uli-heller Repo auswählen: uli.heller.cool Zugriff erlauben: Metadaten lesen Issues lesen und schreiben Hinweis: Wenn man das einmalige Einrichten der \u0026quot;App\u0026quot; vergisst, dann erscheint beim Nutzen der Kommentarfunktion diese Fehlermeldung:\nError: utterances is not installed on uli-heller/uli.heller.cool. If you own this repo, install the app. Read more about this change in the PR.\nKommentarfunktion aus Anwendersicht Nach der Aktivierung erscheint am unteren Bildschirmrand ein Kommentarfeld. Um einen Kommentar hinzuzufügen, muß man sich bei Github anmelden und irgendwelche Privilegien an \u0026quot;utterances.es\u0026quot; erteilen.\nOder auch hier:\nKommentarfunktion aus \u0026quot;meiner\u0026quot; Sicht Hier erste Eindrücke:\nIch bekomme eine Email mit dem Hinweis auf den neuen Kommentar/das neue Ticket\nLeider sehe ich in der Email nicht den Inhalt der Kommentars - dazu muß ich auf Github nachschauen\nFür Folgekommentare scheint es keine Emails zu geben!\nIn meinem Github-Projekt uli.heller.cool erscheinen die Kommentare als GithubIssues. Sie können von jedem eingesehen werden!\nWertung Das Einrichten/Aktivieren hat schonmal sehr einfach funktioniert. Dafür braucht's einmalig 5 Minuten.\nAuf der Webseite von utteranc.es sieht man \u0026quot;unten\u0026quot; viele Kommentare. Die wirken sehr unübersichtlich. Also: Wenn es zu einem Artikel viele Kommentare gibt, dann hat die Kommentarfunktion gewisse Probleme in der Darstellung!\nDie Kommentare erscheinen als GithubIssues im Github-Projekt. Sie sind genauso wie alle meine Texte für jeden einsehbar. Vertrauliche Informationen sollten also NICHT in Kommentaren eingefügt werden!\nLinks Github - Hugo-Clarity Utteranc.es Github - uli.heller.cool Historie 2025-01-13: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-13_hugo-kommentare/","section":"blog","tags":["hugo","clarity"],"title":"Hugo-Clarity: Kommentare aktivieren"},{"body":" Hier beschreibe ich, wie ich DependencyLocking in meinen Gradle-Projekten aktiviere und ein Problem, welches dabei manchmal auftritt.\nBeispielprojekt Mein Beispielprojekt liegt hier: github:java-example-gradle-dependency-locking.\nDependency-Locking aktivieren 1--- build.gradle --- 2index 4552994..aedb683 100644 3@@ -9,6 +9,10 @@ group = \u0026#39;com.example\u0026#39; 4 version = \u0026#39;0.0.1-SNAPSHOT\u0026#39; 5 6 java { 7 sourceCompatibility = \u0026#39;17\u0026#39; 8 } 9 10+dependencyLocking { 11+ lockAllConfigurations() 12+} 13+ 14 repositories { 15 mavenCentral() 16 } Versionen festschreiben 1$ ./gradlew dependencies --write-locks 2To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/8.12/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation. 3Daemon will be stopped at the end of the build 4 5\u0026gt; Task :dependencies 6 7------------------------------------------------------------ 8Root project \u0026#39;java-example-gradle-dependency-locking\u0026#39; 9------------------------------------------------------------ 10... 11You can use \u0026#39;--warning-mode all\u0026#39; to show the individual deprecation warnings and determine if they come from your own scripts or plugins. 12 13For more on this, please refer to https://docs.gradle.org/8.12/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. 14 15BUILD SUCCESSFUL in 5s 161 actionable task: 1 executed Es wird die Datei \u0026quot;gradle.lockfile\u0026quot; erzeugt. Typischerweise speichert man die im Git-Repo und erhält damit reproduzierbare Programmversionen.\nEs werden immer diejenigen Versionen verwendet, die im \u0026quot;gradle.lockfile\u0026quot; drinstehen!\nBauen mit festgeschriebenen Versionen Das Bauen funktioniert wie gewohnt:\n1$ ./gradlew build 2Daemon will be stopped at the end of the build 3\u0026gt; Task :compileJava 4\u0026gt; Task :processResources NO-SOURCE 5\u0026gt; Task :classes 6... 7BUILD SUCCESSFUL in 9s 84 actionable tasks: 4 executed Test mit verschiedenen Versionen Zunächst passe ich in \u0026quot;build.gradle\u0026quot; diese Zeile an:\n1--- a/build.gradle 2+++ b/build.gradle 3@@ -1,6 +1,6 @@ 4 plugins { 5 id \u0026#39;java\u0026#39; 6- id \u0026#39;org.springframework.boot\u0026#39; version \u0026#39;3.4.1\u0026#39; 7+ id \u0026#39;org.springframework.boot\u0026#39; version \u0026#34;${springBootVersion}\u0026#34; 8 } Dann führe ich jeweils aus:\n1$ ./gradlew dependencies --write-locks -PspringBootVersion=3.4.1 2$ mv gradle.lockfile gradle.lockfile-3.4.1 Hier die Ergebnisse:\nVersion Datei 3.4.1 gradle.lockfile-3.4.1 3.2.1 gradle.lockfile-3.2.1 3.+ gradle.lockfile-3.+ Es fällt auf, dass die Variante \u0026quot;3.+\u0026quot; identisch zur \u0026quot;3.4.1\u0026quot; ist. Also gehe ich davon aus, dass\nein Eintrag in der \u0026quot;build.gradle\u0026quot; mit \u0026quot;3.+\u0026quot; zum Zeitpunkt, als 3.2.1 aktiv war, die Datei gradle.lockfile-3.2.1 erzeugt hätte ein weiterer Build-Versuch mit der Lockdatei von 3.2.1 zum Zeitpunkt mit aktiver 3.4.1-Version funktionieren sollte (zumindest verstehe ich den Sinn der Lockdatei so: Ich schreibe die Versionen fest und kann später noch damit bauen) Also:\n1$ cp gradle.lockfile-3.2.1 gradle.lockfile 2$ sed -i -e \u0026#34;s/3.4.1/3.+/\u0026#34; build.gradle 3$ ./gradlew build 4... 5FAILURE: Build failed with an exception. 6 7* What went wrong: 8Execution failed for task \u0026#39;:compileJava\u0026#39;. 9\u0026gt; Could not resolve all files for configuration \u0026#39;:compileClasspath\u0026#39;. 10 \u0026gt; Did not resolve \u0026#39;org.springframework:spring-beans:6.1.2\u0026#39; which has been forced / substituted to a different version: \u0026#39;6.2.1\u0026#39; 11 \u0026gt; Did not resolve \u0026#39;io.micrometer:micrometer-observation:1.12.1\u0026#39; which has been forced / substituted to a different version: \u0026#39;1.14.2\u0026#39; 12 \u0026gt; Did not resolve \u0026#39;org.springframework:spring-webmvc:6.1.2\u0026#39; which has been forced / substituted to a different version: \u0026#39;6.2.1\u0026#39; 13 \u0026gt; Did not resolve \u0026#39;org.springframework.boot:spring-boot:3.2.1\u0026#39; which has been forced / substituted to a different version: \u0026#39;3.4.1\u0026#39; 14 \u0026gt; Did not resolve \u0026#39;com.fasterxml.jackson.core:jackson-core:2.15.3\u0026#39; which has been forced / substituted to a different version: \u0026#39;2.18.2\u0026#39; 15... Klappt also leider überhaupt nicht. Da sind noch Forschungsarbeiten notwendig!\nHier die Gradle-Doku: Running a build with lock state present\n... The complete validation is as follows:\nExisting entries in the lock state must be matched in the build\nA version mismatch or missing resolved module causes a build failure Resolution result must not contain extra dependencies compared to the lock state\nAlso:\nIch hatte ein völlig falsches Verständnis vom DepencendyLocking Ich dachte, die gelockten Versionen werden für den Build verwendet - das ist falsch Die gelockten Versionen werden mit den gefundenen Versionen verglichen und bei Abweichungen wird abgebrochen - das entspricht genau der Beobachtung Test mit LockState.LENIENT 1diff --git a/build.gradle b/build.gradle 2index c40fb59..b689c75 100644 3--- a/build.gradle 4+++ b/build.gradle 5@@ -10,6 +10,7 @@ version = \u0026#39;0.0.1-SNAPSHOT\u0026#39; 6 sourceCompatibility = \u0026#39;17\u0026#39; 7 8 dependencyLocking { 9+ lockMode = LockMode.LENIENT 10 lockAllConfigurations() 11 } Damit gibt es zwar keine Fehlermeldung mehr, jedoch wird trotz 3.2.1-er-Lock die Version 3.4.1 eingebaut.\nTest ohne SpringDependencyManagement-Plugin In der Diskussion im Gradle-Forum wurde ich darauf hingewiesen, dass ich besser ohne SpringDependencyManagement-Plugin arbeite.\nHier die Umstellungen an github:java-example-gradle-dependency-locking:\n1--- build-springdependencymanagement.gradle\t2025-01-12 10:33:13.414939719 +0100 2+++ build.gradle\t2025-01-12 10:27:43.199982198 +0100 3@@ -3,8 +3,6 @@ 4 id \u0026#39;org.springframework.boot\u0026#39; version \u0026#34;${springBootVersion}\u0026#34; 5 } 6 7-apply plugin: \u0026#39;io.spring.dependency-management\u0026#39; 8- 9 group = \u0026#39;com.example\u0026#39; 10 version = \u0026#39;0.0.1-SNAPSHOT\u0026#39; 11 12@@ -22,5 +20,6 @@ 13 } 14 15 dependencies { 16+\timplementation platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES) 17 implementation \u0026#39;org.springframework.boot:spring-boot-starter-web\u0026#39; 18 } Damit erhalte ich qualitativ die gleichen Fehler, allerdings sind die Fehlermeldungen aussagekräftiger:\n1java-example-gradle-dependency-locking$ ./gradlew build -PspringBootVersion=3.+ 2To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/8.12/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation. 3Daemon will be stopped at the end of the build 4\u0026gt; Task :compileJava FAILED 5 6FAILURE: Build failed with an exception. 7 8* What went wrong: 9Execution failed for task \u0026#39;:compileJava\u0026#39;. 10\u0026gt; Could not resolve all files for configuration \u0026#39;:compileClasspath\u0026#39;. 11 \u0026gt; Could not resolve org.springframework.boot:spring-boot-dependencies:3.4.1. 12 Required by: 13 root project : 14 \u0026gt; Cannot find a version of \u0026#39;org.springframework.boot:spring-boot-dependencies\u0026#39; that satisfies the version constraints: 15 Dependency path \u0026#39;com.example:java-example-gradle-dependency-locking:0.0.1-SNAPSHOT\u0026#39; --\u0026gt; \u0026#39;org.springframework.boot:spring-boot-dependencies:3.4.1\u0026#39; 16 Constraint path \u0026#39;com.example:java-example-gradle-dependency-locking:0.0.1-SNAPSHOT\u0026#39; --\u0026gt; \u0026#39;org.springframework.boot:spring-boot-dependencies:{strictly 3.2.1}\u0026#39; because of the following reason: dependency was locked to version \u0026#39;3.2.1\u0026#39; 17 18\u0026gt; There is 1 more failure with an identical cause. 19 20* Try: 21\u0026gt; Run with --stacktrace option to get the stack trace. 22\u0026gt; Run with --info or --debug option to get more log output. 23\u0026gt; Run with --scan to get full insights. 24\u0026gt; Get more help at https://help.gradle.org. 25 26BUILD FAILED in 5s 271 actionable task: 1 executed Locken der Plugin-Versionen In der Diskussion im Gradle-Forum wurde ich darauf hingewiesen, dass das Hauptproblem bei der Version des SpringBoot-Plugins liegt. Diese Version habe ich nicht gelockt und später dann auf der Version des SpringBoot-Plugins die vom der SpringBoot-BOM abgeleitet.\nEs gibt diese Alternativen zur Korrektur:\nVerwendung von \u0026quot;SpringBootPlugin.BOM_COORDINATES\u0026quot; vermeiden\n1--------------------------------- build.gradle --------------------------------- 2index ddc7b75..bdb8d78 100644 3@@ -20,6 +20,6 @@ repositories { 4 } 5 6 dependencies { 7- implementation platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES) 8+ implementation platform(\u0026#34;org.springframework.boot:spring-boot-dependencies:${springBootVersion}\u0026#34;) 9 implementation \u0026#39;org.springframework.boot:spring-boot-starter-web\u0026#39; 10 } Plugin-Version auch locken\n1--------------------------------- build.gradle --------------------------------- 2index ddc7b75..fea4dd4 100644 3@@ -1,3 +1,9 @@ 4+buildscript { 5+ configurations.classpath { 6+ resolutionStrategy.activateDependencyLocking() 7+ } 8+} 9+ 10 plugins { 11 id \u0026#39;java\u0026#39; 12 id \u0026#39;org.springframework.boot\u0026#39; version \u0026#34;${springBootVersion}\u0026#34; Ich habe beide Varianten getestet. Sie funktionieren beide! Super! Vielen Dank an Björn Kautler vom Gradle-Forum!\nVersionen Getestet mit\nGradle-8.12 Links github:java-example-gradle-dependency-locking Gradle-Doku: Running a build with lock state present Gradle forum: Subproject downloads dependencies higher version than in lockfiles Historie 2025-01-12: Lösung mit Plugin-Lock 2025-01-12: Fehlermeldungen ohne SpringDependencyManagement-Plugin 2025-01-12: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-12_gradle-dependency-locking/","section":"blog","tags":["gradle"],"title":"Gradle: Dependency-Locking und Probleme"},{"body":" Bei der Neuanlage eines GOCRYPTFS wird traditionell der Masterkey angezeigt. Diesen soll man sich zur Sicherheit merken, damit man im Fall der Fälle immer noch auf die gespeicherten Daten zugreifen kann.\nMan muß ihn unter Verschluß halten, denn wer immer den Masterkey kennt, der kann auch auf die Daten zugreifen.\nDie Empfehlung ist, den Masterkey auszudrucken und abzuheften.\nProblem Wenn man den Masterkey mal braucht, muß man ihn abtippen.\nLösung Ausdruck mit QR-Code, dann kann man den Masterkey einscannen.\nAnwendung Voraussetzung: gocryptfs-2.4.0.54 oder neuer\n1$ ./gocryptfs --version 2gocryptfs v2.4.0.54.qrcode; go-fuse v2.5.0; 2025-01-03 go1.23.2 linux/amd64 3 4$ mkdir encrypted 5 6$ ./gocryptfs --init --qrcode encrypted 7Choose a password for protecting your files. 8Password: 1 9Repeat: 1 10 11Your master key is: 12 13 f5445574-1f3068e3-0f9f47f0-998f25da- 14 8d0588e1-e61a28a1-10a81763-6bd583b8 15 16QRCode: 17▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ 18█ ▄▄▄▄▄ ██▄▀▀ █▀ ▀█ █ █ ▄▄▄▄▄ █ 19█ █ █ █▄ ▀▄██▀ ██▀██████ █ █ █ 20█ █▄▄▄█ ██▀▄███▀ ▄ █ █ ▄█ █▄▄▄█ █ 21█▄▄▄▄▄▄▄█ ▀ █ ▀▄▀▄▀ ▀▄▀ ▀▄█▄▄▄▄▄▄▄█ 22█ ▄▄▀ ▄▄ ▄█ █ ▄█ █▄█▄ ██ ███▄█▀█ 23█ █ ▄▀ ▄▀▀▄█▀█ ▀█▀▀▀▄▀▄█ ▄▄▀ ▄▀▄█ 24████▀█ ▄▀ ██▀ ▄▄█ ▄█ ██ █ █▄█▄ █ 25█ ▄▄▀▀█▄▄▀ ▀▄ ▀▀▀▄ █▀▀ ██▀█ ██ ▄▀▄█ 26█ ▀▄▄██▄▄█▀▀ ▄ ██ ██ ██▀ █▄█▄ █ 27██▀▄█▀█▄ ▄ ▀▄ █▀█▀ ▀▄ ▄▀ ▄█▀▄ ██▄█ 28█▄ ▄▄▀▄▄ ▄█ ███ ███ ███ █▄█▄ █ 29█▄▀ ▄█▄▄▄▄█▄█▄ ▄▀▀▀ ▀ ▀▀█ ▀▄ █▀▄▀ █ 30█▄█████▄█▀▀ █ █▄▄ █ █▀ ▄▄▄ █▀ █ 31█ ▄▄▄▄▄ █ ▀██▀█▀█ ▄▀▄▀█▄ █▄█ ▄▄ █ 32█ █ █ █▄ ██ ██▄ ▄█ ██▄▄▄▄ █ ▄█ 33█ █▄▄▄█ █ █▄▀▄▀▀▀█▀▄▀▀▀ █▀██▀ ▄▄ ▄█ 34█▄▄▄▄▄▄▄█▄▄█▄█▄▄█▄▄█▄▄▄▄█▄██▄▄██▄▄█ 35 36 37If the gocryptfs.conf file becomes corrupted or you ever forget your password, 38there is only one hope for recovery: The master key. Print it to a piece of 39paper and store it in a drawer. This message is only printed once. 40The gocryptfs filesystem has been created successfully. 41You can now mount it using: gocryptfs encrypted MOUNTPOINT Die Ausgaben oben sehen etwas verstrubbelt aus, weil der Zeilenabstand zub groß ist. Untenstehende Links liefern eine bessere Ansicht:\nAusgabe mit \u0026quot;--qrcode\u0026quot;: master-key-qrcode.txt Ausgabe ohne \u0026quot;--qrcode\u0026quot;: master-key.txt Links Homepage: gocryptfs GITHUB: gocryptfs GITHUB: Mein Fork mit QRCode Versionen Getestet mit\nUbuntu-22.04 und gocryptfs-2.4.0.53 Ubuntu-20.04 und gocryptfs-2.4.0.53 Historie 2025-01-11: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-11_gocryptfs-qrcode/","section":"blog","tags":["crypto","linux","ubuntu"],"title":"Verschlüsseltes Dateisystem mit GOCRYPTFS - QRCode für den MasterKey"},{"body":" Beim Bauen von GOCRYPTFS mit PROOT bin ich über eine Fehlermeldung bezüglich zu langer Dateinamen gestolpert.\nFehlermeldung beim Bauen von GOCRYPTFS 1... 2rm -f debian/statfs.1 3dh_auto_clean 4make[1]: Leaving directory \u0026#39;/src/gocryptfs/gocryptfs-2.4.0\u0026#39; 5 dh_autoreconf_clean -O--buildsystem=golang -O--builddirectory=_build 6 dh_clean -O--buildsystem=golang -O--builddirectory=_build 7 dpkg-source -b . 8dpkg-source: info: using source format \u0026#39;3.0 (quilt)\u0026#39; 9dpkg-source: info: building gocryptfs using existing ./gocryptfs_2.4.0.orig.tar.xz 10dpkg-source: warning: upstream signing key but no upstream tarball signature 11tar: gocryptfs-2.4.0/tests/example_filesystems/content/longname_255_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: Cannot open: File name too long 12tar: gocryptfs-2.4.0/tests/example_filesystems/v1.1-reverse-plaintextnames/longname_255_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: Cannot open: File name too long 13tar: gocryptfs-2.4.0/tests/example_filesystems/v1.1-reverse/longname_255_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: Cannot open: File name too long 14tar: gocryptfs-2.4.0/tests/example_filesystems/v1.3-reverse/longname_255_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: Cannot open: File name too long 15tar: Exiting with failure status due to previous errors 16dpkg-source: error: tar -xf - --no-same-permissions --no-same-owner subprocess returned exit status 2 17dpkg-buildpackage: error: dpkg-source -b . subprocess returned exit status 29 18Probleme beim Auspacken oder bauen - EXIT Die Fehlermeldung ist aufgetreten beim Bauen mit PROOT. Ich hatte sie früher nicht beobachtet, als ich noch CHROOT verwendet habe.\nTest mit langem Dateinamen Direkt auf meinem Arbeitsplatz 1$ LEN=255; touch \u0026#34;$(expr substr \u0026#34;$(seq 1 200|tr -d \u0026#34;\\n\u0026#34;)\u0026#34; 1 $LEN)\u0026#34;; rm -f 12345* 2$ LEN=256; touch \u0026#34;$(expr substr \u0026#34;$(seq 1 200|tr -d \u0026#34;\\n\u0026#34;)\u0026#34; 1 $LEN)\u0026#34;; rm -f 12345* 3touch: \u0026#39;1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211\u0026#39; kann nicht berührt werden: Der Dateiname ist zu lang Direkt auf meinem Arbeitsplatz kann ich Dateien mit einer Länge von 255 Zeichen anlegen. 256 Zeichen klappen nicht mehr!\nInnerhalb von PROOT 1$ proot -S build-proot-jammy-amd64/rootfs/ -w / bash 2# LEN=255; touch \u0026#34;$(expr substr \u0026#34;$(seq 1 200|tr -d \u0026#34;\\n\u0026#34;)\u0026#34; 1 $LEN)\u0026#34;; rm -f 12345* 3touch: cannot touch \u0026#39;123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121\u0026#39;: File name too long 4# LEN=254; touch \u0026#34;$(expr substr \u0026#34;$(seq 1 200|tr -d \u0026#34;\\n\u0026#34;)\u0026#34; 1 $LEN)\u0026#34;; rm -f 12345* 5# exit Innerhalb von PROOT kann ich Dateien mit einer Länge von 254 Zeichen anlegen. 255 Zeichen klappen nicht mehr!\nTest mit Bind-Mount 1$ mkdir mnt 2$ proot -S build-proot-jammy-amd64/rootfs/ -w / -b mnt:/mnt bash 3# cd /mnt 4# LEN=255; touch \u0026#34;$(expr substr \u0026#34;$(seq 1 200|tr -d \u0026#34;\\n\u0026#34;)\u0026#34; 1 $LEN)\u0026#34; 5touch: cannot touch \u0026#39;123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121\u0026#39;: File name too long 6# LEN=254; touch \u0026#34;$(expr substr \u0026#34;$(seq 1 200|tr -d \u0026#34;\\n\u0026#34;)\u0026#34; 1 $LEN)\u0026#34; 7# exit 8S ls mnt 912345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012 10$ rm -rf mnt Auch bei Bind-Mounts gehen nur 254 Zeichen!\nTest mit \u0026quot;proot-5.4.0.3\u0026quot; 1$ proot -S build-proot-jammy-amd64/rootfs/ -w / bash 2# LEN=255; touch \u0026#34;$(expr substr \u0026#34;$(seq 1 200|tr -d \u0026#34;\\n\u0026#34;)\u0026#34; 1 $LEN)\u0026#34;; rm -f 12345* Mit 5.4.0.3 klappt's!\nLinks Homepage: Proot Github: Proot Github Issue: Max filename length: 254 vs 255 Github Pull Request: Max filename length: 254 vs 255 Github: Mein Proot-Fork Versionen Getestet mit\nUbuntu-20.04 und proot-5.4.0 (selbst kompiliert) Ubuntu-22.04 und proot-5.4.0 (selbst kompiliert) Ubuntu-22.04 und proot-5.4.0.3 (selbst kompiliert) Historie 2025-01-10: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-10_proot-dateiname-maxlen/","section":"blog","tags":["linux","ubuntu"],"title":"PROOT: Probleme bei langen Dateinamen"},{"body":"","link":"https://uli.heller.cool/tags/gimp/","section":"tags","tags":null,"title":"Gimp"},{"body":" Hier zeige ich, wie man mit GIMP ein abgerissenes Bild erzeugt, also sowas:\nAusgangsbild GIMP starten Ausgangsbild laden Datei (File) Öffnen... (Open...) \u0026quot;images/home-top.png\u0026quot; wählen Ansicht verkleinern Ansicht (View) Vergrößerung (Zoom) 25% Freie Auswahl - Bereich wählen Werkzeuge (Tools) Auswahlwerkzeuge (Selection Tools) Freie Auswahl (Free Select) \u0026quot;Kreisförmig\u0026quot; Auswahl verzerren Auswahl (Select) Verzerren... (Distort...) Schwellwert (Threshold): 0,500 Verteilen (Spread): 8 Körnigkeit (Granularity): 4 Glätten (Smooth): 2-\u0026gt;3 Horizontal glätten (Smooth horizontally): Ja Vertikal glätten (Smooth vertically): Ja OK Kopieren und neues Bild erstellen Bearbeiten (Edit) Kopieren (Copy) Datei (File) Erstellen (Create) Aus Zwischenablage (From clipboard) Erstes Bild einweißen Zurück zum ersten Bild (oben, linkes Bild) Auswahl (Select) Verzerren (Distort) OK Farben Vordergrund: Schwarz, Hintergrund: Weiß Wechseln Vordergrund: Weiß, Hintergrund: Schwarz Werkzeuge (Tools) Malwerkzeuge (Paint Tools) Füllen (Bucket Fill) Betroffener Bereich (Affected Area) Ganze Auswahl füllen (Fill whole selection) In den Auswahlbereich klicken -\u0026gt; wird mit weiß gefüllt Weißen Teil als Ebene einfügen Erstes Bild Werkzeuge (Tools) Auswahlwerkzeuge (Selection Tools) Freie Auswahl (Free Select) Bearbeiten (Edit) Kopieren (Copy) Zweites Bild Bearbeiten (Edit) Einfügen als... (Paste as...) Als einzelne Ebene einfügen (Paste as Single Layer) Unten rechts: Ebenen vertauschen Vereinen und Schatten Unten rechts: Rechte Maustaste Sichtbare Ebenen vereinen... (Merge Visible Layers...) OK (Merge) Filter (Filters) Licht und Schatten (Light and Shadow) Schlagschatten (veraltet)... (Drop Shadow (lagacy)...) VersatzX (OffsetX): 4 (oder auch 8) VersatzY (OffsetY): 4 (oder auch 8) Weichzeichnenradius (Blur radius): 15 Farbe (Color): Schwarz Deckkraft (Opacity): 60 OK Speichern Datei Speichern unter... images/home-top-abgerissen.xcf OK Exportieren unter... images/home-top-abgerissen.png OK Finales Ergebnis Dunkles Bild Links GIMP daemons-point.com: GIMP: Bildchen abreissen Versionen Getestet mit Ubutu-22.04 und GIMP-3.0.0-RC2.\nHistorie 2025-01-09: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-09_gimp-bild-abreissen/","section":"blog","tags":["gimp"],"title":"GIMP: Bild abreissen"},{"body":"","link":"https://uli.heller.cool/categories/kommandozeile/","section":"categories","tags":null,"title":"Kommandozeile"},{"body":" Manchmal brauche ich die Möglichkeit, auf der Kommandozeile einen QR-Code zu erzeugen. Klar: Eine PNG-Datei damit ist kein Problem. Ich hätte idealerweise den QR-Code gerne als Text. Da hilft QRTERMINAL!\nEinspielen Mittels Paketmanager 1sudo apt update 2sudo apt install qrterminal Funktioniert mit Ubuntu-24.04\nAus den Quellen 1git clone https://github.com/mdp/qrterminal.git 2cd qrterminal 3make Funktioniert mit allen Ubuntu-Varianten. Man benötigt zusätzlich diverse Entwicklerwerkzeuge, beispielsweise den Go-Compiler.\nVerwendung 1qrterminal (zeichenkette) 2qrterminal https://uli.heller.cool Probleme: Die Ausgaben können nicht ohne weiteres kopiert und in ein Textdokument eingefügt werden. Nachfolgende Passage habe ich erzeugt via Gnome-Terminal und \u0026quot;Als HTML kopieren\u0026quot;. Die vertikalen Abstände erscheinen wegen dem dafür ungünstigen Styling meiner Webseite. Davon abgesehen sieht die Ausgabe hier auf der Webseite ganz OK aus, leider ist die im Quellformat quasi unlesbar - das gefällt mir nicht!\nuli@uli-laptop:~$ qrterminal https://uli.heller.cool Erweiterung um Halfblocks Mein Fork mit dem Branch der Halfblock-Erweiterung\n1diff --git a/cmd/qrterminal/main.go b/cmd/qrterminal/main.go 2index 767b8ec..8073af5 100644 3--- a/cmd/qrterminal/main.go 4+++ b/cmd/qrterminal/main.go 5@@ -14,6 +14,7 @@ import ( 6 ) 7 8 var verboseFlag bool 9+var halfblocksFlag bool 10 var levelFlag string 11 var quietZoneFlag int 12 var sixelDisableFlag bool 13@@ -33,6 +34,7 @@ func getLevel(s string) qr.Level { 14 15 func main() { 16 flag.BoolVar(\u0026amp;verboseFlag, \u0026#34;v\u0026#34;, false, \u0026#34;Output debugging information\u0026#34;) 17+ flag.BoolVar(\u0026amp;halfblocksFlag, \u0026#34;H\u0026#34;, false, \u0026#34;Activate halfblocks\u0026#34;) 18 flag.StringVar(\u0026amp;levelFlag, \u0026#34;l\u0026#34;, \u0026#34;L\u0026#34;, \u0026#34;Error correction level\u0026#34;) 19 flag.IntVar(\u0026amp;quietZoneFlag, \u0026#34;q\u0026#34;, 2, \u0026#34;Size of quietzone border\u0026#34;) 20 flag.BoolVar(\u0026amp;sixelDisableFlag, \u0026#34;s\u0026#34;, false, \u0026#34;disable sixel format for output\u0026#34;) 21@@ -78,6 +80,14 @@ func main() { 22 cfg.WhiteChar = qrterminal.WHITE 23 } 24 25+ if halfblocksFlag { 26+ cfg.HalfBlocks = true 27+ cfg.BlackChar = qrterminal.BLACK_BLACK 28+ cfg.BlackWhiteChar = qrterminal.BLACK_WHITE 29+ cfg.WhiteBlackChar = qrterminal.WHITE_BLACK 30+ cfg.WhiteChar = qrterminal.WHITE_WHITE 31+ } 32+ 33 fmt.Fprint(os.Stdout, \u0026#34;\\n\u0026#34;) 34 qrterminal.GenerateWithConfig(content, cfg) 35 } Die Erweiterung ist sehr einfach. Die Halfblock-Funktionialität ist grundsätzlich schon in QRTERMINAL enthalten. Man kann sie nur via Kommandozeile nicht aktivieren. Das rüstet mein PullRequest nach. Dazu muß man dann die Option \u0026quot;-H\u0026quot; beim Aufruf angeben.\nKopierbare Ausgabe 1$ qrterminal -H https://uli.heller.cool 2 3█████████████████████████████ 4██ ▄▄▄▄▄ ██▄▀▀ ██ ▀█ ▄▄▄▄▄ ██ 5██ █ █ █▄ ▀▄█▄▀██ █ █ ██ 6██ █▄▄▄█ ██▀▄██▄ ██ █▄▄▄█ ██ 7██▄▄▄▄▄▄▄█ ▀ █ ▀▄▀ █▄▄▄▄▄▄▄██ 8██ ▄█▄ ▄▄▄█ █ █▄ ███▄█▀██ 9██ ▄█▀▀ ▄▄▄▄█▀█ ▀ █▄▄█▄ ▄██ 10███▀█▀ ▀▄▀▀██▀ ▄█▄ ▄█ █▄ ██ 11██▄▀█ ▄▄▄██▀ ▄ ▀▀▀██▄▀█▄ ▄██ 12██▄█▄▄██▄▄ ▄▄ █▄█▀ ▄▄▄ █▀▀██ 13██ ▄▄▄▄▄ █ █▀▀█ ▀▄ █▄█ █▄ ██ 14██ █ █ █▄▄█▀ ▄█▀▄ ▄ ▀▄▄██ 15██ █▄▄▄█ █ ▄ ▄ ▀█▀▀█▀█ ▀█▀▄██ 16██▄▄▄▄▄▄▄█▄█▄▄▄█▄▄▄██▄███▄▄██ 17▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ Die Ausgabe ist wesentlich kleiner und kann relativ problemlos kopiert werden!\nLinks Github: QRTERMINAL Mein Fork mit dem Branch der Halfblock-Erweiterung Versionen Getestet mit\nUbuntu-22.04 Ubuntu-20.04 Historie 2025-01-07: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-07_qrterminal-halfblocks/","section":"blog","tags":["linux","ubuntu"],"title":"QRTERMINAL: QR-Codes auf dem Terminal ausgeben"},{"body":"","link":"https://uli.heller.cool/about/","section":"about","tags":null,"title":""},{"body":"Diese \u0026quot;Seiten\u0026quot; enthalten (überwiegend) Texte und andere Informationen, die von mir gesammelt und/oder erstellt wurden. Bei gesammelten Informationen bemühe ich mich, Verweise auf die Quellen mitzuliefern. Falls ein solcher Verweis fehlt, so bitte ich um Hinweise, damit ich ihn ergänzen kann. Dies liegt mir SEHR am Herzen!\nDie Inhalte veröffentliche ich aktuell via Github. Wer die Inhalte auf den üblichen Wegen sichtet, wird dies wohl oder übel auch über Github erledigen. Ähnlich, wie man Videos über Youtube anschaut oder andere Dinge über Facebook, Instagram oder was auch immer.\nFür Nutzer bedeutet dies:\nDie Bereitstellung steht in keinerlei Zusammenhang mit mir persönlich oder irgend einem Stück Infrastruktur, auf das ich Einfluß habe Ich selbst habe keine Möglichkeit, Nutzerdaten zu erfassen, zu verarbeiten und/oder weiterzuleiten. Insbesondere kann ich nicht erkennen, wer meine Seiten sichtet. Ich kann auch keine Nutzungsstatistiken erstellen! Das bereitstellende Unternehmen Github hat Möglichkeiten, Nutzerdaten zu erfassen, zu verarbeiten und/oder weiterzuleiten. Details hierzu bitte bei Github sichten! Das bereitstellende Unternehmen Github stellt mir die Möglichkeiten zur Veröffentlichung unentgeltlich zur Verfügung. Es besteht keinerlei Auftragsverhältnis zwischen uns! Die Kommentarfunktion nutzt ebenfalls Mechanismen, die von Github bereitsgestellt werden. Kommentare werden dort gespeichert. Sie sind öffentlich einsehbar. Ich habe keinen Einfluss auf die Kommentare und kann sie auch nicht moderieren! Wer mit diesen Grundsätzen nicht einverstanden ist, der nutzt diese Seiten besser nicht!\nIch behalte mir vor, die Bereitstellung jederzeit auf einen anderen Mechanismus zu wechseln. Gründe hierfür können u.a. sein:\nGithub stellt die Funktion ein Github ändert seine Datenschutzbestimmungen auf eine für mich inakzeptable Weise Github stellt untragbare Gebühren in Rechnung Andere Angebote bieten wesentlich bessere Leistungen Auch hier bin ich für Tipps dankbar, falls im Nutzerkreis bessere Lösungen bekannt sind.\nDie Inhalte selbst erstelle ich nach bestem Wissen und in guter Absicht. Ich HOFFE, sie sind hilfreich. Dafür garantieren und haften kann ich leider nicht. Es kann also vorkommen, dass Informationen falsch sind oder dass sich gute Tipps als schädlich herausstellen. Sollte das tatsächlich vorkommen, so bitte ich um Rückmeldung. Ich werde versuchen, das dann als Folge zu korrigieren und besser darzustellen.\nDie Texte erstelle ich überwiegend am Wochenende oder morgens/abends in meiner Freizeit. Als Veröffentlichungsdatum setze ich Zeitpunkte in der Zukunft. Ich achte darauf, dass pro Tag nicht mehr als ein Artikel veröffentlicht wird. Der Veröffentlichungszeitpunkt hängt nur sehr grob mit dem Erstellungszeitpunkt zusammen.\nIch nutze für die Erstellung keine KI (gekünstelte Intelligenz).\nHistorie 2025-01-06: Erste Version ","link":"https://uli.heller.cool/about/this/","section":"about","tags":null,"title":"Diese Seiten"},{"body":" Hier zeige ich, wie ich GOCRYPTFS aus den Github-Quellen baue.\nClonen 1$ git clone https://github.com/rfjakob/gocryptfs.git 2Klone nach \u0026#39;gocryptfs\u0026#39;... 3remote: Enumerating objects: 13034, done. 4remote: Counting objects: 100% (1923/1923), done. 5remote: Compressing objects: 100% (456/456), done. 6remote: Total 13034 (delta 1569), reused 1467 (delta 1467), pack-reused 11111 (from 1) 7Empfange Objekte: 100% (13034/13034), 5.65 MiB | 9.29 MiB/s, fertig. 8Löse Unterschiede auf: 100% (9235/9235), fertig. Abhängigkeiten installieren 1$ sudo apt install golang 2$ sudo apt install libssl-dev gcc pkg-config Bauen 1$ cd gocryptfs/ 2 3$ ./build.bash 4go: downloading github.com/hanwen/go-fuse/v2 v2.5.0 5go: downloading github.com/spf13/pflag v1.0.5 6go: downloading golang.org/x/crypto v0.18.0 7go: downloading golang.org/x/sys v0.16.0 8go: downloading github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 9go: downloading golang.org/x/term v0.16.0 10go: downloading github.com/rfjakob/eme v1.1.2 11go: downloading github.com/aperturerobotics/jacobsa-crypto v1.0.2 12gocryptfs v2.4.0-50-g1464f9d; go-fuse v2.5.0; 2025-01-01 go1.21.4 linux/amd64 13 14$ ./gocryptfs --version 15gocryptfs v2.4.0-50-g1464f9d; go-fuse v2.5.0; 2025-01-01 go1.21.4 linux/amd64 16 17$ ./gocryptfs -hh 2\u0026gt;\u0026amp;1|grep fido2 18 --fido2 string Protect the masterkey using a FIDO2 token instead of a password 19 --fido2-assert-option fido2-assert -t Options to be passed with fido2-assert -t Es sieht so aus, als wären die Fido2-Optionen nun \u0026quot;komplett\u0026quot;.\nFido2-Tests 1$ mkdir encrypted decrypted 2 3$ gocryptfs --init --fido2 /dev/hidraw2 \\ 4 --fido2-assert-option pin=false \\ 5 --fido2-assert-option uv=false \\ 6 --fido2-assert-option up=false \\ 7 encrypted 8FIDO2 Register: interact with your device ... 9 # Nitrokey leuchtet blau -\u0026gt; berühren 10FIDO2 Secret: interact with your device ... 11 12Your master key is: 13 14 71882563-9eeaea3b-8b217e71-f40ce40c- 15 315451ba-7ffcdb6b-2d86223c-748de9f5 16 17If the gocryptfs.conf file becomes corrupted or you ever forget your password, 18there is only one hope for recovery: The master key. Print it to a piece of 19paper and store it in a drawer. This message is only printed once. 20The gocryptfs filesystem has been created successfully. 21You can now mount it using: gocryptfs encrypted MOUNTPOINT 22 23$ ./gocryptfs --fido2 /dev/hidraw2 encrypted decrypted 24FIDO2 Secret: interact with your device ... 25Decrypting master key 26Filesystem mounted and ready. 27 28$ fusermount -u decrypted Mit den Optionen \u0026quot;--fido2-assert-option\u0026quot; ändert sich der Ablauf so, dass\nbeim Initialisieren das Fido2-Gerät genau einmal berührt werden muß beim Einbinden das Fido2-Gerät nicht berührt werden muß Besonders der zweite Punkt ist sicherheitstechnisch nicht optimal. Wenn sich jemand unerkannt im Hintergrund auf dem Arbeitsplatzrechner anmeldet, dann kann er unerkannt das verschlüsselte Dateisystem einbinden. NICHT VERWENDEN!\nNotizen 1$ cd gocryptfs/ 2$ go build 3go build 4go: downloading github.com/hanwen/go-fuse/v2 v2.5.0 5go: downloading github.com/spf13/pflag v1.0.5 6go: downloading golang.org/x/crypto v0.18.0 7go: downloading github.com/rfjakob/eme v1.1.2 8go: downloading golang.org/x/sys v0.16.0 9go: downloading golang.org/x/term v0.16.0 10go: downloading github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 11go: downloading github.com/aperturerobotics/jacobsa-crypto v1.0.2 12go build github.com/rfjakob/gocryptfs/v2/internal/stupidgcm: 13# pkg-config --cflags -- libcrypto 14Package libcrypto was not found in the pkg-config search path. 15Perhaps you should add the directory containing `libcrypto.pc\u0026#39; 16to the PKG_CONFIG_PATH environment variable 17Package \u0026#39;libcrypto\u0026#39;, required by \u0026#39;virtual:world\u0026#39;, not found 18pkg-config: exit status 1 19 20$ ./build.bash 21./build.bash 22go build github.com/rfjakob/gocryptfs/v2/internal/stupidgcm: 23# pkg-config --cflags -- libcrypto 24Package libcrypto was not found in the pkg-config search path. 25Perhaps you should add the directory containing `libcrypto.pc\u0026#39; 26to the PKG_CONFIG_PATH environment variable 27Package \u0026#39;libcrypto\u0026#39;, required by \u0026#39;virtual:world\u0026#39;, not found 28pkg-config: exit status 1 29 30$ sudo apt install libssl-dev gcc pkg-config 31... 32 33$ go build 34 35$ ./gocryptfs --version 36gocryptfs [GitVersion not set - please compile using ./build.bash]; go-fuse v2.5.0; 0000-00-00 go1.21.4 linux/amd64 37 38$ ./build.bash 39gocryptfs v2.4.0-50-g1464f9d; go-fuse v2.5.0; 2025-01-01 go1.21.4 linux/amd64 40 41$ ./gocryptfs --version 42gocryptfs v2.4.0-50-g1464f9d; go-fuse v2.5.0; 2025-01-01 go1.21.4 linux/amd64 43 44$ ./gocryptfs -hh 2\u0026gt;\u0026amp;1|grep fido2 45 --fido2 string Protect the masterkey using a FIDO2 token instead of a password 46 --fido2-assert-option fido2-assert -t Options to be passed with fido2-assert -t Links Homepage: gocryptfs GITHUB: gocryptfs Versionen Getestet mit\nUbuntu-22.04 und Github:gocryptfs \u0026quot;master\u0026quot; vom 2025-01-01 Historie 2025-01-06: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-06_gocryptfs-bauen/","section":"blog","tags":["crypto","linux","ubuntu"],"title":"GOCRYPTFS bauen aus den Github-Quellen"},{"body":" Hier beschreibe ich die Korrektur von diversen Kleinproblemen, die mir bei dem Theme \u0026quot;Clarity\u0026quot; aufgefallen sind. Diese (und auch andere) habe ich aufgelistet in Störende Details bei Hugo\nClarity: Aktiven Eintrag im Menü markieren TLDR Hintergrundfarbe aktives Menu: themes/hugo-clarity/assets/sass/_components.sass \u0026amp;_active - background-color - var(--choice-bg) Textfarbe aktives Menu: themes/hugo-clarity/assets/sass/_components.sass \u0026amp;_active - color - var(--text) Abstand - nav_parent nav_active themes/hugo-clarity/assets/sass/_components.sass \u0026amp;_parent - margin - 0.25rem 0 0 0 Rundung themes/hugo-clarity/assets/sass/_components.sass \u0026amp;_parent - border-radius - 0.5rem 0.5rem 0 0 Dark\nNeue Variablen in \u0026quot;themes/hugo-clarity/assets/sass/_variables.sass\u0026quot;: --nav-bg: var(--bg) --nav-text: var(--haze) --nav-active-bg: var(--choice-bg) --nav-active-text: var(--text) Werte für \u0026quot;dark\u0026quot;: --nav-bg: #0077b8 (TBD: Variable) --nav-text: var(--haze) (TBD: notwendig?) --nav-active-bg: var(--choice-bg) (TBD: notwendig?) --nav-active-text: var(--text) (TBD: notwendig?) Werte setzen in \u0026quot;themes/hugo-clarity/assets/sass/_components.sass\u0026quot;: .nav - background-color .nav - color .nav \u0026amp;active - background-color .nav \u0026amp;active - color .nav \u0026amp;header - background-color Detailanalyse - Hintergrundfarbe \u0026quot;Eigentlich\u0026quot; ist das gar kein Problem. Der aktive Eintrag ist markiert. Ich konnte ihn zumindest auf meinem Laptop einfach nicht richtig erkennen:\nSichtung: Welche ColorCodes werden verwendet?\nMarkierter Eintrag: #0d3042 Menü: #002538 Tauchen diese ColorCodes im Thema Clarity auf?\nfind themes/hugo-clarity -type f|xargs grep -l '#0d3042' -\u0026gt; nicht gefunden find themes/hugo-clarity -type f|xargs grep -l '#002538' -\u0026gt; themes/hugo-clarity/assets/sass/_variables.sass Detailsichtung: Landet in Variable \u0026quot;bg\u0026quot;. Führt leider nicht wirklich weiter!\nWo wird \u0026quot;menu\u0026quot; verwendet?\nfind themes/hugo-clarity -type f|xargs grep -l menu -\u0026gt; u.a. \u0026quot;_components.sass\u0026quot; Sichtung/Anpassung \u0026quot;_components.sass\u0026quot;\n1diff --git a/themes/hugo-clarity/assets/sass/_components.sass b/themes/hugo-clarity/assets/sass/_components.sass 2index 59e784b..b688061 100644 3--- a/themes/hugo-clarity/assets/sass/_components.sass 4+++ b/themes/hugo-clarity/assets/sass/_components.sass 5@@ -11,7 +11,7 @@ 6 justify-content: space-between 7 @include content 8 \u0026amp;_active 9- background-color: rgba($light, 0.05) 10+ background-color: $haze //rgba($light, 0.05) 11 border-radius: 0.25rem 12 \u0026amp;, \u0026amp;_body 13 \u0026amp;_icon Damit:\nKlar, so kann es nicht bleiben! Man kann die Beschriftung nicht erkennen. Außerdem stört der \u0026quot;Abstand\u0026quot;. Und bei Umstellung auf \u0026quot;Dark\u0026quot; sieht es ganz finster aus!\nClarity: Breite Notwendige Anpassungen:\nthemes/hugo-clarity/assets/sass/_base.sass max-width: 1920px -\u0026gt; 19200px themes/hugo-clarity/assets/sass/_variables.sass --maxWidth: 1440px -\u0026gt; 14400px themes/hugo-clarity/assets/sass/_components.sass .sidebar max-width: 540px ... klappt nicht so richtig! Eventuell: themes/hugo-clarity/assets/sass/_utils.sass: grid-template-columns: 70% 1fr Hier die Darstellung danach:\nClarity: Inhaltsverzeichnis Bei der Clarity-Beschreibung steht, dass man mit dem Shortcode {{ .TableOfContents }} ein Inhaltsverzeichnis erzeugen kann. Das habe ich ausprobiert. Es funktioniert für mich nicht.\nWenn ich in den Seitenkopf dies hinzufüge, dann erscheint ein Inhaltsverzeichnis:\n1toc: true Danach habe ich versucht, die in Adding a floating TOC to the Hugo-Clarity theme | No D in Rogers vorgeschlagenen Änderungen umzusetzen. Bei mir haben die NICHT funktioniert. Vermutlich klappt's nur bei älteren Versionen von Hugo-Clarity?\nClarity: Linker Rand Beim Rumspielen ist mir aufgefallen, dass der linke Rand nicht \u0026quot;stimmt\u0026quot;:\nDiese Änderungen korrigieren das:\n1diff --git a/themes/hugo-clarity/assets/sass/_components.sass b/themes/hugo-clarity/assets/sass/_components.sass 2index 49a902f..fb69056 100644 3--- a/themes/hugo-clarity/assets/sass/_components.sass 4+++ b/themes/hugo-clarity/assets/sass/_components.sass 5@@ -142,7 +142,7 @@ 6 .content, .footer 7 padding: 1.5rem 8 @media screen and (min-width: 1441px) 9- padding: 1.5rem 0 10+ //padding: 1.5rem 0 11 12 .content 13 padding-top: 5rem Hier der \u0026quot;richtige\u0026quot; Rand:\nLinks Github - Hugo-Clarity Störende Details bei Hugo Hugo: Nochmal umstellen auf das Theme Clarity Hugo: Kurztest vom Theme Clarity Hugo: Neustart mit dem Theme Clarity Historie 2025-01-05: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-05_hugo-clarity-probleme/","section":"blog","tags":["hugo","clarity"],"title":"Hugo-Clarity: Diverse Kleinprobleme"},{"body":" GOCRYPTFS stellt ein verschlüsseltes Dateisystem zur Verfügung. Die verschlüsselte Version kann mit Sicherungsprogrammen wie RESTIC gesichert werden, aus den Sicherungen können keinerlei Informationen \u0026quot;hergeleitet\u0026quot; werden.\nProblem: Da Dateinamen und Dateiinhalte verschlüsselt sind, ist eines selektives Restaurieren schwierig! Einfacher wird es, wenn man auf das Verschlüsseln der Dateinamen verzichtet!\nÜbliches Verschlüsseln 1$ cd /tmp 2$ mkdir encrypted 3$ mkdir decrypted 4$ gocryptfs --init encrypted 5Choose a password for protecting your files. 6Password: 7Repeat: 8 9Your master key is: 10 11 bce87b84-c2b6152c-7a74cbb3-8c7e8d37- 12 804741c2-46cd797a-9b5571ff-7565757c 13 14If the gocryptfs.conf file becomes corrupted or you ever forget your password, 15there is only one hope for recovery: The master key. Print it to a piece of 16paper and store it in a drawer. This message is only printed once. 17The gocryptfs filesystem has been created successfully. 18You can now mount it using: gocryptfs encrypted MOUNTPOINT 19 20$ gocryptfs encrypted decrypted 21Password: 22Decrypting master key 23Filesystem mounted and ready. 24 25$ ls decrypted 26$ ls encrypted/ 27gocryptfs.conf gocryptfs.diriv 28 29$ for i in $(seq 1 10); do date \u0026gt;decrypted/${i}.date.txt; done 30 31$ ls decrypted/ 3210.date.txt 1.date.txt 2.date.txt 3.date.txt 4.date.txt 5.date.txt 6.date.txt 7.date.txt 8.date.txt 9.date.txt 33$ ls encrypted/ 341x7SD2INc6DkDO0T6lnqyw HAXcjyWFCF5ULwojWGWaIw w91ojRUPJgxvG1AwwmaGZA Z_2TpW9A_sg2fOR3CBJVxQ 35gocryptfs.conf HNAN6gmsrZSPV5tIESVTzw wn1idkX-BCpC2ia4tRVZCw z6PGa542pDTwe_BeZJmCvA 36gocryptfs.diriv rx5PwbMrl7RYnXyA3UBIWw x3saIKGb-DxtpWVbdYOo7Q ZCsV-dxiA_qowF7h4-H6rw 37 38$ fusermount -u decrypted Man sieht: Die Dateinamen im verschlüsselten Bereich sind verfremdet. Es ist unklar, welcher verschlüsselte Dateinamen welchem Klartextnamen entspricht!\nVerschlüsseln mit Klartext-Dateinamen 1$ cd /tmp 2$ mkdir encrypted-k 3$ mkdir decrypted-k 4$ gocryptfs --init --plaintextnames encrypted-k 5Choose a password for protecting your files. 6Password: 7Repeat: 8 9Your master key is: 10 11 5adece45-4b8d9a73-0dcbcac7-b3df9a01- 12 c8b0db3b-02120cf8-3460a85c-052d0dc6 13 14If the gocryptfs.conf file becomes corrupted or you ever forget your password, 15there is only one hope for recovery: The master key. Print it to a piece of 16paper and store it in a drawer. This message is only printed once. 17The gocryptfs filesystem has been created successfully. 18You can now mount it using: gocryptfs encrypted-k MOUNTPOINT 19 20$ gocryptfs encrypted-k decrypted-k 21Password: 22Decrypting master key 23Filesystem mounted and ready. 24 25$ ls decrypted-k 26$ ls encrypted-k/ 27gocryptfs.conf 28 29$ for i in $(seq 1 10); do date \u0026gt;decrypted-k/${i}.date.txt; done 30 31$ ls decrypted-k/ 3210.date.txt 1.date.txt 2.date.txt 3.date.txt 4.date.txt 5.date.txt 6.date.txt 7.date.txt 8.date.txt 9.date.txt 33$ ls encrypted-k/ 3410.date.txt 2.date.txt 4.date.txt 6.date.txt 8.date.txt gocryptfs.conf 351.date.txt 3.date.txt 5.date.txt 7.date.txt 9.date.txt 36 37$ fusermount -u decrypted-k Man sieht: Die Dateinamen im verschlüsselten Bereich sind unverschlüsselt. Damit ist es einfacher, im Falle des Restaurierens eines Teils einer Sicherung der verschlüsselten Dateien die \u0026quot;richtigen\u0026quot; zurückzuspielen.\nLinks Homepage: gocryptfs GITHUB: gocryptfs Baeldung: Encrypting and Decrypting Directories on Linux With gocryptfs Versionen Getestet mit\nUbuntu-22.04 und gocryptfs-1.8.0-1ubuntu0.1 Historie 2025-01-04: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-04_gocryptfs-dateinamen/","section":"blog","tags":["crypto","linux","ubuntu"],"title":"Verschlüsseltes Dateisystem mit GOCRYPTFS - Klartextdateinamen"},{"body":" Traditionell habe ich für meine Tätigkeit als Java-Entwickler über viele Jahre hinweg Eclipse verwendet. In letzter Zeit habe ich wenig Java-Code erstellt und so den Anschluß etwas verloren.\nMeine Team-Mitarbeiter verwenden überwiegend IntelliJ Idea. Das gefällt mir auch recht gut.\nDennoch möchte ich Theia-IDE mal ausprobieren. Soll ja so eine Art \u0026quot;neue Generation\u0026quot; von Eclipse sein. Mal sehen...\nHerunterladen und Einspielen Theia IDE - Downloads Suchen: Wo liegt die neuste Version? ide-preview ide latest Herunterladen von TheiaIDE.AppImage Virustest, falls KO abbrechen! Ablegen in PATH und chmod +x .../TheiaIDE.AppImage Kurztest Java-Projekt clonen: git clone git@github.com:uli-heller/java-example-my-gradle-project.git\nTheiaIDE starten: .../TheiaIDE.AppImage java-example-my-gradle-project\nNach dem Start erscheint das Willkommen-Fenster. Es enthält allgemeine Informationen und ist relativ uninteressant. Am besten:\nShow welcome page on startup: Nein Welcome: Schliessen Dateien: Aktivieren Danach kann man das Mini-Java-Projekt sichten:\nDateien: Aktivieren (vermutlich bereits erfolgt) Java Projects: Hochschieben src/main/java: Aufklappen Main: Aktivieren Zuletzt noch Test, ob \u0026quot;Run\u0026quot; funktioniert:\nErkenntnis Die Installation von TheiaIDE ist sehr einfach, der erste Eindruck ist vielversprechend!\nNotizen Theia-Daten löschen 1rm -rf \u0026#34;$HOME/.config/Theia IDE\u0026#34; Links Eclipse IDE IntelliJ Idea Theia IDE Theia IDE - Downloads Versionen Alle Tests durchgeführt unter Ubuntu-20.04 mit TheiaIDE.AppImage-1.57.100.\nHistorie 2025-01-03: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-03_theia-ide/","section":"blog","tags":["theia","java"],"title":"Erste Schritte mit Theia-IDE"},{"body":"","link":"https://uli.heller.cool/tags/theia/","section":"tags","tags":null,"title":"Theia"},{"body":"","link":"https://uli.heller.cool/categories/theia/","section":"categories","tags":null,"title":"Theia"},{"body":" GOCRYPTFS kann auch in Verbindung mit Fido2-Geräten verwendet werden. Das ist sehr komfortabel, man muß sich keine Kennworte merken sondern nur auf sein Fido2-Gerät \u0026quot;aufpassen\u0026quot;.\nIch habe mehrere Fido2-Geräte: Einen Solokey, den ich primär an meinem Arbeitsplatzrechner nutze und einen Nitrokey für den Laptop.\nIch würde das verschlüsselte Dateisystem gerne mit beiden Fido2-Geräten entsperren können!\nGrundlegende Idee Konfigurieren für ein Fido2-Gerät Zweites Fido2-Gerät hinzufügen ähnlich wie Verschlüsseltes Dateisystem mit GOCRYPTFS - Fido2 und kompliziertes Kennwort: Dateisystem mit einem Fido2-Gerät Ich verwende das Dateisystem von Verschlüsseltes Dateisystem mit GOCRYPTFS - Fido2 und kompliziertes Kennwort Verschlüsselt: encrypted (... auf der Webseite vermutlich nicht sinnvoll weiterverwendbar) git mv encrypted/gocryptfs.conf encrypted/gocryptfs-nitro.conf git rm encrypted/gocryptfs-password.conf Geheimnis und MasterKey: secret (... auf der Webseite vermutlich nicht sinnvoll weiterverwendbar) Erweitern um zweites Fido2-Gerät 1$ mkdir encrypted-s 2$ gocryptfs --init --fido2 /dev/hidraw2 --config encrypted/gocryptfs-solo.conf encrypted-s 3Using config file at custom location /home/uli/git/github/uli-heller/uli.heller.cool/content/blog/2025-01-09_gocryptfs-multi-fido2/encrypted/gocryptfs-solo.conf 4FIDO2 Register: interact with your device ... 5FIDO2 Secret: interact with your device ... 6... 7 # Angezeigter Masterkey wird nicht benötigt! 8$ rm -rf encrypted-s 9 10$ gocryptfs --passwd --masterkey 3eca91ba-52c4391d-5d7ce783-b07e40f2-a3808dfd-a08c7ee5-a9577f97-cc6085d3 \\ 11 --fido2 /dev/hidraw2 \\ 12 --config encrypted/gocryptfs-solo.conf \\ 13 encrypted 14Using config file at custom location /home/uli/git/github/uli-heller/uli.heller.cool/content/blog/2025-01-09_gocryptfs-multi-fido2/encrypted/gocryptfs-solo.conf 15Using explicit master key. 16THE MASTER KEY IS VISIBLE VIA \u0026#34;ps ax\u0026#34; AND MAY BE STORED IN YOUR SHELL HISTORY! 17ONLY USE THIS MODE FOR EMERGENCIES 18Password change is not supported on FIDO2-enabled filesystems. So einfach geht es also leider nicht!\nAnpassungen an GOCRYPTFS 1diff --git a/main.go b/main.go 2index cd643b5..9bd76dd 100644 3--- a/main.go 4+++ b/main.go 5@@ -78,15 +78,19 @@ func changePassword(args *argContainer) { 6 if len(masterkey) == 0 { 7 log.Panic(\u0026#34;empty masterkey\u0026#34;) 8 } 9+ var newPw []byte 10 if confFile.IsFeatureFlagSet(configfile.FlagFIDO2) { 11- tlog.Fatal.Printf(\u0026#34;Password change is not supported on FIDO2-enabled filesystems.\u0026#34;) 12- os.Exit(exitcodes.Usage) 13- } 14- tlog.Info.Println(\u0026#34;Please enter your new password.\u0026#34;) 15- newPw, err := readpassword.Twice(nil, nil) 16- if err != nil { 17- tlog.Fatal.Println(err) 18- os.Exit(exitcodes.ReadPassword) 19+ var fido2CredentialID, fido2HmacSalt []byte 20+ fido2CredentialID = confFile.FIDO2.CredentialID //fido2.Register(args.fido2, filepath.Base(args.cipherdir)) 21+ fido2HmacSalt = confFile.FIDO2.HMACSalt //cryptocore.RandBytes(32) 22+ newPw = fido2.Secret(args.fido2, args.fido2_assert_options, fido2CredentialID, fido2HmacSalt) 23+ } else { 24+ tlog.Info.Println(\u0026#34;Please enter your new password.\u0026#34;) 25+ newPw, err = readpassword.Twice(nil, nil) 26+ if err != nil { 27+ tlog.Fatal.Println(err) 28+ os.Exit(exitcodes.ReadPassword) 29+ } 30 } 31 logN := confFile.ScryptObject.LogN() 32 if args._explicitScryptn { Damit:\nBauen: ./build.bash Verwenden: .../gocryptfs --version -\u0026gt; gocryptfs v2.4.0-51-g55ef2f0.multi-fido2; go-fuse v2.5.0; 2025-01-02 go1.23.2 linux/amd64 Erweitern um zweites Fido2-Gerät mit neuer Version von GOCRYPTFS 1$ mkdir encrypted-s 2$ .../gocryptfs --init --fido2 /dev/hidraw2 --config encrypted/gocryptfs-solo.conf encrypted-s 3Using config file at custom location /home/uli/git/github/uli-heller/uli.heller.cool/content/blog/2025-01-09_gocryptfs-multi-fido2/encrypted/gocryptfs-solo.conf 4FIDO2 Register: interact with your device ... 5Enter PIN for /dev/hidraw2: 1111 6 # Pin eingeben 7 # Solokey drücken 8FIDO2 Secret: interact with your device ... 9 # Solokey drücken 10... 11 # Angezeigter Masterkey wird nicht benötigt! 12 13$ rm -rf encrypted-s 14 15$ .../gocryptfs --passwd --masterkey 3eca91ba-52c4391d-5d7ce783-b07e40f2-a3808dfd-a08c7ee5-a9577f97-cc6085d3 \\ 16 --fido2 /dev/hidraw2 \\ 17 --config encrypted/gocryptfs-solo.conf \\ 18 encrypted 19Using config file at custom location /home/uli/git/github/uli-heller/uli.heller.cool/content/blog/2025-01-09_gocryptfs-multi-fido2/encrypted/gocryptfs-solo.conf 20Using explicit master key. 21THE MASTER KEY IS VISIBLE VIA \u0026#34;ps ax\u0026#34; AND MAY BE STORED IN YOUR SHELL HISTORY! 22ONLY USE THIS MODE FOR EMERGENCIES 23FIDO2 Secret: interact with your device ... 24 # Solokey drücken 25A copy of the old config file has been created at \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/content/blog/2025-01-09_gocryptfs-multi-fido2/encrypted/gocryptfs-solo.conf.bak\u0026#34;. 26Delete it after you have verified that you can access your files with the new password. 27Password changed. 28 29$ rm -f encrypted/gocryptfs-solo.conf.bak Jetzt hat es geklappt!\nDateisystem verwenden mit Nitrokey 1$ mkdir /tmp/decrypted-uli 2$ gocryptfs --fido2 /dev/hidraw2 --config encrypted/gocryptfs-nitro.conf encrypted /tmp/decrypted-uli 3Using config file at custom location /home/uli/git/github/uli-heller/uli.heller.cool/content/blog/2025-01-09_gocryptfs-multi-fido2/encrypted/gocryptfs-nitro.conf 4FIDO2 Secret: interact with your device ... 5 # Nitrokey leuchtet - berühren! 6Decrypting master key 7Filesystem mounted and ready. 8 9$ ls /tmp/decrypted-uli/ 10secret.txt 11 12$ cat /tmp/decrypted-uli/secret.txt 13Das ist ein geheimer Satz 14 15$ fusermount -u /tmp/decrypted-uli 16$ rmdir /tmp/decrypted-uli Dateisystem verwenden mit Solokey 1$ mkdir /tmp/decrypted-uli 2$ gocryptfs --fido2 /dev/hidraw2 --config encrypted/gocryptfs-solo.conf encrypted /tmp/decrypted-uli 3Using config file at custom location /home/uli/git/github/uli-heller/uli.heller.cool/content/blog/2025-01-09_gocryptfs-multi-fido2/encrypted/gocryptfs-solo.conf 4FIDO2 Secret: interact with your device ... 5 # Solokey drücken 6Decrypting master key 7Filesystem mounted and ready. 8 9$ ls /tmp/decrypted-uli/ 10secret.txt 11 12$ cat /tmp/decrypted-uli/secret.txt 13Das ist ein geheimer Satz 14 15$ fusermount -u /tmp/decrypted-uli 16$ rmdir /tmp/decrypted-uli Links Homepage: gocryptfs GITHUB: gocryptfs GITHUB: Mein Fork mit der Multi-Fido-Korrektur Versionen Getestet mit\nUbuntu-22.04 und gocryptfs-2.4.0.1 Ubuntu-20.04 und gocryptfs-2.4.0.1 Historie 2025-01-02: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-02_gocryptfs-multi-fido2/","section":"blog","tags":["crypto","fido2","linux","ubuntu"],"title":"Verschlüsseltes Dateisystem mit GOCRYPTFS - mehrere Fido2-Geräte"},{"body":"","link":"https://uli.heller.cool/tags/ideen/","section":"tags","tags":null,"title":"Ideen"},{"body":"","link":"https://uli.heller.cool/categories/ideen/","section":"categories","tags":null,"title":"Ideen"},{"body":" Sammlung von Verweisen und Ideen, die ich mir mal anschauen sollte. Wahrscheinlich völlig unbrauchbar für jeden außer mich selbst!\nOffene Ideen USB über's Netzwerk LINUX FU: USB EVERYWHERE\nBeschreibt, wie ich ein USB-Gerät von einem Linux-Rechner auf einem anderen verwende.\nLinux-PPAs - Richtige Handhabung der GPG-Schlüssel https://stackoverflow.com/questions/68992799/warning-apt-key-is-deprecated-manage-keyring-files-in-trusted-gpg-d-instead\nGradle - Bauen mit gradle.lockfile Link auf meinen Artikel\nAktuell wirft Gradle nur eine Warnung, wenn die Lock-Datei nicht \u0026quot;passt\u0026quot;.\nNitrokey - PIN Nitrokey - PIN\nDuckDB + Webassembly = WhatTheDuck DuckDB + Webassembly = WhatTheDuck\nRun DuckDB inside your browser thanks to Webassembly. When is that useful?\nRunning a database instance inside a browser is nothing new. I've already explored the idea in Running PostgreSQL Inside Your Browser With PGLite where I explained:\nPGlite is a WASM Postgres build packaged into a TypeScript client library that enableyou to run Postgres in the browser with no need to install any other dependencies.\nThe concept here is the same. You get a local first application disposable application without the hassle of having to set up anything.\nUsually when I want to quickly load CSV files, store them in tables and perform SQL queries on the data, I use DBeaver where I setup the DuckDB driver as well the in-memory database and then load the CSV with \u0026quot;create table as\u0026quot;.￼\nInstead, with WhatTheDuck you just upload your files and are ready to go.\nDetecting the use of \u0026quot;curl | bash\u0026quot; server side Meine Einschätzung: Schwierig zu beschreiben, schwierig ein Beispiel umzusetzen!\nDetecting the use of \u0026quot;curl | bash\u0026quot; server side https://www.idontplaydarts.com - Zertifikat abgelaufen The Dangers of curl | bash Copycat - A library for intercepting system calls Copycat\nA library for intercepting system calls.\nThis library allows you to overwrite system calls of arbitrary binaries in an intuitive way. For example the following snippet tricks cat into opening another file than was given:\n1echo \u0026#34;a\u0026#34; \u0026gt; /tmp/a 2echo \u0026#34;b\u0026#34; \u0026gt; /tmp/b 3COPYCAT=\u0026#34;/tmp/a /tmp/b\u0026#34; copycat -- cat /tmp/a # this will print \u0026#34;b\u0026#34; 4# Success! cat was tricked into opening /tmp/b instead of /tmp/a Internally copycat uses a modern Seccomp Notifier implementation to reliably intercept system calls. This is more elegant and much faster than usual ptrace-based implementations. However due to this relatively new Linux Kernel feature, copycat only works on Linux 5.9 or higher. Additionally, due to a Linux kernel bug not notifying the supervisor when a traced child terminates, it is recommended to use Linux 6.11 or higher.\nGitFourchette Oberfläche für Git, geschrieben in Python und Qt. Auch als AppImage.\nThe comfortable Git UI for Linux.\nA comfortable way to explore and understand your Git repositories Powerful tools to stage code, create commits, and manage branches Snappy and intuitive Qt UI designed to fit in snugly with KDE Plasma Learn more on GitFourchette’s homepage at gitfourchette.org.\nhttps://github.com/jorio/gitfourchette\nDemystifying git submodules Artikel über die Handhabung von Submodulen + Hinweise für bessere Konfiguration des Git-Projektes.\nThroughout my career, I have found git submodules to be a pain. Because I did not understand them, I kept getting myself into frustrating situations.\nSo, I finally sat down and learned how git tracks submodules. Turns out, it’s not complex at all. It’s just different from how git tracks regular files. It’s just one more thing you have to learn.\nIn this article, I’ll explain exactly what I needed to know in order to work with submodules without inflicting self-damage.\njaq - Ersatz für JQ jaq (pronounced /ʒaːk/, like Jacques1) is a clone of the JSON data processing tool jq. jaq aims to support a large subset of jq's syntax and operations.\nYou can try jaq online on the jaq playground. Instructions for the playground can be found here.\nHurl - Run and Test HTTP Requests Hurl is a command line tool that runs HTTP requests defined in a simple plain text format.\nIt can chain requests, capture values and evaluate queries on headers and body response. Hurl is very versatile: it can be used for both fetching data and testing HTTP sessions.\nHurl makes it easy to work with HTML content, REST / SOAP / GraphQL APIs, or any other XML / JSON based APIs.\nFrood - an Alpine initramfs NAS My NAS, frood, has a bit of a weird setup. It’s just one big initramfs containing a whole Alpine Linux system. It’s delightful and I am not sure why it’s not more common.\nXRechnung und ZUGFeRD mit LibreOffice - YouTube hallo in diesem Video nur ganz kurz gezeigt eine einfache und vor allem kostenlose Möglichkeit xrechnungen zu erstellen\nErledigte Ideen Proot - chroot, mount --bind, and binfmt_misc without privilege/setup PRoot is a user-space implementation of chroot, mount --bind, and binfmt_misc. This means that users don't need any privileges or setup to do things like using an arbitrary directory as the new root filesystem, making files accessible somewhere else in the filesystem hierarchy, or executing programs built for another CPU architecture transparently through QEMU user-mode. Also, developers can use PRoot as a generic Linux process instrumentation engine thanks to its extension mechanism, see CARE for an example. Technically PRoot relies on ptrace, an unprivileged system-call available in every Linux kernel.\nVeröffentlichungen:\nPROOT: Dateisysteme ohne \u0026quot;root\u0026quot; PROOT: Probleme bei langen Dateinamen Anzeige einer Webseite mit abgelaufenen Zertifikat Alle Chrome-Prozesse stoppen Neuen Chrome-Prozess starten via Kommandozeile: google-chrome-stable --ignore-certificate-errors Diverse Warnungen ignorieren Nun klappts: https://www.idontplaydarts.com - Zertifikat abgelaufen Getestet mit Google-Chrome Version Version 131.0.6778.204 (Offizieller Build) (64-Bit) Veröffentlichungen:\nChrome: Webseite mit abgelaufenem Zertifikat anzeigen Nepenthes Heise: Nepenthes: eine Teergrube für KI-Webcrawler Nepenthes Homepage Links PROOT: Dateisysteme ohne \u0026quot;roo PROOT: Probleme bei langen Dateinamen Chrome: Webseite mit abgelaufenem Zertifikat anzeigen Historie 2025-07-02: Nepenthes 2025-03-01: USB über's Netzwerk 2025-01-11: Gradle und gradle.lockfile 2025-01-08: Neue Idee - Nitrokey + PIN 2025-01-07: Webseite mit abgelaufenem Zertifikat ist erledigt 2025-01-06: PROOT ist erledigt + diverse neue Ideen 2025-01-01: Erste Version ","link":"https://uli.heller.cool/articles/ideen-sammlung/","section":"articles","tags":["ideen"],"title":"Ideen-Sammlung"},{"body":" GOCRYPTFS kann auch in Verbindung mit einem Fido2-Gerät verwendet werden, also bspw. mit einem Nitrokey.\nSichtung des Fido2-Gerätes 1$ fido2-token -L 2/dev/hidraw2: vendor=0x20a0, product=0x42f3 (Nitrokey Nitrokey Passkey) Ich habe einen Nitrokey und das Gerät heißt \u0026quot;/dev/hidraw2\u0026quot;.\nSichtung GOCRYPTFS 1$ gocryptfs --version 2gocryptfs 2.4.0; go-fuse 2.4.2; 2024-11-01 go1.18.1 linux/amd64 Wir brauchen eine 2-er-Version von GOCRYPTFS. Die Version 1.8.0 ist beispielsweise ungeeignet!\nInitialisierung 1$ mkdir encrypted 2 3$ gocryptfs -init -fido2 /dev/hidraw2 encrypted 4FIDO2 Register: interact with your device ... 5 # Nitrokey leuchtet blau -\u0026gt; berühren 6FIDO2 Secret: interact with your device ... 7 # Nitrokey leuchtet nochmal blau -\u0026gt; berühren 8 9Your master key is: 10 11 b948c5e5-c3dea3d3-88660ef8-d0b57bfa- 12 390c65cb-98e43da7-81a7ad09-0fba41a0 13 14If the gocryptfs.conf file becomes corrupted or you ever forget your password, 15there is only one hope for recovery: The master key. Print it to a piece of 16paper and store it in a drawer. This message is only printed once. 17The gocryptfs filesystem has been created successfully. 18You can now mount it using: gocryptfs encrypted MOUNTPOINT Einbinden 1$ mkdir decrypted 2 3$ gocryptfs encrypted decrypted 4Masterkey encrypted using FIDO2 token; need to use the --fido2 option. 5 6$ gocryptfs -fido2 /dev/hidraw2 encrypted decrypted 7FIDO2 Secret: interact with your device ... 8 # Nitrokey leuchtet blau -\u0026gt; berühren 9Decrypting master key 10Filesystem mounted and ready. Ausbinden 1$ fusermount -u decrypted Optionen Beim Initialisieren mit einem Fido2-Gerät gibt es diese Optionen:\nPIN-Verifikation: pin=true oder pin=false Nutzer-Verifikation: uv=true oder uv=false Nutzer-Präsenz: up=true oder up=false Initiaisierung ohne Zusatz:\n1$ gocryptfs --init --fido2 /dev/hidraw2 \\ 2 --fido2-assert-option pin=false \\ 3 --fido2-assert-option uv=false \\ 4 --fido2-assert-option up=false \\ 5 encrypted 6Invalid command line: \u0026#34;gocryptfs\u0026#34; \u0026#34;--init\u0026#34; \u0026#34;--fido2\u0026#34; \u0026#34;/dev/hidraw2\u0026#34; \u0026#34;--fido2-assert-option\u0026#34; \u0026#34;pin=false\u0026#34; \u0026#34;--fido2-assert-option\u0026#34; \u0026#34;uv=false\u0026#34; \u0026#34;--fido2-assert-option\u0026#34; \u0026#34;up=false\u0026#34; \u0026#34;encrypted\u0026#34;: unknown flag: --fido2-assert-option. Try \u0026#39;gocryptfs -help\u0026#39;. Leider sind bei gibt es bei 2.4.0 die Aufrufoption \u0026quot;--fido2-assert-option\u0026quot; nicht!\nSichtung des Github-Repos:\n2.4.0 wurde angelegt im Juni 2023 \u0026quot;fido2-assert-option\u0026quot; gibt es seit grob 9 Monaten, also seit April 2024 Github-Commit Links Homepage: gocryptfs GITHUB: gocryptfs Versionen Getestet mit\nUbuntu-22.04 und gocryptfs-2.4.0 Historie 2025-01-01: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-01_gocryptfs-fido2/","section":"blog","tags":["crypto","fido2","linux","ubuntu"],"title":"Verschlüsseltes Dateisystem mit GOCRYPTFS - Fido2"},{"body":" Im Artikel Verschlüsseltes Dateisystem mit GOCRYPTFS - Fido2 habe ich beschrieben, wie ich GOCRYPTFS mit einem Fido2-Gerät verwende. Das funktioniert ganz gut, hat aber ein Problem: Wenn ich das Fido2-Gerät nicht im Zugriff habe, dann komme ich an meine Daten nicht dran.\nWenn man den Masterkey kennt, dann kann man zusätzlich zur Fido2-Entschlüsselung eine Entschlüsselung mit Kennwort hinterlegen. Die nutze ich dann im \u0026quot;Notfall\u0026quot;, wenn mein Fido2-Gerät gerade nicht zur Verfügung steht.\nInitialisierung mit Fido2 Vorgehen analog zum Artikel Verschlüsseltes Dateisystem mit GOCRYPTFS - Fido2:\n1$ fido2-token -L 2/dev/hidraw2: vendor=0x20a0, product=0x42f3 (Nitrokey Nitrokey Passkey) 3 4$ mkdir encrypted 5$ mkdir secret 6 7$ gocryptfs --init --fido2 /dev/hidraw2 encrypted 8FIDO2 Register: interact with your device ... 9 # Nitrokey leuchtet blau -\u0026gt; berühren 10FIDO2 Secret: interact with your device ... 11 # Nitrokey leuchtet blau -\u0026gt; nochmal berühren 12 13Your master key is: 14 15 3eca91ba-52c4391d-5d7ce783-b07e40f2- 16 a3808dfd-a08c7ee5-a9577f97-cc6085d3 17 18If the gocryptfs.conf file becomes corrupted or you ever forget your password, 19there is only one hope for recovery: The master key. Print it to a piece of 20paper and store it in a drawer. This message is only printed once. 21The gocryptfs filesystem has been created successfully. 22You can now mount it using: gocryptfs encrypted MOUNTPOINT 23 24$ cat \u0026gt;secret/master-key.txt \u0026lt;\u0026lt;EOF 25Your master key is: 26 27 3eca91ba-52c4391d-5d7ce783-b07e40f2- 28 a3808dfd-a08c7ee5-a9577f97-cc6085d3 29 30If the gocryptfs.conf file becomes corrupted or you ever forget your password, 31there is only one hope for recovery: The master key. Print it to a piece of 32paper and store it in a drawer. This message is only printed once. 33The gocryptfs filesystem has been created successfully. 34You can now mount it using: gocryptfs encrypted MOUNTPOINT 35EOF Nutzung mit Fido2 Das verschlüsselte Verzeichnis kann ich nun so nutzen:\n1$ mkdir /tmp/decrypted-uli 2$ gocryptfs --fido2 /dev/hidraw2 encrypted /tmp/decrypted-uli 3FIDO2 Secret: interact with your device ... 4 # Nitrokey leuchtet blau -\u0026gt; berühren 5Decrypting master key 6Filesystem mounted and ready. 7 8$ echo \u0026#34;Das ist ein geheimer Satz\u0026#34; \u0026gt;/tmp/decrypted-uli/secret.txt 9 10$ fusermount -u /tmp/decrypted-uli 11$ rmdir /tmp/decrypted-uli Aktivieren des Kennworts 1$ mkdir encrypted-k 2$ gocryptfs --init --config encrypted/gocryptfs-password.conf encrypted-k 3Using config file at custom location /home/uli/git/github/uli-heller/uli.heller.cool/content/blog/2025-01-08_gocryptfs-multi/encrypted/gocryptfs-password.conf 4Choose a password for protecting your files. 5Password: 6Repeat: 7... 8 # Kennwort (password) spielt keine Rolle, es wird nicht nochmal verwendet 9 # Angezeigter Masterkey spielt keine Rolle, er wird nicht nochmal verwendet 10$ rm -rf encrypted-k 11 12$ gocryptfs --passwd --masterkey 3eca91ba-52c4391d-5d7ce783-b07e40f2-a3808dfd-a08c7ee5-a9577f97-cc6085d3 \\ 13 --config encrypted/gocryptfs-password.conf \\ 14 encrypted 15Using config file at custom location /home/uli/git/github/uli-heller/uli.heller.cool/content/blog/2025-01-08_gocryptfs-multi/encrypted/gocryptfs-password.conf 16Using explicit master key. 17THE MASTER KEY IS VISIBLE VIA \u0026#34;ps ax\u0026#34; AND MAY BE STORED IN YOUR SHELL HISTORY! 18ONLY USE THIS MODE FOR EMERGENCIES 19Please enter your new password. 20Password: dies-ist-ein-relativ-langes-kennwort 21Repeat: dies-ist-ein-relativ-langes-kennwort 22A copy of the old config file has been created at \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/content/blog/2025-01-08_gocryptfs-multi/encrypted/gocryptfs-password.conf.bak\u0026#34;. 23Delete it after you have verified that you can access your files with the new password. 24Password changed. 25 26$ rm -f encrypted/gocryptfs-password.conf.bak Nutzung mit Kennwort Das verschlüsselte Verzeichnis kann ich nun mit Kennwort und ohne Fido2-Gerät so nutzen:\n1$ mkdir /tmp/decrypted-uli 2$ gocryptfs --config encrypted/gocryptfs-password.conf encrypted /tmp/decrypted-uli 3Using config file at custom location /home/uli/git/github/uli-heller/uli.heller.cool/content/blog/2025-01-08_gocryptfs-multi/encrypted/gocryptfs-password.conf 4Password: dies-ist-ein-relativ-langes-kennwort 5Decrypting master key 6Filesystem mounted and ready. 7 8$ ls /tmp/decrypted-uli/ 9secret.txt 10$ cat /tmp/decrypted-uli/secret.txt 11Das ist ein geheimer Satz 12 13$ fusermount -u /tmp/decrypted-uli 14$ rmdir /tmp/decrypted-uli Sicherheitseinschätzung Da ich das Dateisystem im Regelfall mit dem Fido2-Gerät entschlüssle, verwende ich das hinterlegte Kennwort relativ selten. Dementsprechend kann es ruhig deutlich länger und komplizierter sein, als meine üblichen Kennworte. Meiner Einschätzung nach ist das ein Sicherheitsgewinn!\nLinks Homepage: gocryptfs GITHUB: gocryptfs Verschlüsseltes Dateisystem mit GOCRYPTFS - Fido2 Versionen Getestet mit\nUbuntu-22.04 und gocryptfs-2.4.0 Historie 2025-12-15: Tippfehler korrigiert 2025-01-01: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-01_gocryptfs-kennwort-und-fido2/","section":"blog","tags":["crypto","fido2","linux","ubuntu"],"title":"Verschlüsseltes Dateisystem mit GOCRYPTFS - Fido2 und kompliziertes Kennwort"},{"body":" Ich habe diverse Geräte im Einsatz mit Akkus. Bei einigen protokolliere ich die Aufladevorgänge um rauszufinden, wie es mit der Akku-Alterung oder den Laufzeit-Änderungen aussieht.\nGarmin Marq2 Meine aktuelle Armbanduhr: marq2\nAkkus/\u0026quot;Batterien\u0026quot; Hier die Liste meiner \u0026quot;Batterien\u0026quot;: akku-tabelle\nHistorie 2025-01-25: Liste der \u0026quot;Batterien\u0026quot; 2024-12-31: Erste Version ","link":"https://uli.heller.cool/articles/akku/","section":"articles","tags":["elektronik","akku"],"title":"Akku-Tabellen"},{"body":"","link":"https://uli.heller.cool/tags/elektronik/","section":"tags","tags":null,"title":"Elektronik"},{"body":"","link":"https://uli.heller.cool/categories/elektronik/","section":"categories","tags":null,"title":"Elektronik"},{"body":" Die neuen Versionen von GIMP werden auch als AppImage veröffentlicht. Hier beschreibe ich, wie man sie herunterladet und einspielt.\nHerunterladen Download-Seite von GIMP Development snapshots (ganz unten) - development downloads page Detailbeschreibung: Automatic AppImage development builds Gitlab-Server: scheduled pipelines listing Zeile: AppImage - \u0026quot;Bestanden\u0026quot;- Anwählen distribution - dist-appimage-weekly Durchsuchen (rechts) build linux appimage _Output x86_64.AppImage wählen und speichern GIMP-3.0.0-RC2+git-x86_64.AppImage Viruscheck Hochladen nach https://virustotal.com Alles grün! Einspielen Ablegen irgendwo im PATH chmod +x .../GIMP-3.0.0-RC2+git-x86_64.AppImage Links GIMP Historie 2024-12-31: Erste Version ","link":"https://uli.heller.cool/blog/2025-01-08_gimp-3.0.0-rc2-appimage/","section":"blog","tags":["gimp"],"title":"GIMP: Appimage von Version 3.0.0-RC2 installieren"},{"body":" Grundsätzlich verwende ich Festplatten mit Vollverschlüsselung. Das bedeutet, dass alle meine Dateien nur in verschlüsselter Form physikalisch auf der Platte abliegen. Wenn ich die Platte entschlüsselt habe, dann sind sie im Klartext zugreifbar.\nEinige Dateien sind für mich persönlich besonders sensitiv und ich brauche die nicht permanent. Diese möchte ich separat verschlüsseln und nur in Ausnahmefällen entschlüsseln.\nHier beschreibe ich, wie das mit GOCRYPTFS geht.\nGOCRYPTFS installieren 1$ sudo apt install gocryptfs 2[sudo] Passwort für uli: 3Paketlisten werden gelesen… Fertig 4Abhängigkeitsbaum wird aufgebaut… Fertig 5Statusinformationen werden eingelesen… Fertig 6Die folgenden Pakete wurden automatisch installiert und werden nicht mehr benötigt: 7 containerd libclamav9 libtfm1 pigz runc ubuntu-fan 8Verwenden Sie »sudo apt autoremove«, um sie zu entfernen. 9Die folgenden NEUEN Pakete werden installiert: 10 gocryptfs 110 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert. 12Es müssen 1.970 kB an Archiven heruntergeladen werden. 13Nach dieser Operation werden 8.973 kB Plattenplatz zusätzlich benutzt. 14Holen:1 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 gocryptfs amd64 1.8.0-1ubuntu0.1 [1.970 kB] 15... 16$ gocryptfs --version 17gocryptfs 1.8.0; go-fuse 2.0.3; 2024-11-18 go1.18.1 linux/amd64 Kurztest 1$ cd /tmp 2$ mkdir encrypted 3$ mkdir decrypted 4$ gocryptfs --init encrypted 5Choose a password for protecting your files. 6Password: 7Repeat: 8 9Your master key is: 10 11 bce87b84-c2b6152c-7a74cbb3-8c7e8d37- 12 804741c2-46cd797a-9b5571ff-7565757c 13 14If the gocryptfs.conf file becomes corrupted or you ever forget your password, 15there is only one hope for recovery: The master key. Print it to a piece of 16paper and store it in a drawer. This message is only printed once. 17The gocryptfs filesystem has been created successfully. 18You can now mount it using: gocryptfs encrypted MOUNTPOINT 19 20$ gocryptfs encrypted decrypted 21Password: 22Decrypting master key 23Filesystem mounted and ready. 24 25$ ls decrypted 26$ ls encrypted/ 27gocryptfs.conf gocryptfs.diriv 28 29$ for i in $(seq 1 10); do date \u0026gt;decrypted/${i}.date.txt; done 30 31$ ls decrypted/ 3210.date.txt 1.date.txt 2.date.txt 3.date.txt 4.date.txt 5.date.txt 6.date.txt 7.date.txt 8.date.txt 9.date.txt 33$ ls encrypted/ 341x7SD2INc6DkDO0T6lnqyw HAXcjyWFCF5ULwojWGWaIw w91ojRUPJgxvG1AwwmaGZA Z_2TpW9A_sg2fOR3CBJVxQ 35gocryptfs.conf HNAN6gmsrZSPV5tIESVTzw wn1idkX-BCpC2ia4tRVZCw z6PGa542pDTwe_BeZJmCvA 36gocryptfs.diriv rx5PwbMrl7RYnXyA3UBIWw x3saIKGb-DxtpWVbdYOo7Q ZCsV-dxiA_qowF7h4-H6rw 37 38$ fusermount -u decrypted 39 40$ ls decrypted/ 41$ ls encrypted/ 421x7SD2INc6DkDO0T6lnqyw HAXcjyWFCF5ULwojWGWaIw w91ojRUPJgxvG1AwwmaGZA Z_2TpW9A_sg2fOR3CBJVxQ 43gocryptfs.conf HNAN6gmsrZSPV5tIESVTzw wn1idkX-BCpC2ia4tRVZCw z6PGa542pDTwe_BeZJmCvA 44gocryptfs.diriv rx5PwbMrl7RYnXyA3UBIWw x3saIKGb-DxtpWVbdYOo7Q ZCsV-dxiA_qowF7h4-H6rw Handhabungshinweise Grundinitialisierung: mkdir encrypted; gocryptfs --init encrypted (muß nur einmalig gemacht werden!) Einbinden: mkdir decrypted; gocryptfs encrypted decrypted Dateizugriffe: Über \u0026quot;decrypted\u0026quot;! Ausbinden: fusermount -u decrypted Wiederherstellung mit dem MasterKey Annahme: Ich habe entweder mein \u0026quot;Password\u0026quot; vergessen oder die Datei \u0026quot;encrypted/gocryptfs.conf\u0026quot; ist kaputt Dummy-Version der \u0026quot;gocryptfs.conf\u0026quot; erzeugen: mkdir encrypted-2; gocryptfs --init encrypted-2/ (Password hierbei ist egal) Dummy-Version kopieren: cp encrypted-2/gocryptfs.conf encrypted/gocryptfs.conf Dummy-Verzeichnis löschen: rm -rf encrypted-2 Master-Key eintragen: 1$ gocryptfs -passwd -masterkey bce87b84-c2b6152c-7a74cbb3-8c7e8d37-804741c2-46cd797a-9b5571ff-7565757c encrypted 2Using explicit master key. 3THE MASTER KEY IS VISIBLE VIA \u0026#34;ps ax\u0026#34; AND MAY BE STORED IN YOUR SHELL HISTORY! 4ONLY USE THIS MODE FOR EMERGENCIES 5Please enter your new password. 6Password: 7Repeat: 8A copy of the old config file has been created at \u0026#34;/tmp/encrypted/gocryptfs.conf.bak\u0026#34;. 9Delete it after you have verified that you can access your files with the new password. 10Password changed. Danach klappt der Zugriff mit dem zuletzt vergebenen \u0026quot;Password\u0026quot; Links Homepage: gocryptfs GITHUB: gocryptfs Recreate gocryptfs.conf using masterkey Versionen Getestet mit\nUbuntu-22.04 und gocryptfs-1.8.0-1ubuntu0.1 Ubuntu-20.04 unt gocryptfs-1.7.1-1ubuntu0.1 Historie 2024-12-31: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-31_gocryptfs/","section":"blog","tags":["crypto","linux","ubuntu"],"title":"Verschlüsseltes Dateisystem mit GOCRYPTFS"},{"body":" Im Git-Projekt zu dieser Webseite habe ich einige sehr kleine Java-Projekte als Code-Beispiele gespeichert. Leider zeigt sich, dass deren Verlinkung nicht gut funktioniert.\nNun möchte ich diese Projekte auslagern in eigene Github-Projekte inklusive der Git-Historie. Links darauf funktionieren dann sicher.\nListe der Java-Projekte static/gradle-artifactory ... erledigt static/gradle-maven-publish ... erledigt static/gradle-bom ... erledigt static/gradle-bom-use ... erledigt static/springboot-hello-world ... erledigt static/my-gradle-project ... erledigt static/gradle-proxy ... erledigt Neue Heimat Ich mache es mit einfach und verwende dieses feste Schema:\nSchema: static/(projektname) -\u0026gt; uli-heller/java-example-(projektname) Beispiel: static/my-gradle-project -\u0026gt; uli-heller/java-example-my-gradle-project\u0026quot;. Grob-Ablauf für jedes Projekt Github: Neues Repo anlegen Github-URL speichern Git-Projekt der Webseite kopieren Kopie aufbereiten Abspeichern im neuen Repo Aufräumen der Kopie Anpassen der Verweise Löschen des Java-Projektes Ablauf für \u0026quot;my-gradle-project\u0026quot; Github: Neues Repo anlegen Owner: uli-heller Repository name: java-example-my-gradle-project Public Github-URL speichern: git@github.com:uli-heller/java-example-my-gradle-project.git Git-Projekt der Webseite kopieren 1rm -rf /tmp/git-separation 2mkdir /tmp/git-separation 3cp -a .../uli.heller.cool/. /tmp/git-separation/. Kopie aufbereiten 1( 2 cd /tmp/git-separation 3 rm -rf .git/filter-repo 4 rm -rf .git/modules/* 5 git checkout . 6 git clean -fdx 7 git status 8 git filter-repo --force --path static/my-gradle-project/ --path-rename static/my-gradle-project/: 9 git clean -fdx 10 git status 11) Abspeichern im neuen Repo 1( 2 cd /tmp/git-separation 3 git remote add new git@github.com:uli-heller/java-example-my-gradle-project.git 4 git push new main:main 5) Aufräumen der Kopie 1rm -rf /tmp/git-separation Anpassen der Verweise 1for f in $(find . -type f -name \u0026#34;*.md\u0026#34;|xargs grep -l my-gradle-project); do 2 sed -i -e \u0026#39;s,\\[\\([^]]*\\)\\](/my-gradle-project),[github:java-example-\\1](https://github.com/uli-heller/java-example-my-gradle-project),\u0026#39; \u0026#34;${f}\u0026#34; 3done 4git status 5git diff 6git commit -m \u0026#34;Java-Beispiel \u0026#39;my-gradle-project\u0026#39; ausgelagert - Verweise\u0026#34; . Löschen des Java-Projektes 1git rm -r static/my-gradle-project 2git commit -m \u0026#34;Java-Beispiel \u0026#39;my-gradle-project\u0026#39; ausgelagert - Löschen\u0026#34; static Ablauf mit Skript Github: Neues Repo anlegen Owner: uli-heller Repository name: java-example-gradle-artifactory Public Github-URL speichern: git@github.com:uli-heller/java-example-gradle-artifactory.git Skript: auslagern.sh\n1NAME=gradle-artifactory 2GITHUB_URL=\u0026#34;git@github.com:uli-heller/java-example-${NAME}.git\u0026#34; 3ULI_HELLER_COOL_PATH=.../uli.heller.cool 4 5rm -rf /tmp/git-separation 6mkdir /tmp/git-separation 7cp -a \u0026#34;${ULI_HELLER_COOL_PATH}/.\u0026#34; /tmp/git-separation/. || exit 1 8( 9 cd /tmp/git-separation || exit 1 10 rm -rf .git/filter-repo 11 rm -rf .git/modules/* 12 git checkout . 13 git clean -fdx 14 git status 15 git filter-repo --force --path \u0026#34;static/${NAME}/\u0026#34; --path-rename \u0026#34;static/${NAME}/:\u0026#34; 16 git clean -fdx 17 git status 18#) 19#( 20# cd /tmp/git-separation 21 git remote add new \u0026#34;${GITHUB_URL}\u0026#34; 22 git push new main:main 23) 24rm -rf /tmp/git-separation 25( 26 cd \u0026#34;${ULI_HELLER_COOL_PATH}\u0026#34; || exit 1 27 28 for f in $(find . -type f -name \u0026#34;*.md\u0026#34;|xargs grep -l \u0026#34;${NAME}\u0026#34;); do 29 sed -i -e \u0026#34;s,\\[\\([^]]*\\)\\](/${NAME}),[github:java-example-\\1](${GITHUB_URL}),\u0026#34; \u0026#34;${f}\u0026#34; 30 done 31 git status 32 git diff 33 git commit -m \u0026#34;Java-Beispiel \u0026#39;${NAME}\u0026#39; ausgelagert - Verweise\u0026#34; . 34 git rm -r \u0026#34;static/${NAME}\u0026#34; 35 git commit -m \u0026#34;Java-Beispiel \u0026#39;${NAME}\u0026#39; ausgelagert - Löschen\u0026#34; static 36) Ergebnis Was habe ich damit erreicht?\nDie Java-Beispiel-Projekte unterhalb von static sind weg Für jedes Java-Beispiel-Projekt gibt es ein eigenes Github-Repo hier Alle Java-Beispiel-Projekte sind aufgelistet unter \u0026quot;Links\u0026quot; (siehe unten) Jedes Java-Beispiel-Projekt hat seine Änderungshistorie behalten Links github:java-example-gradle-artifactory github:java-example-gradle-maven-publish github:java-example-gradle-bom github:java-example-gradle-bom-use github:java-example-springboot-hello-world github:java-example-my-gradle-project github:java-example-gradle-proxy Historie 2024-12-30: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-30_git-projekte-auslagern/","section":"blog","tags":["git"],"title":"Git: Projekte auslagern"},{"body":" Ich habe bei einem meiner Git-Repos viele Pfade angepasst mit dem Werkzeug \u0026quot;git-filter-repo\u0026quot;. Seit den Anpassungen gibt es Fehlermeldung bzgl. eines Git-Submodules. Die Github-Action zum Bauen funktioniert auch nicht mehr.\nFehlermeldung in der Github-Action Fehlermeldung in der Github-Action:\n1Annotations 2 2 errors and 2 warnings 3 4build 5 No url found for submodule path \u0026#39;themes/hugo-clarity.orig\u0026#39; in .gitmodules 6build 7 The process \u0026#39;/usr/bin/git\u0026#39; failed with exit code 128 8build 9 ubuntu-latest pipelines will use ubuntu-24.04 soon. For more details, see https://github.com/actions/runner-images/issues/10636 10build 11 The process \u0026#39;/usr/bin/git\u0026#39; failed with exit code 128 Fehlermeldung bei \u0026quot;git commit\u0026quot; 1$ git commit . 2Fehler: \u0026#39;themes/hugo-clarity.orig\u0026#39; hat keinen Commit ausgecheckt 3Schwerwiegend: Aktualisierung der Dateien fehlgeschlagen Erster Abhilfeversuch 1$ git submodule update --init 2Schwerwiegend: Keine URL für Submodul-Pfad \u0026#39;themes/hugo-clarity.orig\u0026#39; in .gitmodules gefunden Sichtung .gitmodules 1uli@ulicsl:~/git/github/uli-heller/uli.heller.cool$ cat .gitmodules 2[submodule \u0026#34;my-hugo-site/themes/mainroad.orig\u0026#34;] 3\tpath = my-hugo-site/themes/mainroad.orig 4\turl = https://github.com/vimux/mainroad.git 5[submodule \u0026#34;my-hugo-site/themes/hugo-clarity.orig\u0026#34;] 6\tpath = my-hugo-site/themes/hugo-clarity.orig 7\turl = https://github.com/chipzoller/hugo-clarity Erkenntnis: Da stehen noch die falschen Pfade drin! Hab mein Git-Repo umorganisiert mit git-filter-repo.\nAnpassung 1uli@ulicsl:~/git/github/uli-heller/uli.heller.cool$ git diff 2diff --git a/.gitmodules b/.gitmodules 3index fa75b80..b4856a6 100644 4--- a/.gitmodules 5+++ b/.gitmodules 6@@ -1,6 +1,6 @@ 7-[submodule \u0026#34;my-hugo-site/themes/mainroad.orig\u0026#34;] 8- path = my-hugo-site/themes/mainroad.orig 9+[submodule \u0026#34;themes/mainroad.orig\u0026#34;] 10+ path = themes/mainroad.orig 11 url = https://github.com/vimux/mainroad.git 12-[submodule \u0026#34;my-hugo-site/themes/hugo-clarity.orig\u0026#34;] 13- path = my-hugo-site/themes/hugo-clarity.orig 14+[submodule \u0026#34;themes/hugo-clarity.orig\u0026#34;] 15+ path = themes/hugo-clarity.orig 16 url = https://github.com/chipzoller/hugo-clarity Noch ein Abhilfeversuch 1uli@ulicsl:~/git/github/uli-heller/uli.heller.cool$ git submodule update --init 2Submodul \u0026#39;themes/hugo-clarity.orig\u0026#39; (https://github.com/chipzoller/hugo-clarity) für Pfad \u0026#39;themes/hugo-clarity.orig\u0026#39; in die Konfiguration eingetragen. 3Submodul \u0026#39;themes/mainroad.orig\u0026#39; (https://github.com/vimux/mainroad.git) für Pfad \u0026#39;themes/mainroad.orig\u0026#39; in die Konfiguration eingetragen. 4Klone nach \u0026#39;/home/uli/git/github/uli-heller/uli.heller.cool/themes/hugo-clarity.orig\u0026#39;... 5Klone nach \u0026#39;/home/uli/git/github/uli-heller/uli.heller.cool/themes/mainroad.orig\u0026#39;... 6Submodul-Pfad \u0026#39;themes/hugo-clarity.orig\u0026#39;: \u0026#39;174a5e638704181c744934b75c327c665844ab04\u0026#39; ausgecheckt 7Submodul-Pfad \u0026#39;themes/mainroad.orig\u0026#39;: \u0026#39;13e04b3694ea2d20a68cfbfaea42a8c565079809\u0026#39; ausgecheckt Schlusstest 1uli@ulicsl:~/git/github/uli-heller/uli.heller.cool$ git commit . 2Auf Branch main 3Ihr Branch ist auf demselben Stand wie \u0026#39;origin/main\u0026#39;. 4 5Unversionierte Dateien: 6 (benutzen Sie \u0026#34;git add \u0026lt;Datei\u0026gt;...\u0026#34;, um die Änderungen zum Commit vorzumerken) 7\tcontent/2024-12-29_git-submodule-fehler/ 8 9nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien 10(benutzen Sie \u0026#34;git add\u0026#34; zum Versionieren) Das sieht schon wieder ganz gut aus! Uff!\nLinks Keine Versionen Getestet mit Ubuntu-20.04 und Git-2.47.1\nHistorie 2024-12-29: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-29_git-submodule-fehler/","section":"blog","tags":["git"],"title":"Fehlermeldung bei Git-Submodule nach Repo-Umstellungen"},{"body":" Hier beschreibe ich, wie ich eine Software-Inventurliste (SBOM) mit Trivy erstelle.\nSBOM für ein Java-Projekt 1cd springboot-hello-world 2./gradlew --write-locks 3trivy fs --format spdx-json --output springboot-hello-world.sbom.json . Die Software-Inventurliste (SBOM) sieht dann so aus: javaapp-sbom.json.\nSBOM für einen LXC/LXD-Container 1sudo nsenter --target \u0026#34;$(cat /var/snap/lxd/common/lxd.pid)\u0026#34; --mount\\ 2 /root/bin/trivy rootfs --format spdx-json --output build-2004.sbom.json \u0026#34;/var/snap/lxd/common/lxd/containers/build-2004/rootfs/\u0026#34; Die Software-Inventurliste (SBOM) sieht dann so aus: lxc-lxd-sbom.json.\nLinks Github - Trivy - Releases Versionen Getestet mit Ubuntu-20.04 und Trivy-v0.52.0.\nHistorie 2024-12-28: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-28_trivy-sbom/","section":"blog","tags":["trivy","sicherheit","sbom"],"title":"Erstellung einer Software-Inventurliste (SBOM) mit Trivy"},{"body":" Der Versuch der Umstellung auf das Theme \u0026quot;Clarity\u0026quot; ist vor ein paar Tagen gescheitert. Details stehen hier: Hugo: Kurztest vom Theme Clarity. Danach habe ich weitere Tests durchgeführt. Diese waren relativ erfolgreich. Details: Hugo: Neustart mit dem Theme Clarity.\nNun versuche ich erneut, meine Webseite umzustellen auf das Theme Clarity.\nGit-Zweig anlegen 1git fetch --all 2git pull --rebase 3git checkout -b clarity Theme Clarity installieren Das Theme \u0026quot;Clarity\u0026quot; ist bereits im Rahmen von Hugo: Kurztest vom Theme Clarity eingespielt worden.\nTheme Clarity aktivieren 1git rm hugo.toml 2cp -a themes/hugo-clarity/exampleSite/config . Theme Clarity anpassen PageBundles aktivieren - Links auf Bilder 1diff --git a/my-hugo-site/config/_default/params.toml b/my-hugo-site/config/_default/params.toml 2index 4fc2c74..3a3c661 100644 3--- a/my-hugo-site/config/_default/params.toml 4+++ b/my-hugo-site/config/_default/params.toml 5@@ -27,7 +27,7 @@ numberOfTagsShown = 14 # Applies for all other default \u0026amp; custom taxonomies. e.g 6 # Switch to `true` if you\u0026#39;d like to group assets with the post itself (as a \u0026#34;leaf bundle\u0026#34;). 7 # This can be overridden at the page level; what is set below acts as the default if no page variable is set. 8 # Details on page bundles: https://gohugo.io/content-management/page-bundles/#leaf-bundles 9-usePageBundles = false 10+usePageBundles = true 11 12 # Path variables 13 # Standardsprache: Deutsch 1diff --git a/my-hugo-site/config/_default/hugo.toml b/my-hugo-site/config/_default/hugo.toml 2index 387c99f..bc51023 100644 3--- a/my-hugo-site/config/_default/hugo.toml 4+++ b/my-hugo-site/config/_default/hugo.toml 5@@ -8,7 +8,7 @@ copyright = \u0026#34;Copyright © 2008–2018, Steve Francia and the Hugo Authors; all r 6 theme = \u0026#34;hugo-clarity\u0026#34; 7 disqusShortname = \u0026#34;\u0026#34; 8 9-DefaultContentLanguage = \u0026#34;en\u0026#34; 10+DefaultContentLanguage = \u0026#34;de\u0026#34; 11 # [languages] 12 # config/_default/languages.toml Sprachen: Deutsch und Englisch 1diff --git a/my-hugo-site/config/_default/languages.toml b/my-hugo-site/config/_default/languages.toml 2index 71ebefb..483b44e 100644 3--- a/my-hugo-site/config/_default/languages.toml 4+++ b/my-hugo-site/config/_default/languages.toml 5@@ -1,11 +1,10 @@ 6+[de] 7+ title = \u0026#34;Uli Heller ... da läuft was\u0026#34; 8+ LanguageName = \u0026#34;Deutsch\u0026#34; 9+ weight = 1 10 [en] 11- title = \u0026#34;Clarity\u0026#34; 12+ title = \u0026#34;Uli Heller ... there\u0026#39;s something going on\u0026#34; 13 LanguageName = \u0026#34;English\u0026#34; 14- weight = 1 15- 16-[pt] 17- title = \u0026#34;Claridade\u0026#34; # just for the sake of showing this is possible 18- LanguageName = \u0026#34;Português\u0026#34; 19 weight = 2 20 21 # tip: assign the default language the lowest Weight Menü rechts - Social links config/_default/menus/menu.en.toml config/_default/menus/menu.de.toml config/_default/menus/menu.pt.toml ... löschen Autor 1diff --git a/my-hugo-site/config/_default/params.toml b/my-hugo-site/config/_default/params.toml 2index 3a3c661..4e02aee 100644 3--- a/my-hugo-site/config/_default/params.toml 4+++ b/my-hugo-site/config/_default/params.toml 5@@ -2,9 +2,9 @@ 6 enableSearch = true 7 8 # socials 9-twitter = \u0026#34;@janedoe\u0026#34; 10+#twitter = \u0026#34;@janedoe\u0026#34; 11 largeTwitterCard = false # set to true if you want to show a large twitter card image. The default is a small twitter card image 12-introDescription = \u0026#34;Technologist, perpetual student, teacher, continual incremental improvement.\u0026#34; 13+introDescription = \u0026#34;Software-Entwicklung, Gutachten, Systemsicherheit, Datenschutz und Ausdauersport\u0026#34; 14 # introURL = \u0026#34;about/\u0026#34; # set the url for the \u0026#39;read more\u0026#39; button below the introDescription, or set to false to not show the button 15 # description = \u0026#34;A theme based on VMware\u0026#39;s Clarity Design System for publishing technical blogs with Hugo.\u0026#34; # Set your site\u0026#39;s meta tag (SEO) description here. Alternatively set this description in your home page content file e.g. content/_index.md. Whatever is set in the latter will take precedence. 16 # keywords = [\u0026#34;design\u0026#34;, \u0026#34;clarity\u0026#34;, \u0026#34;hugo theme\u0026#34;] # Set your site\u0026#39;s meta tag (SEO) keywords here. Alternatively set these in your home page content file e.g. content/_index.md. Whatever is set in the latter will take precedence. 17@@ -150,7 +150,7 @@ blogDir = \u0026#34;post\u0026#34; 18 19 # website author 20 [author] 21-name = \u0026#34;Jane Doe\u0026#34; 22+name = \u0026#34;Uli Heller\u0026#34; 23 # photo = \u0026#34;images/jane-doe.png\u0026#34; #include this if you would like to show the author photo on the sidebar 24 25 [plausible_analytics] Logo Konvertierung: convert stuttgart.svg -transparent white -scale 40x stuttgart.png\n1diff --git a/my-hugo-site/config/_default/params.toml b/my-hugo-site/config/_default/params.toml 2index 4e02aee..83dd678 100644 3--- a/my-hugo-site/config/_default/params.toml 4+++ b/my-hugo-site/config/_default/params.toml 5@@ -52,7 +52,7 @@ fontsDir = \u0026#34;fonts/\u0026#34; # without a leading forward slash 6 fallBackOgImage = \u0026#34;images/thumbnail.png\u0026#34; 7 8 # Logo image 9-logo = \u0026#34;logos/logo.png\u0026#34; 10+logo = \u0026#34;images/stuttgart.png\u0026#34; 11 12 # center logo on navbar 13 centerLogo = false # Set to \u0026#34;true\u0026#34; for centering or \u0026#34;false\u0026#34; for left aligned. Url korrigiert Unklar: Was genau sind die Auswirkungen? Anscheinend braucht man's für die \u0026quot;share icons\u0026quot;...\n1diff --git a/my-hugo-site/config/_default/hugo.toml b/my-hugo-site/config/_default/hugo.toml 2index bc51023..740e866 100644 3--- a/my-hugo-site/config/_default/hugo.toml 4+++ b/my-hugo-site/config/_default/hugo.toml 5@@ -1,8 +1,8 @@ 6 # set `baseurl` to your root domain 7 # if you set it to \u0026#34;/\u0026#34; share icons won\u0026#39;t work properly on production 8-baseurl = \u0026#34;https://example.com/\u0026#34; # Include trailing slash 9+baseurl = \u0026#34;https://uli.heller.cool/\u0026#34; # Include trailing slash 10 # title = \u0026#34;Clarity\u0026#34; # Edit directly from config/_default/languages.toml # alternatively, uncomment this and remove `title` entry from the aforemention file. Fußzeile Bislang erschien \u0026quot;Copyright\u0026quot; ud \u0026quot;all rights reserved\u0026quot; mehrfach in der Fußzeile.\n1diff --git a/my-hugo-site/config/_default/hugo.toml b/my-hugo-site/config/_default/hugo.toml 2index b01eefe..740e866 100644 3--- a/my-hugo-site/config/_default/hugo.toml 4+++ b/my-hugo-site/config/_default/hugo.toml 5@@ -2,7 +2,7 @@ 6 # if you set it to \u0026#34;/\u0026#34; share icons won\u0026#39;t work properly on production 7 baseurl = \u0026#34;https://uli.heller.cool/\u0026#34; # Include trailing slash 8 # title = \u0026#34;Clarity\u0026#34; # Edit directly from config/_default/languages.toml # alternatively, uncomment this and remove `title` entry from the aforemention file. 9-copyright = \u0026#34;Copyright © 2008–2018, Steve Francia and the Hugo Authors; all rights reserved.\u0026#34; 10+copyright = \u0026#34;Uli Heller\u0026#34; 11 # canonifyurls = true 12 13 theme = \u0026#34;hugo-clarity\u0026#34; Blog-Verzeichnis 1diff --git a/my-hugo-site/config/_default/params.toml b/my-hugo-site/config/_default/params.toml 2index 83dd678..2797713 100644 3--- a/my-hugo-site/config/_default/params.toml 4+++ b/my-hugo-site/config/_default/params.toml 5@@ -67,7 +67,7 @@ codeLineNumbers = false 6 enableMathNotation = false 7 8 # directory(s) where your articles are located 9-mainSections = [\u0026#34;post\u0026#34;] # see config details here https://gohugo.io/functions/where/#mainsections 10+mainSections = [\u0026#34;blog\u0026#34;] # see config details here https://gohugo.io/functions/where/#mainsections 11 12 # Label Non inline images on an article body 13 figurePositionShow = false # toggle on or off globally 14@@ -103,7 +103,7 @@ languageMenuName = \u0026#34;🌐\u0026#34; 15 # comments = false 16 17 # Activate meta ld+json for blog 18-blogDir = \u0026#34;post\u0026#34; 19+blogDir = \u0026#34;blog\u0026#34; 20 21 # Enable or disable Utterances (https://github.com/utterance/utterances) Github Issue-Based Commenting Viele Menüs ausblenden 1diff --git a/my-hugo-site/config/_default/menus/menu.de.toml b/my-hugo-site/config/_default/menus/menu.de.toml 2index 9d6bc81..be39dd3 100644 3--- a/my-hugo-site/config/_default/menus/menu.de.toml 4+++ b/my-hugo-site/config/_default/menus/menu.de.toml 5@@ -1,31 +1,31 @@ 6-[[main]] 7- name = \u0026#34;Home\u0026#34; 8- url = \u0026#34;\u0026#34; 9- weight = -110 10+#[[main]] 11+# name = \u0026#34;Home\u0026#34; 12+# url = \u0026#34;\u0026#34; 13+# weight = -110 14 15-[[main]] 16- name = \u0026#34;Archives\u0026#34; 17- url = \u0026#34;post/rich-content/\u0026#34; 18- weight = -109 19+#[[main]] 20+# name = \u0026#34;Archives\u0026#34; 21+# url = \u0026#34;post/rich-content/\u0026#34; 22+# weight = -109 23 24 # Submenus are done this way: parent -\u0026gt; identifier 25-[[main]] 26- name = \u0026#34;Links\u0026#34; 27- identifier = \u0026#34;Links\u0026#34; 28- weight = -108 29-[[main]] 30- parent = \u0026#34;Links\u0026#34; 31- name = \u0026#34;LinkedIn\u0026#34; 32- url = \u0026#34;https://www.linkedin.com/\u0026#34; 33-[[main]] 34- parent = \u0026#34;Links\u0026#34; 35- name = \u0026#34;Twitter\u0026#34; 36- url = \u0026#34;https://twitter.com/\u0026#34; 37- 38-[[main]] 39- name = \u0026#34;About\u0026#34; 40- url = \u0026#34;about/\u0026#34; 41- weight = -107 42+#[[main]] 43+# name = \u0026#34;Links\u0026#34; 44+# identifier = \u0026#34;Links\u0026#34; 45+# weight = -108 46+#[[main]] 47+# parent = \u0026#34;Links\u0026#34; 48+# name = \u0026#34;LinkedIn\u0026#34; 49+# url = \u0026#34;https://www.linkedin.com/\u0026#34; 50+#[[main]] 51+# parent = \u0026#34;Links\u0026#34; 52+# name = \u0026#34;Twitter\u0026#34; 53+# url = \u0026#34;https://twitter.com/\u0026#34; 54+# 55+#[[main]] 56+# name = \u0026#34;About\u0026#34; 57+# url = \u0026#34;about/\u0026#34; 58+# weight = -107 59 60 # social menu links 61 62diff --git a/my-hugo-site/config/_default/menus/menu.en.toml b/my-hugo-site/config/_default/menus/menu.en.toml 63index 9d6bc81..3b60b33 100644 64--- a/my-hugo-site/config/_default/menus/menu.en.toml 65+++ b/my-hugo-site/config/_default/menus/menu.en.toml 66@@ -1,31 +1,31 @@ 67-[[main]] 68- name = \u0026#34;Home\u0026#34; 69- url = \u0026#34;\u0026#34; 70- weight = -110 71- 72-[[main]] 73- name = \u0026#34;Archives\u0026#34; 74- url = \u0026#34;post/rich-content/\u0026#34; 75- weight = -109 76+#[[main]] 77+# name = \u0026#34;Home\u0026#34; 78+# url = \u0026#34;\u0026#34; 79+# weight = -110 80+# 81+#[[main]] 82+# name = \u0026#34;Archives\u0026#34; 83+# url = \u0026#34;post/rich-content/\u0026#34; 84+# weight = -109 85 86 # Submenus are done this way: parent -\u0026gt; identifier 87-[[main]] 88- name = \u0026#34;Links\u0026#34; 89- identifier = \u0026#34;Links\u0026#34; 90- weight = -108 91-[[main]] 92- parent = \u0026#34;Links\u0026#34; 93- name = \u0026#34;LinkedIn\u0026#34; 94- url = \u0026#34;https://www.linkedin.com/\u0026#34; 95-[[main]] 96- parent = \u0026#34;Links\u0026#34; 97- name = \u0026#34;Twitter\u0026#34; 98- url = \u0026#34;https://twitter.com/\u0026#34; 99- 100-[[main]] 101- name = \u0026#34;About\u0026#34; 102- url = \u0026#34;about/\u0026#34; 103- weight = -107 104+#[[main]] 105+# name = \u0026#34;Links\u0026#34; 106+# identifier = \u0026#34;Links\u0026#34; 107+# weight = -108 108+#[[main]] 109+# parent = \u0026#34;Links\u0026#34; 110+# name = \u0026#34;LinkedIn\u0026#34; 111+# url = \u0026#34;https://www.linkedin.com/\u0026#34; 112+#[[main]] 113+# parent = \u0026#34;Links\u0026#34; 114+# name = \u0026#34;Twitter\u0026#34; 115+# url = \u0026#34;https://twitter.com/\u0026#34; 116+# 117+#[[main]] 118+# name = \u0026#34;About\u0026#34; 119+# url = \u0026#34;about/\u0026#34; 120+# weight = -107 121 122 # social menu links Hinweis auf Github 1diff --git a/my-hugo-site/config/_default/params.toml b/my-hugo-site/config/_default/params.toml 2index f6e5907..c474eaa 100644 3--- a/my-hugo-site/config/_default/params.toml 4+++ b/my-hugo-site/config/_default/params.toml 5@@ -89,9 +89,9 @@ enforceLightMode = false 6 # customize footer icon. see issue https://github.com/chipzoller/hugo-clarity/issues/77 7 footerLogo = \u0026#34;images/stuttgart.svg\u0026#34; 8 9-# Customize Sidebar Disclaimer Text 10-# sidebardisclaimer = true 11-# disclaimerText = \u0026#34;The opinions expressed on this site are my own personal opinions and do not represent my employer’s view in any way.\u0026#34; 12+# Customize Sidebar Disclaimer Text - es geht nur Text, kein Markdown oder HTML 13+sidebardisclaimer = true 14+disclaimerText = \u0026#34;Diese Webseite wird bereitgestellt auf und durch Github\u0026#34; 15 16 # Text for the languages menu. Sprachmenü deaktivieren Bislang sieht die Seite auf Englisch sehr leer aus. Also deaktiviere ich das Sprachmenü und konzentriere mich auf Deutsch:\n1----------------- my-hugo-site/config/_default/languages.toml ----------------- 2index f9c6b7e..f27af7a 100644 3@@ -2,9 +2,9 @@ 4 title = \u0026#34;Ulis Welt ... da läuft was\u0026#34; 5 LanguageName = \u0026#34;Deutsch\u0026#34; 6 weight = 1 7-[en] 8- title = \u0026#34;Uli\u0026#39;s world ... there\u0026#39;s something going on\u0026#34; 9- LanguageName = \u0026#34;English\u0026#34; 10- weight = 2 11+#[en] 12+# title = \u0026#34;Uli\u0026#39;s world ... there\u0026#39;s something going on\u0026#34; 13+# LanguageName = \u0026#34;English\u0026#34; 14+# weight = 2 15 16 # tip: assign the default language the lowest Weight 17\\ No newline at end of file 18 19------------------- my-hugo-site/config/_default/params.toml ------------------- 20index c474eaa..b4c77f1 100644 21@@ -94,7 +94,7 @@ sidebardisclaimer = true 22 disclaimerText = \u0026#34;Diese Webseite wird bereitgestellt auf und durch Github\u0026#34; 23 24 # Text for the languages menu. 25-languageMenuName = \u0026#34;������\u0026#34; 26+#languageMenuName = \u0026#34;������\u0026#34; 27 28 # Title separator, default to |. 29 # titleSeparator = \u0026#34;|\u0026#34; TODOs Offen Logo+Motto oben links Home Suchen Bildbreite Textbreite Menübreite Menü: Aktiven Eintrag markieren Inhaltsverzeichnis Copyright + Lizenz Erledigt Logo+Motto oben links Archives Links LinkedIn Twitter About Sprachen Rechts: Github Twitter LinkedIn RSS: OK JaneDoe (rechts) Neueste Artikel (rechts) Fusszeile Test 1hugo -D -E -F server Browser: http://localhost:1313 öffnen\nMainroad vs. Clarity Mainroad Clarity Links Github - Hugo-Clarity Getting Up And Running Clarity - Organizing page resources Hugo: Kurztest vom Theme Clarity Hugo: Neustart mit dem Theme Clarity Historie 2024-12-27: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-27_hugo-clarity-nochmal/","section":"blog","tags":["hugo","clarity"],"title":"Hugo: Nochmal umstellen auf das Theme Clarity"},{"body":" Alle paar Monate erscheint eine neue Version von Gradle. Die muß man dann in seinen Java-Projekten aktualisieren. Hier zeige ich den Ablauf!\nBeispielprojekt Mein Beispielprojekt liegt hier: github:java-example-my-gradle-project.\nAktualisieren 1./gradlew --version 2 # 8.11.1 3 4./gradlew wrapper --gradle-version latest 5 # ... aktualisiert gradle/wrapper/gradle-wrapper.properties 6./gradlew wrapper --gradle-version latest 7 # ... lädt die neue Version herunter 8 # und aktualisiert ggf. die Wrapper-Skripts, -Jars, ... 9 10./gradlew --version 11 # 8.12 Versionen Getestet mit\nGradle-8.11.1 Gradle-8.12 Links github:java-example-my-gradle-project Historie 2024-12-26: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-26_gradle-wrapper-aktualisieren/","section":"blog","tags":["gradle"],"title":"Gradle: Wrapper aktualisieren"},{"body":" Hier beschreibe ich, wie ich einen LXC/LXD-Container mit Trivy auf Schwachstellen untersuche.\nIch würde gerne einen laufenden LXC/LXD-Container mit Trivy scannen. Klar: Ich könnte ihn exportieren und dann den Export scannen. Das erzeugt aber sehr viel Zusatzaufwand und kostet viel Zeit!\nIch gehe so vor:\nTrivy für Nutzer \u0026quot;root\u0026quot; einrichten - /root/bin/trivy\nProzess-ID vom LXD-Daemon ermitteln: cat /var/snap/lxd/common/lxd.pid -\u0026gt; 1957718\nLXC/LXD-Container ermitteln: lxc ls --format csv --columns n (gibt nur die Namen der Container aus)\nLXC/LXD-Container auswählen: build-2404\nScan durchführen:\n1$ sudo nsenter --target \u0026#34;$(cat /var/snap/lxd/common/lxd.pid)\u0026#34; --mount\\ 2 /root/bin/trivy rootfs \u0026#34;/var/snap/lxd/common/lxd/containers/build-2404/rootfs/\u0026#34; 32024-12-22T11:42:59+01:00\tINFO\t[vulndb] Need to update DB 42024-12-22T11:42:59+01:00\tINFO\t[vulndb] Downloading vulnerability DB... 52024-12-22T11:42:59+01:00\tINFO\t[vulndb] Downloading artifact...\trepo=\u0026#34;mirror.gcr.io/aquasec/trivy-db:2\u0026#34; 6 57.93 MiB / 57.93 MiB [-----------------------------------------------------------------------------] 100.00% 4.47 MiB p/s 13s 72024-12-22T11:43:14+01:00\tINFO\t[vulndb] Artifact successfully downloaded\trepo=\u0026#34;mirror.gcr.io/aquasec/trivy-db:2\u0026#34; 82024-12-22T11:43:14+01:00\tINFO\t[vuln] Vulnerability scanning is enabled 92024-12-22T11:43:14+01:00\tINFO\t[secret] Secret scanning is enabled 102024-12-22T11:43:14+01:00\tINFO\t[secret] If your scanning is slow, please try \u0026#39;--scanners vuln\u0026#39; to disable secret scanning 112024-12-22T11:43:14+01:00\tINFO\t[secret] Please see also https://aquasecurity.github.io/trivy/v0.58/docs/scanner/secret#recommendation for faster secret detection 12... 132024-12-22T11:48:03+01:00\tINFO\t[javadb] Java DB is cached for 3 days. If you want to update the database more frequently, \u0026#34;trivy clean --java-db\u0026#34; command clears the DB cache. 142024-12-22T11:48:03+01:00\tWARN\tProvide a higher timeout value, see https://aquasecurity.github.io/trivy/v0.58/docs/configuration 152024-12-22T11:48:03+01:00\tFATAL\tFatal error\trootfs scan error: scan error: scan failed: failed analysis: post analysis error: post analysis error: walk dir error: context deadline exceeded 16 17$ sudo nsenter --target \u0026#34;$(cat /var/snap/lxd/common/lxd.pid)\u0026#34; --mount\\ 18 /root/bin/trivy rootfs \u0026#34;/var/snap/lxd/common/lxd/containers/build-2404/rootfs/\u0026#34;\\ 19 --scanners vuln 20... 212024-12-22T11:50:56+01:00\tINFO\tDetected OS\tfamily=\u0026#34;ubuntu\u0026#34; version=\u0026#34;24.04\u0026#34; 222024-12-22T11:50:56+01:00\tINFO\t[ubuntu] Detecting vulnerabilities...\tos_version=\u0026#34;24.04\u0026#34; pkg_num=907 232024-12-22T11:50:56+01:00\tINFO\tNumber of language-specific files\tnum=0 24 25build-2404 (ubuntu 24.04) 26 27Total: 720 (UNKNOWN: 0, LOW: 87, MEDIUM: 631, HIGH: 2, CRITICAL: 0) 28 29┌───────────────────────────┬──────────────────┬──────────┬──────────┬────────────────────────────┬───────────────────┬──────────────────────────────────────────────────────────────┐ 30│ Library │ Vulnerability │ Severity │ Status │ Installed Version │ Fixed Version │ Title │ 31├───────────────────────────┼──────────────────┼──────────┼──────────┼────────────────────────────┼───────────────────┼──────────────────────────────────────────────────────────────┤ 32│ binutils │ CVE-2017-13716 │ LOW │ affected │ 2.42-4ubuntu2.3 │ │ binutils: Memory leak with the C++ symbol demangler routine │ 33│ │ │ │ │ │ │ in libiberty │ 34│ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2017-13716 │ 35│ ├──────────────────┤ │ │ ├───────────────────┼──────────────────────────────────────────────────────────────┤ 36│ │ CVE-2018-20657 │ │ │ │ │ libiberty: Memory leak in demangle_template function │ 37│ │ │ │ │ │ │ resulting in a denial of service... │ 38│ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2018-20657 │ 39├───────────────────────────┼──────────────────┤ │ │ ├───────────────────┼──────────────────────────────────────────────────────────────┤ 40│ binutils-common │ CVE-2017-13716 │ │ │ │ │ binutils: Memory leak with the C++ symbol demangler routine │ 41│ │ │ │ │ │ │ in libiberty │ 42│ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2017-13716 │ 43│ ├──────────────────┤ │ │ ├───────────────────┼──────────────────────────────────────────────────────────────┤ 44│ │ CVE-2018-20657 │ │ │ │ │ libiberty: Memory leak in demangle_template function │ 45│ │ │ │ │ │ │ resulting in a denial of service... │ 46│ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2018-20657 │ 47... 48├───────────────────────────┼──────────────────┤ │ ├────────────────────────────┼───────────────────┼──────────────────────────────────────────────────────────────┤ 49│ snapd │ CVE-2024-5138 │ │ │ 2.65.3+24.04 │ │ The snapctl component within snapd allows a confined snap to │ 50│ │ │ │ │ │ │ interact ... │ 51│ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2024-5138 │ 52├───────────────────────────┼──────────────────┼──────────┤ ├────────────────────────────┼───────────────────┼──────────────────────────────────────────────────────────────┤ 53│ wget │ CVE-2021-31879 │ MEDIUM │ │ 1.21.4-1ubuntu4.1 │ │ wget: authorization header disclosure on redirect │ 54│ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2021-31879 │ 55└───────────────────────────┴──────────────────┴──────────┴──────────┴────────────────────────────┴───────────────────┴──────────────────────────────────────────────────────────────┘ Links Github - Trivy - Releases Versionen Getestet mit Ubuntu-22.04 und Trivy-v0.58.0.\nHistorie 2024-12-25: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-25_trivy-lxc-container/","section":"blog","tags":["trivy","sicherheit","lxc","lxd"],"title":"Sicherheitsscan eines LXC/LXD-Containers mit Trivy"},{"body":" Hier beschreibe ich, wie ich Java-Anwendungen mit \u0026quot;Trivy\u0026quot; auf Sicherheitslücken untersuche.\nEin Beispiel-Java-Projekt findet sich hier: github:java-example-springboot-hello-world\nWichtig ist insbesondere dieser Teil in \u0026quot;build.gradle\u0026quot;:\n1buildscript { 2 configurations.classpath { 3 resolutionStrategy.activateDependencyLocking() 4 } 5} Damit läuft die Prüfung dann wie folgt:\n1cd springboot-hello-world 2 3./gradlew dependencies --write-locks 4# ... erzeugt *gradle.lockfile 5 6trivy fs . Man erhält Ausgaben wie diese:\n1uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site/static/gradle-bom$ trivy fs . 22024-12-22T10:18:53+01:00\tINFO\t[vulndb] Need to update DB 32024-12-22T10:18:53+01:00\tINFO\t[vulndb] Downloading vulnerability DB... 42024-12-22T10:18:53+01:00\tINFO\t[vulndb] Downloading artifact...\trepo=\u0026#34;mirror.gcr.io/aquasec/trivy-db:2\u0026#34; 557.93 MiB / 57.93 MiB [-----------------------------------------------------------------------------] 100.00% 2.51 MiB p/s 23s 62024-12-22T10:19:19+01:00\tINFO\t[vulndb] Artifact successfully downloaded\trepo=\u0026#34;mirror.gcr.io/aquasec/trivy-db:2\u0026#34; 72024-12-22T10:19:19+01:00\tINFO\t[vuln] Vulnerability scanning is enabled 82024-12-22T10:19:19+01:00\tINFO\t[secret] Secret scanning is enabled 92024-12-22T10:19:19+01:00\tINFO\t[secret] If your scanning is slow, please try \u0026#39;--scanners vuln\u0026#39; to disable secret scanning 102024-12-22T10:19:19+01:00\tINFO\t[secret] Please see also https://aquasecurity.github.io/trivy/v0.58/docs/scanner/secret#recommendation for faster secret detection 112024-12-22T10:19:32+01:00\tINFO\tNumber of language-specific files\tnum=1 122024-12-22T10:19:32+01:00\tINFO\t[gradle] Detecting vulnerabilities... 13 14buildscript-gradle.lockfile (gradle) 15 16Total: 2 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 1, CRITICAL: 0) 17 18┌─────────────────────────────────────┬────────────────┬──────────┬────────┬───────────────────┬───────────────┬─────────────────────────────────────────────────────────────┐ 19│ Library │ Vulnerability │ Severity │ Status │ Installed Version │ Fixed Version │ Title │ 20├─────────────────────────────────────┼────────────────┼──────────┼────────┼───────────────────┼───────────────┼─────────────────────────────────────────────────────────────┤ 21│ org.apache.commons:commons-compress │ CVE-2024-25710 │ HIGH │ fixed │ 1.25.0 │ 1.26.0 │ commons-compress: Denial of service caused by an infinite │ 22│ │ │ │ │ │ │ loop for a corrupted... │ 23│ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2024-25710 │ 24│ ├────────────────┼──────────┤ │ │ ├─────────────────────────────────────────────────────────────┤ 25│ │ CVE-2024-26308 │ MEDIUM │ │ │ │ commons-compress: OutOfMemoryError unpacking broken Pack200 │ 26│ │ │ │ │ │ │ file │ 27│ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2024-26308 │ 28└─────────────────────────────────────┴────────────────┴──────────┴────────┴───────────────────┴───────────────┴─────────────────────────────────────────────────────────────┘ Links Github - Trivy - Releases github:java-example-Beispielprojekt Versionen Getestet mit Ubuntu-22.04 und Trivy-v0.58.0.\nHistorie 2024-12-24: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-24_trivy-java-app/","section":"blog","tags":["trivy","sicherheit","java"],"title":"Sicherheitsscan einer Java-Anwendung mit Trivy"},{"body":" Wenn ich Anwendungen erstelle oder mit Containern arbeite, dass möchte ich gerne wissen, ob mein Werk bekannte Sicherheitslücken aufweist. Dazu nutze ich gerne den Scanner \u0026quot;Trivy\u0026quot;.\nHier beschreibe ich, wie ich ihn einspiele.\nTrivy herunterladen Trivy herunterladen: trivy_0.58.0_Linux-64bit.tar.gz Zusätzlich: .sig-Datei Zusätzlich: .pem-Datei Trivy prüfen Virenprüfung - bspw. mit Virustotal\nSignaturprüfung\n1$ cosign verify-blob trivy_0.58.0_Linux-64bit.tar.gz\\ 2 --certificate trivy_0.58.0_Linux-64bit.tar.gz.pem\\ 3 --signature trivy_0.58.0_Linux-64bit.tar.gz.sig\\ 4 --certificate-identity-regexp \u0026#39;https://github\\.com/aquasecurity/trivy/\\.github/workflows/.+\u0026#39; \\ 5 --certificate-oidc-issuer \u0026#34;https://token.actions.githubusercontent.com\u0026#34; 6Verified OK Trivy auspacken und installieren Temporäres Verzeichnis anlegen und reinwechseln: mkdir /tmp/trivy-extract \u0026amp;\u0026amp; cd /tmp/trivy-extract\nAuspacken: gzip -cd $HOME/Downloads/trivy_0.58.0_Linux-64bit.tar.gz|tar -xf -\nInstallieren: Datei \u0026quot;trivy\u0026quot; irgendwo hinkopieren, wo sie im PATH liegt. Bspw. nach \u0026quot;$HOME/bin\u0026quot;. Achtung: Wenn \u0026quot;root\u0026quot; die Prüfungen durchführen soll, dann unbedingt irgendwo ablegen, wo nur \u0026quot;root\u0026quot; Schreibzugriff hat! Also niemals sowas wie sudo /home/uli/bin/trivy ... ausführen!\nTest: trivy version -\u0026gt; Version: 0.58.0\nTemporäres Verzeichnis löschen: rm -rf /tmp/trivy-extract\nLinks Github - Trivy - Releases Versionen Getestet mit Ubuntu-22.04 und Trivy-v0.58.0.\nHistorie 2024-12-23: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-23_trivy-start/","section":"blog","tags":["trivy","sicherheit"],"title":"Sicherheitsscans mit Trivy"},{"body":" Der Versuch der Umstellung auf das Theme \u0026quot;Clarity\u0026quot; ist vor ein paar Tagen gescheitert. Details stehen hier: Hugo: Kurztest vom Theme Clarity.\nJetzt experimentiere ich nochmal mit \u0026quot;Clarity\u0026quot; indem ich von Grund auf damit starte und meine Artikel reinkopiere. Mal sehen, wie's klappt!\nNeue Hugo-Seite anlegen 1cd /tmp 2hugo new site new-site 3cd new-site Clarity Theme herunterladen 1cd /tmp/new-site 2git clone --depth=1 https://github.com/chipzoller/hugo-clarity themes/hugo-clarity 3rm -rf themes/hugo-clarity/.git Erstsichtung 1cd /tmp/new-site 2cd themes/hugo-clarity/exampleSite 3hugo server --themesDir ../.. Dann im Browser: http://localhost:1313 Sieht richtig gut aus!\nAufbau der neuen Webseite 1cd /tmp/new-site 2cp -a themes/hugo-clarity/exampleSite/config config 3cp -a themes/hugo-clarity/exampleSite/layouts/. layouts/. 4cp -a themes/hugo-clarity/exampleSite/static/. static/. 5cp -a themes/hugo-clarity/exampleSite/content/. content/. 6# 7# hugo.toml und config.toml sichten und ggf. übernehmen 8# nach config/_default/hugo.toml 9# 10rm -f hugo.toml config.toml 11hugo server Dann im Browser: http://localhost:1313 Sieht richtig gut aus (wie zuvor)!\nEigene Inhalte kopieren Irrweg!\n1cd /tmp/new-site 2MY_HUGO=$HOME/private/uli.heller.cool/my-hugo-site 3cp -a \u0026#34;${MY_HUGO}/content/.\u0026#34; content/. 4hugo server Es erscheinen sehr viele Fehlermeldungen:\n1uli@uliip5:/tmp/new-site$ hugo server 2Watching for changes in /tmp/new-site/{archetypes,assets,content,data,i18n,layouts,static,themes} 3Watching for config changes in /tmp/new-site/config/_default, /tmp/new-site/config/_default/menus 4Start building sites … 5hugo v0.136.5-46cccb021bc6425455f4eec093f5cc4a32f1d12c+extended linux/amd64 BuildDate=2024-10-24T12:26:27Z VendorInfo=gohugoio 6 7ERROR render of \u0026#34;term\u0026#34; failed: \u0026#34;/tmp/new-site/themes/hugo-clarity/layouts/_default/list.html:2:6\u0026#34;: execute of template failed: template: _default/list.html:2:6: executing \u0026#34;main\u0026#34; at \u0026lt;partial \u0026#34;archive\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/tmp/new-site/themes/hugo-clarity/layouts/partials/archive.html:16:11\u0026#34;: execute of template failed: template: partials/archive.html:16:11: executing \u0026#34;partials/archive.html\u0026#34; at \u0026lt;partial \u0026#34;excerpt\u0026#34; .\u0026gt;: error calling partial: execute of template failed: template: partials/excerpt.html:12:12: executing \u0026#34;partials/excerpt.html\u0026#34; at \u0026lt;partial \u0026#34;image\u0026#34; (dict \u0026#34;file\u0026#34; . \u0026#34;alt\u0026#34; $.Title \u0026#34;type\u0026#34; \u0026#34;thumbnail\u0026#34; \u0026#34;Page\u0026#34; $.Page)\u0026gt;: error calling partial: \u0026#34;/tmp/new-site/themes/hugo-clarity/layouts/partials/image.html:29:14\u0026#34;: execute of template failed: template: partials/image.html:29:14: executing \u0026#34;partials/image.html\u0026#34; at \u0026lt;strings.HasPrefix\u0026gt;: error calling HasPrefix: unable to cast maps.Params{\u0026#34;src\u0026#34;:\u0026#34;img/placeholder.png\u0026#34;, \u0026#34;visibility\u0026#34;:[]interface {}{\u0026#34;list\u0026#34;}} of type maps.Params to string 8ERROR render of \u0026#34;section\u0026#34; failed: \u0026#34;/tmp/new-site/themes/hugo-clarity/layouts/_default/list.html:2:6\u0026#34;: execute of template failed: template: _default/list.html:2:6: executing \u0026#34;main\u0026#34; at \u0026lt;partial \u0026#34;archive\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/tmp/new-site/themes/hugo-clarity/layouts/partials/archive.html:16:11\u0026#34;: execute of template failed: template: partials/archive.html:16:11: executing \u0026#34;partials/archive.html\u0026#34; at \u0026lt;partial \u0026#34;excerpt\u0026#34; .\u0026gt;: error calling partial: execute of template failed: template: partials/excerpt.html:12:12: executing \u0026#34;partials/excerpt.html\u0026#34; at \u0026lt;partial \u0026#34;image\u0026#34; (dict \u0026#34;file\u0026#34; . \u0026#34;alt\u0026#34; $.Title \u0026#34;type\u0026#34; \u0026#34;thumbnail\u0026#34; \u0026#34;Page\u0026#34; $.Page)\u0026gt;: error calling partial: \u0026#34;/tmp/new-site/themes/hugo-clarity/layouts/partials/image.html:29:14\u0026#34;: execute of template failed: template: partials/image.html:29:14: executing \u0026#34;partials/image.html\u0026#34; at \u0026lt;strings.HasPrefix\u0026gt;: error calling HasPrefix: unable to cast maps.Params{\u0026#34;src\u0026#34;:\u0026#34;img/placeholder.png\u0026#34;, \u0026#34;visibility\u0026#34;:[]interface {}{\u0026#34;list\u0026#34;}} of type maps.Params to string 9Built in 900 ms 10Error: error building site: render: failed to render pages: render of \u0026#34;page\u0026#34; failed: \u0026#34;/tmp/new-site/themes/hugo-clarity/layouts/_default/baseof.html:21:8\u0026#34;: execute of template failed: template: _default/single.html:21:8: executing \u0026#34;_default/single.html\u0026#34; at \u0026lt;partial \u0026#34;head\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/tmp/new-site/themes/hugo-clarity/layouts/partials/head.html:24:4\u0026#34;: execute of template failed: template: partials/head.html:24:4: executing \u0026#34;partials/head.html\u0026#34; at \u0026lt;partial \u0026#34;opengraph\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/tmp/new-site/themes/hugo-clarity/layouts/partials/opengraph.html:37:21\u0026#34;: execute of template failed: template: partials/opengraph.html:37:21: executing \u0026#34;partials/opengraph.html\u0026#34; at \u0026lt;add $relpath .\u0026gt;: error calling add: can\u0026#39;t apply the operator to the values Einzelne Seite kopieren 1cd /tmp/new-site 2rm -rf content 3mkdir content 4cp -a themes/hugo-clarity/exampleSite/content/. content/. 5hugo server 6# Klappt wieder - Strg-C 7 8MY_HUGO=$HOME/private/uli.heller.cool/my-hugo-site 9cp $MY_HUGO/content/blog/2024-11-20_start-mit-hugo.md content/post 10hugo server 11# Klappt! - Strg-C 12 13cp $MY_HUGO/content/blog/*.md content/post 14hugo server 15# Klappt! - Strg-C 16 17mkdir content/blog 18cp $MY_HUGO/content/blog/*.md content/blog 19hugo server 20# Klappt! - Strg-C 21rm -rf content/blog 22 23cp -a $MY_HUGO/content/blog/2024-11-22_hugo-mainroad-breite content/post/. 24hugo server 25# Klappt! Es fehlen aber die Bilder im neu kopierten Artikel - Strg-C Fehlende Bilder bei PageBundles Laut Clarity - Organizing page resources soll der Parameter usePageBundles=true dafür sorgen, dass die Bilder angezeigt werden. Das habe ich ausprobiert an verschiedenen Stellen:\nIm Parameter-Bereich der Seite: Klappt! config/_default/hugo.toml: Klappt nicht config/hugo.toml: Klappt nicht hugo.toml: Klappt nicht config/_defaults/params.toml: Klappt config/_defaults/params.toml kopieren nach config/params.toml und dort anpassen: Klappt nicht! Artikel kopieren 1cd /tmp/new-site 2 3MY_HUGO=$HOME/private/uli.heller.cool/my-hugo-site 4cp -a $MY_HUGO/content/articles content/articles 5hugo server 6# Klappt 7 8cp -a $MY_HUGO/content/about.md content/. 9hugo server --disableFastRender 10# Klappt 11 12cp -a $MY_HUGO/content/license content/license 13hugo server --disableFastRender 14# Fehlermeldungen! Es erscheinen diese Fehlermeldungen:\n1uli@uliip5:/tmp/new-site$ hugo server --disableFastRender 2Watching for changes in /tmp/new-site/{archetypes,assets,content,data,i18n,layouts,static,themes} 3Watching for config changes in /tmp/new-site/config/_default, /tmp/new-site/config/_default/menus 4Start building sites … 5hugo v0.136.5-46cccb021bc6425455f4eec093f5cc4a32f1d12c+extended linux/amd64 BuildDate=2024-10-24T12:26:27Z VendorInfo=gohugoio 6 7ERROR [en] REF_NOT_FOUND: Ref \u0026#34;/blog/2024-11-25_lizenzen\u0026#34;: \u0026#34;/tmp/new-site/content/license/index.md:23:46\u0026#34;: page not found 8ERROR [en] REF_NOT_FOUND: Ref \u0026#34;/blog/2024-11-25_lizenzen\u0026#34;: \u0026#34;/tmp/new-site/content/license/index.md:31:44\u0026#34;: page not found 9Built in 543 ms 10Error: error building site: logged 2 error(s) Korrekturversuch:\n1find content/license -type f | xargs -n1 sed -i -e \u0026#34;s,/blog/,/post/,\u0026#34; 2cp -a $MY_HUGO/content/blog/2024-11-25* content/post/. 3hugo server --disableFastRender 4# Klappt! Weiter geht's:\n1cp -a $MY_HUGO/content/tests content/tests 2hugo server --disableFastRender 3# Klappt! 4 5cp -a $MY_HUGO/content/hugo-docs content/hugo-docs 6hugo server --disableFastRender 7# Viele Fehler! 8 9rm -rf content/hugo-docs 10 11cp -a $MY_HUGO/content/i content/i 12hugo server --disableFastRender 13# Klappt! 14 15cp -a $MY_HUGO/content/blog/. content/post/. 16hugo server --disableFastRender 17# Klappt! Probleme mit \u0026quot;hugo-docs\u0026quot; Einzelne Datei kopieren:\n1cd /tmp/new-site 2 3mkdir content/hugo-docs 4MY_HUGO=$HOME/private/uli.heller.cool/my-hugo-site 5cp $MY_HUGO/content/hugo-docs/_index.md content/hugo-docs/. 6hugo server --disableFastRender 7# Klappt 8 9cp $MY_HUGO/content/hugo-docs/faq.md content/hugo-docs/. 10hugo server --disableFastRender 11# Klappt 12 13cp $MY_HUGO/content/hugo-docs/basic-elements.md content/hugo-docs/. 14hugo server --disableFastRender 15# Klappt 16 17cp $MY_HUGO/content/hugo-docs/customization.md content/hugo-docs/. 18hugo server --disableFastRender 19# Fehler 20rm content/hugo-docs/customization.md 21 22cp $MY_HUGO/content/hugo-docs/getting-started.md content/hugo-docs/. 23content/hugo-docs/customization.md 24hugo server --disableFastRender 25# Klappt 26 27cp $MY_HUGO/content/hugo-docs/getting-started-with-hugo.md content/hugo-docs/. 28hugo server --disableFastRender 29# Klappt 30 31cp $MY_HUGO/content/hugo-docs/hugo-template-primer.md content/hugo-docs/. 32hugo server --disableFastRender 33# Klappt Korrektur hugo-docs/customization.md Mit dieser Korrektur klappt es auch mit der Datei \u0026quot;hugo-docs/customization.md\u0026quot;:\n1diff --git a/my-hugo-site/content/hugo-docs/customization.md b/my-hugo-site/content/hugo-docs/customization.md 2index b6c6e0e..5091baf 100644 3--- a/my-hugo-site/content/hugo-docs/customization.md 4+++ b/my-hugo-site/content/hugo-docs/customization.md 5@@ -5,10 +5,10 @@ description: Describes common Mainroad theme configuration parameters that can b 6 lead: Describes common Mainroad theme configuration parameters that can be adjusted via config file or via Front Matter 7 section. 8 date: 2022-01-24T14:00:00.000Z 9-thumbnail: 10- src: \u0026#34;img/placeholder.png\u0026#34; 11- visibility: 12- - list 13+#thumbnail: 14+# src: \u0026#34;img/placeholder.png\u0026#34; 15+# visibility: 16+# - list 17 authorbox: false 18 sidebar: false 19 pager: false Fazit Die Umstellung auf das Theme \u0026quot;Clarity\u0026quot; klappt ganz gut. Probleme bestehen bei den \u0026quot;hugo-docs/customization.md\u0026quot;, diese können recht einfach korrigiert werden.\nOffene Punkte:\nLogo oben links CLARITY Github-Link oben rechts Menu Home Archives Links LinkedIn Twitter About Fußzeile Sprache - Englisch + Portugisisch Author oben rechts - Jane Doe Links Github - Hugo-Clarity Getting Up And Running Clarity - Organizing page resources Hugo: Kurztest vom Theme Clarity Historie 2024-12-22: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-22_hugo-clarity-start/","section":"blog","tags":["hugo","clarity"],"title":"Hugo: Neustart mit dem Theme Clarity"},{"body":"","link":"https://uli.heller.cool/tags/forgejo/","section":"tags","tags":null,"title":"Forgejo"},{"body":" Git ermöglicht es, auf Teile eines Git-Repositories zuzugreifen ohne das Repo zuvor Clonen zu müssen. Dies verwende ich beispielsweise, um über alle meine Kunden-Git-Projekte Auswertungen durchzuführen.\nLeider klappt das Verfahren auf Github überhaupt nicht. Eine Lösung hierfür folgt weiter hinten!\nInhalt einer einzelnen Datei Ich würde gerne auf den Inhalt der Datei \u0026quot;build.gradle\u0026quot; in einem meiner Forgejo-Projekte zugreifen.\nWas brauche ich alles?\nProjekt-URL: gitea@gitea.heller.cool:ich/mein-projekt.git Branchname: main Dateiname: /build.gradle Abfragekommando und Ausgaben:\n1$ URL=gitea@gitea.heller.cool:ich/mein-projekt.git 2$ BRANCH=main 3$ FILE=build.gradle 4 5$ git archive --remote=\u0026#34;${URL}\u0026#34; --format=tar ${BRANCH}: \u0026#34;${FILE}\u0026#34;|tar -Oxf - 6buildscript { 7 repositories { 8 mavenLocal() 9... Fehlermeldung bei falschem Dateinamen:\n1$ URL=gitea@gitea.heller.cool:ich/mein-projekt.git 2$ BRANCH=main 3$ FILE=uli-war-da-und-ist-jetzt-weg.txt 4 5$ git archive --remote=\u0026#34;${URL}\u0026#34; --format=tar ${BRANCH}: \u0026#34;${FILE}\u0026#34;|tar -Oxf - 6fatal: sent error to the client: git upload-archive: archiver died with error 7Forgejo: Failed to execute git command 8remote: fatal: pathspec \u0026#39;uli-war-da-und-ist-jetzt-weg.txt\u0026#39; did not match any files 9remote: git upload-archive: archiver died with error 10tar: Das sieht nicht wie ein „tar“-Archiv aus. 11tar: Beende mit Fehlerstatus aufgrund vorheriger Fehler Inhalt mehrerer gleichartig benannter Dateien 1$ URL=gitea@gitea.heller.cool:ich/mein-projekt.git 2$ BRANCH=main 3$ FILES=\u0026#34;**build.gradle\u0026#34; 4 5$ git archive --remote=\u0026#34;${URL}\u0026#34; --format=tar ${BRANCH}: \u0026#34;${FILES}\u0026#34;|tar -Oxf - 6# Alle build.gradle-Dateien werden angezeigt 7 8$ git archive --remote=\u0026#34;${URL}\u0026#34; --format=tar ${BRANCH}: \u0026#34;${FILES}\u0026#34; \u0026gt;mein-projekt-build-gradle.tar 9# TAR mit allen build.gradle-Dateien wird abgelegt Inhalt mehrerer Dateien 1$ URL=gitea@gitea.heller.cool:ich/mein-projekt.git 2$ BRANCH=main 3 4$ git archive --remote=\u0026#34;${URL}\u0026#34; --format=tar ${BRANCH}: \u0026#34;**build.gradle\u0026#34; \u0026#34;**.java\u0026#34; \u0026gt;mein-projekt-bgj.tar 5# TAR mit allen build.gradle- und java-Dateien wird abgelegt Fehlermeldung bei Github Mit einer SSH-Url:\n1$ URL=git@github.com:uli-heller/mein-projekt.git 2$ BRANCH=main 3 4$ git archive --remote=\u0026#34;${URL}\u0026#34; --format=tar ${BRANCH}: \u0026#34;**.md\u0026#34; \u0026gt;mein-projekt-md.tar 5Invalid command: git-upload-archive \u0026#39;uli-heller/mein-projekt.git\u0026#39; 6 You appear to be using ssh to clone a git:// URL. 7 Make sure your core.gitProxy config option and the 8 GIT_PROXY_COMMAND environment variable are NOT set. 9Schwerwiegend: Die Gegenseite hat unerwartet abgebrochen. 10tar: Das sieht nicht wie ein „tar“-Archiv aus. 11tar: Beende mit Fehlerstatus aufgrund vorheriger Fehler Mit einer HTTPS-URL:\n1$ URL=git@github.com:uli-heller/mein-projekt.git 2$ BRANCH=main 3 4$ git archive --remote=\u0026#34;${URL}\u0026#34; --format=tar ${BRANCH}: \u0026#34;**.md\u0026#34; \u0026gt;mein-projekt-md.tar 5Fehler: RPC fehlgeschlagen; HTTP 403 curl 22 The requested URL returned error: 403 6Schwerwiegend: git archive: ACK/NAK erwartet, Flush-Paket bekommen 7tar: Das sieht nicht wie ein „tar“-Archiv aus. 8tar: Beende mit Fehlerstatus aufgrund vorheriger Fehler Gemäß StackOverflow - git export from github remote repository wird git archive von Github nicht unterstützt.\nEine Abhilfe, die ähnlich wie git archive funktioniert, ist dieses Skript:\n1#!/bin/sh 2URL=\u0026#34;$1\u0026#34; 3BRANCH=\u0026#34;$2\u0026#34; 4shift 5shift 6 7mkdir /tmp/new-folder || exit 1 8( 9 { 10 cd /tmp/new-folder 11 git init -b main. 12 git remote add origin \u0026#34;${URL}\u0026#34; 13 git config core.sparseCheckout true 14 git config remote.origin.tagopt --no-tags 15 while [ $# -gt 0 ]; do 16 echo \u0026#34;${1}\u0026#34; \u0026gt;\u0026gt;.git/info/sparse-checkout 17 shift 18 done 19 git pull --depth=1 --no-tags origin \u0026#34;${BRANCH}\u0026#34; 20 rm -rf .git 21 } 1\u0026gt;\u0026amp;2 22 tar -cf - . 23) 24rm -rf /tmp/new-folder Am besten speichern unter \u0026quot;mein-git-archive.sh\u0026quot; und dann aufrufen mit\n1./mein-git-archive.sh $URL $BRANCH datei1 datei2 \u0026gt;git.tar Unschön: Das Skript führt zwar einen sparsamen Checkout durch (es werden also nur die gewünschten Dateien ausgecheckt), der Clone enthält aber alle Dateien! Es gibt zwar auch \u0026quot;partial clones\u0026quot;, die bringen für meinen Anwendungsfall aber nix!\nLinks StackOverflow - git export from github remote repository Historie 2024-12-21: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-21_git-archive/","section":"blog","tags":["git","github","forgejo"],"title":"Git: Inhalt ohne \"git clone\""},{"body":"","link":"https://uli.heller.cool/tags/github/","section":"tags","tags":null,"title":"Github"},{"body":"","link":"https://uli.heller.cool/tags/buchhaltung/","section":"tags","tags":null,"title":"Buchhaltung"},{"body":"","link":"https://uli.heller.cool/tags/e-rechnung/","section":"tags","tags":null,"title":"E-Rechnung"},{"body":"","link":"https://uli.heller.cool/categories/e-rechnung/","section":"categories","tags":null,"title":"E-Rechnung"},{"body":" Vorweg: Ich bin kein Rechtsanwalt. Wenn ich hier Vorschriften beschreibe, so sind das meine Laieninterpretationen. Ich würde mich nicht zwingend auf die Richtigkeit verlassen!\nAb dem 1.1.2025 sind Unternehmen verpflichtet, E-Rechnungen entgegennehmen zu können. Im Wesentlichen reicht dafür technisch ein Email-Postfach aus. Also sowas wie \u0026quot;buchhaltung@meine-firma.de\u0026quot;. So weit, so einfach.\nWas ist zu tun, wenn nun tatsächlich jemand eine E-Rechnung dorthin schickt?\nBeispielrechnungen Eine Beispielrechnung findet sich hier:\nzugferd_2p1_MINIMUM_Rechnung.pdf zugferd_2p1_MINIMUM_Rechnung.xml Mehr Beispiele: Verzeichnis mit Testdateien\nEmpfang einer E-Rechnung im PDF-Format Eine E-Rechnung im PDF-Format sieht bspw. so aus: zugferd_2p1_MINIMUM_Rechnung.pdf\nWenn man eine E-Rechnung im PDF-Format empfängt, dann kann man sich \u0026quot;dumm stellen\u0026quot; und sie einfach mit den üblichen PDF-Betrachterprogrammen untersuchen und bearbeiten. Typischerweise wird es kein Problem geben.\nABER: Wenn der Rechnungssteller Mist baut, dann weicht der PDF-Teil vom E-Rechnungs-Teil ab. Meinem Verständnis nach ist künftig der E-Rechnungsteil verbindlich. Man muß im Zweifel also die Beträge des E-Rechnungsteils begleichen und nicht die PDF-Beträge. In einem üblichen PDF-Betrachterprogramm sieht man diese nicht.\nEmpfang einer E-Rechnung im XML-Format Eine E-Rechnung im XML-Format sieht bspw. so aus: zugferd_2p1_MINIMUM_Rechnung.xml\nMan kann sie bspw. mit einem Dateieditor wie vi öffnen und sichten. Das ist sehr unkomfortabel und fehlerträchtig!\nSichtung von E-Rechnungen mit Quba Glücklicherweise gibt es mit Quba-Viewer ein Anzeigeprogramm für elektronische Rechnungen.\nIch habe für meine Tests die AppImage-Version heruntergeladen und gestartet. Nach dem Start erhält man eine Maske wie diese:\nDer \u0026quot;rote Pfeil\u0026quot; zeigt den Weg zu Beispieldateien.\nEine PDF-Datei mit enthaltener E-Rechnung sieht in Quba so aus:\nLinks sieht man die PDF-Darstellung analog zu einem PDF-Betrachter. Rechts die E-Rechnung.\nBei einer XML-Datei sieht's so aus:\nIch denke, damit kann man klarkommen.\nOffene Punkte Wie \u0026quot;verlässlich\u0026quot; ist Quba? Bei der Anzeige steht ja immer groß dran \u0026quot;keine Gewährleistung\u0026quot;... Wie sichert man sich gegen falsche Rechnungen? \u0026quot;Theoretisch\u0026quot; kann einem ja \u0026quot;jeder\u0026quot; solche Rechnungen schicken. Wenn derjenige dann \u0026quot;richtige\u0026quot; Firmen immitiert - wie bspw. die Telekom oder Vodafone - dann können leicht Fehlbuchungen erfolgen! Versionen Getestet mit Ubuntu Linux 20.04 und Quba-1.4.2.\nLinks Quba-Viewer - Webseite - Anzeigeprogramm für elektronische Rechnungen Quba-Viewer - Github Beispielrechnung PDF: zugferd_2p1_MINIMUM_Rechnung.pdf Beispielrechnung XML: zugferd_2p1_MINIMUM_Rechnung.xml Mehr Beispiele: Verzeichnis mit Testdateien Electronic invoices Beispielrechnungen Historie 2024-12-20: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-20_erechnung-lesen-mit-quba/","section":"blog","tags":["e-rechnung","buchhaltung"],"title":"E-Rechnung lesen mit Quba"},{"body":" Bei einem meiner Kunden muß ich für eine Gradle-Builds einen Proxy verwenden, um auf die PackageRegistry des Kunden zuzugreifen. Die wird für die Pakete des Kunden verwendet mit einer Gruppe wie \u0026quot;org.meinkunde\u0026quot;.\nFür öffentlich verfügbare Pakete wie die von SpringBoot darf ich den Proxy nicht verwenden. Er blockt die Zugriffe darauf.\nHier beschreibe ich Konfiguration und Probleme.\nBeispielprojekt Mein Beispielprojekt liegt hier: github:java-example-gradle-proxy.\nZunächst: Proxy für alles Mein Kunde hat grob die nachstehenden Einstellungen in gradle.properties:\n1systemProp.http.proxyHost=http-proxy.meinkunde.org 2systemProp.http.proxyPort=3128 3systemProp.https.proxyHost=http-proxy.meinkunde.org 4systemProp.https.proxyPort=3128 Zu Testzwecken ändere ich das in\n1systemProp.http.proxyHost=localhost 2systemProp.http.proxyPort=1234 3systemProp.https.proxyHost=localhost 4systemProp.https.proxyPort=1234 Dann in Terminalfenster 1:\n1$ nc -k -l 1234 2# Bleibt hängen Und in Terminalfenster 2:\n1gradle-proxy$ ./gradlew -g h build 2Downloading https://services.gradle.org/distributions/gradle-8.11.1-bin.zip 3 4Exception in thread \u0026#34;main\u0026#34; java.io.IOException: Downloading from https://services.gradle.org/distributions/gradle-8.11.1-bin.zip failed: timeout (10000ms) 5\tat org.gradle.wrapper.Install.forceFetch(SourceFile:4) 6\tat org.gradle.wrapper.Install$1.call(SourceFile:8) 7\tat org.gradle.wrapper.GradleWrapperMain.main(SourceFile:67) 8Caused by: java.net.SocketTimeoutException: Read timed out 9\tat java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:278) 10... Es funktioniert also nicht. Blick auf Terminalfenster 1:\n1$ nc -k -l 1234 2CONNECT services.gradle.org:443 HTTP/1.1 3User-Agent: Java/21.0.1 4Host: services.gradle.org 5Accept: */* 6Proxy-Connection: keep-alive Erstes Ziel: Herunterladen von gradle.zip soll klappen Also Ausnahme: services.gradle.org\ngradle.properties:\n1systemProp.http.proxyHost=localhost 2systemProp.http.proxyPort=1234 3systemProp.https.proxyHost=localhost 4systemProp.https.proxyPort=1234 5 6systemProp.http.nonProxyHosts=services.gradle.org 7systemProp.https.nonProxyHosts=services.gradle.org Terminalfenster 2: Identisch wie zuvor\nTerminalfenster 1:\n1$ nc -k -l 1234 2CONNECT github.com:443 HTTP/1.1 3User-Agent: Java/21.0.1 4Host: github.com 5Accept: */* 6Proxy-Connection: keep-alive Also: Noch eine Ausnahme in gradle.properties:\n1... 2systemProp.http.nonProxyHosts=services.gradle.org|github.com 3systemProp.https.nonProxyHosts=services.gradle.org|github.com Ablauf wiederholt sich für\nobjects.githubusercontent.com Also gradle.properties:\n1... 2systemProp.http.nonProxyHosts=services.gradle.org|github.com|objects.githubusercontent.com 3systemProp.https.nonProxyHosts=services.gradle.org|github.com|objects.githubusercontent.com Danach klappt das Herunterladen der Gradle.ZIP-Datei!\nZweites Ziel: Herunterladen der öffentlichen Artefakte soll klappen Ablauf wie zuvor mit den beiden Terminalfenstern.\nTerminalfenster 2:\n1gradle-proxy$ ./gradlew -g h build 2\u0026gt; Task :compileJava 3\u0026gt; Task :compileJava FAILED 4 5FAILURE: Build failed with an exception. 6 7* What went wrong: 8Execution failed for task \u0026#39;:compileJava\u0026#39;. 9\u0026gt; Could not resolve all files for configuration \u0026#39;:compileClasspath\u0026#39;. 10 \u0026gt; Could not resolve org.springframework.boot:spring-boot-dependencies:[3.0,). 11 Required by: 12 root project : 13 \u0026gt; Failed to list versions for org.springframework.boot:spring-boot-dependencies. 14 \u0026gt; Unable to load Maven meta-data from https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-dependencies/maven-metadata.xml. 15 \u0026gt; Could not GET \u0026#39;https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-dependencies/maven-metadata.xml\u0026#39;. 16 \u0026gt; Read timed out 17\u0026gt; There are 6 more failures with identical causes. 18 19* Try: 20\u0026gt; Run with --stacktrace option to get the stack trace. 21\u0026gt; Run with --info or --debug option to get more log output. 22\u0026gt; Run with --scan to get full insights. 23\u0026gt; Get more help at https://help.gradle.org. 24 25BUILD FAILED in 1m 33s 261 actionable task: 1 executed Terminalfenster 1:\n1$ nc -k -l 1234 2CONNECT repo.maven.apache.org:443 HTTP/1.1 3Host: repo.maven.apache.org 4User-Agent: Gradle/8.11.1 (Linux;6.8.0-49-generic;amd64) (Oracle Corporation;21.0.1;21.0.1+12-29) Erweitern von gradle.properties:\n1... 2systemProp.http.nonProxyHosts=services.gradle.org|github.com|objects.githubusercontent.com|repo.maven.apache.org 3systemProp.https.nonProxyHosts=services.gradle.org|github.com|objects.githubusercontent.com|repo.maven.apache.org Damit Terminalfenster 2:\n1gradle-proxy$ ./gradlew -g h build 2\u0026gt; Task :compileJava UP-TO-DATE 3\u0026gt; Task :processResources NO-SOURCE 4\u0026gt; Task :classes UP-TO-DATE 5\u0026gt; Task :jar UP-TO-DATE 6\u0026gt; Task :assemble UP-TO-DATE 7\u0026gt; Task :compileTestJava NO-SOURCE 8\u0026gt; Task :processTestResources NO-SOURCE 9\u0026gt; Task :testClasses UP-TO-DATE 10\u0026gt; Task :test NO-SOURCE 11\u0026gt; Task :check UP-TO-DATE 12\u0026gt; Task :build UP-TO-DATE 13 14BUILD SUCCESSFUL in 26s 152 actionable tasks: 2 up-to-date Probleme mit Plugins build.gradle erweitern - \u0026quot;3.4.1-uli\u0026quot; ist eine Phantasie-Version\n1diff --git a/my-hugo-site/static/gradle-proxy/build.gradle b/my-hugo-site/static/gradle-proxy/build.gradle 2index 18ea9d5..df317c4 100644 3--- a/my-hugo-site/static/gradle-proxy/build.gradle 4+++ b/my-hugo-site/static/gradle-proxy/build.gradle 5@@ -1,6 +1,7 @@ 6 plugins { 7 id(\u0026#34;maven-publish\u0026#34;) 8 id(\u0026#34;java-library\u0026#34;) 9+ id \u0026#39;org.springframework.boot\u0026#39; version \u0026#39;3.4.1-uli\u0026#39; 10 } 11 12group = \u0026#39;cool.heller\u0026#39; Vorbereitung in Terminalfenster1: nc -k -l 1234\nBuild starten in Terminalfenster2: ./gradlew build\nDamit Terminalfenster1:\n1uli@uliip5:~/.gradle$ nc -k -l 1234 2CONNECT plugins.gradle.org:443 HTTP/1.1 3Host: plugins.gradle.org 4User-Agent: Gradle/8.11.1 (Linux;6.8.0-49-generic;amd64) (Oracle Corporation;21.0.1;21.0.1+12-29) Also: \u0026quot;nonProxyHosts\u0026quot; erweitern um \u0026quot;plugins.gradle.org\u0026quot;!\nBeobachtung: Ich muß die Erweiterung in $HOME/.gradle/gradle.properties vornehmen. In \u0026quot;java-projekt/gradle.properties\u0026quot; scheint sie nicht zu greifen!\nNachtrag 2024-12-27 - Could not GET 'https://plugins-artifacts.gradle.org/...' ... Heute am 2024-12-27 habe ich mit dem Beispielprojekt github:java-example-springboot-hello-world gearbeitet. Dabei erschien diese Fehlermeldung:\n1uli@ulicsl:~/git/github/uli-heller/uli.heller.cool/my-hugo-site/static/springboot-hello-world$ ./gradlew --write-locks 2To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/8.11.1/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation. 3Daemon will be stopped at the end of the build 4 5FAILURE: Build failed with an exception. 6 7* What went wrong: 8A problem occurred configuring root project \u0026#39;springboot-hello-world\u0026#39;.Could not resolve all artifacts for configuration \u0026#39;classpath\u0026#39;. \u0026gt; Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.4.1. 9 Required by: 10 root project : \u0026gt; org.springframework.boot:org.springframework.boot.gradle.plugin:3.4.1 11 \u0026gt; Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.4.1. 12 \u0026gt; Could not get resource \u0026#39;https://plugins.gradle.org/m2/org/springframework/boot/spring-boot-gradle-plugin/3.4.1/spring-boot-gradle-plugin-3.4.1.pom\u0026#39;. 13 \u0026gt; Could not GET \u0026#39;https://plugins-artifacts.gradle.org/org.springframework.boot/spring-boot-gradle-plugin/3.4.1/e7cb3adea6a8ea7c227f2db62a3a5e584191fd02d7ee255c54b25d8c5e7d9690/spring-boot-gradle-plugin-3.4.1.pom\u0026#39;. 14 \u0026gt; http-proxy.porsche.org: Der Name oder der Dienst ist nicht bekannt 15 16* Try:Run with --stacktrace option to get the stack trace. 17Run with --info or --debug option to get more log output. 18Run with --scan to get full insights. 19Get more help at https://help.gradle.org. 20BUILD FAILED in 4s Korrigieren konnte ich das durch Erweitern der \u0026quot;gradle.properties\u0026quot; um \u0026quot;plugins-artifacts.gradle.org\u0026quot;. Leider kann ich den ursprünglichen Fehler aktuell nicht mehr reproduzieren. Dementsprechend kann ich aktuell auch nicht mir Einträgen wie \u0026quot;plugins*.gradle.org\u0026quot; experimentieren!\nFinale Version von gradle.properties Die finale Version von gradle.properties hat diesen Inhalt:\n1org.gradle.console=plain 2 3systemProp.http.proxyHost=http-proxy.meinkunde.org 4systemProp.http.proxyPort=3128 5systemProp.https.proxyHost=http-proxy.meinkunde.org 6systemProp.https.proxyPort=3128 7 8#systemProp.http.proxyHost=localhost 9#systemProp.http.proxyPort=1234 10#systemProp.https.proxyHost=localhost 11#systemProp.https.proxyPort=1234 12 13systemProp.http.nonProxyHosts=plugins-artifacts.gradle.org|plugins.gradle.org|services.gradle.org|github.com|objects.githubusercontent.com|repo.maven.apache.org|repo1.maven.apache.org|jcenter.bintray.com 14systemProp.https.nonProxyHosts=plugins-artifacts.gradle.org|plugins.gradle.org|services.gradle.org|github.com|objects.githubusercontent.com|repo.maven.apache.org|repo1.maven.apache.org|jcenter.bintray.com Sie liegt typischerweise NICHT im Projektverzeichnis, sondern unter dem Dateinamen \u0026quot;$HOME/.gradle/gradle.properties\u0026quot;.\nVersionen Getestet mit\nGradle-8.11.1 Links github:java-example-Beispielprojekt gradle-proxy Historie 2025-01-11: Weitere Ausnahmen bei nonProxyHosts: repo1.maven.apache.org und jcenter.bintray.com 2024-12-27: Weitere Tests - nonProxyHosts erweitern um plugins-artifacts.gradle.org 2024-12-22: Tests mit Gradle-Plugins - nonProxyHosts erweitern um plugins.gradle.org 2024-12-19: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-19_gradle-proxy/","section":"blog","tags":["gradle","proxy"],"title":"Gradle: Verwendung eines Proxy mit Ausnahmen"},{"body":"","link":"https://uli.heller.cool/tags/proxy/","section":"tags","tags":null,"title":"Proxy"},{"body":" Bei einem meiner Kunden hängen die Java-Projekte von einem BOM-Projekt ab, welches konkrete Versionen vorgibt. Dadurch erreichen wir es, dass bspw. Sicherheitsvorgaben durch Modifikation des BOM-Projektes in allen Java-Projekten umgesetzt werden. Versionen werden nur im BOM-Projekt vorgegeben und nicht in den einzelnen Java-Projekten.\nLeider veröffentlichen einige der Java-Projekte API-Pakete. Bislang enthalten diese eine Abhängigkeit zum BOM-Projekt. Das wollen wir nicht, weil es die Anwendung der API-Projekte erschwert.\nHier beschreibe ich, wir man die BOM-Abhängigkeit \u0026quot;ausblendet\u0026quot;. In meinem Beispiel habe ich eine Abhängigkeit zu \u0026quot;org.springframework.boot:spring-boot-dependencies\u0026quot; und diese möchte ich \u0026quot;ausblenden\u0026quot;.\nAusgangspunkt: Java-Projekt mit der BOM-Abhängigkeit Beispiel: github:java-example-gradle-bom.\nDas Projekt erzeugt per Standard die POM-Datei gradle-bom-1.0.0.pom:\n1\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; 2\u0026lt;project xmlns=\u0026#34;http://maven.apache.org/POM/4.0.0\u0026#34; xsi:schemaLocation=\u0026#34;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\u0026#34; xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34;\u0026gt; 3 \u0026lt;!-- This module was also published with a richer model, Gradle metadata, --\u0026gt; 4 \u0026lt;!-- which should be used instead. Do not delete the following line which --\u0026gt; 5 \u0026lt;!-- is to indicate to Gradle or any Gradle module metadata file consumer --\u0026gt; 6 \u0026lt;!-- that they should prefer consuming it instead. --\u0026gt; 7 \u0026lt;!-- do_not_remove: published-with-gradle-metadata --\u0026gt; 8 \u0026lt;modelVersion\u0026gt;4.0.0\u0026lt;/modelVersion\u0026gt; 9 \u0026lt;groupId\u0026gt;cool.heller\u0026lt;/groupId\u0026gt; 10 \u0026lt;artifactId\u0026gt;gradle-bom\u0026lt;/artifactId\u0026gt; 11 \u0026lt;version\u0026gt;1.0.0\u0026lt;/version\u0026gt; 12 \u0026lt;dependencyManagement\u0026gt; 13 \u0026lt;dependencies\u0026gt; 14 \u0026lt;dependency\u0026gt; 15 \u0026lt;groupId\u0026gt;org.springframework.boot\u0026lt;/groupId\u0026gt; 16 \u0026lt;artifactId\u0026gt;spring-boot-dependencies\u0026lt;/artifactId\u0026gt; 17 \u0026lt;version\u0026gt;[3.0,)\u0026lt;/version\u0026gt; 18 \u0026lt;type\u0026gt;pom\u0026lt;/type\u0026gt; 19 \u0026lt;scope\u0026gt;import\u0026lt;/scope\u0026gt; 20 \u0026lt;/dependency\u0026gt; 21 \u0026lt;/dependencies\u0026gt; 22 \u0026lt;/dependencyManagement\u0026gt; 23 \u0026lt;dependencies\u0026gt; 24 \u0026lt;dependency\u0026gt; 25 \u0026lt;groupId\u0026gt;org.springframework.boot\u0026lt;/groupId\u0026gt; 26 \u0026lt;artifactId\u0026gt;spring-boot-starter-validation\u0026lt;/artifactId\u0026gt; 27 \u0026lt;scope\u0026gt;compile\u0026lt;/scope\u0026gt; 28 \u0026lt;/dependency\u0026gt; 29 \u0026lt;dependency\u0026gt; 30 \u0026lt;groupId\u0026gt;org.springframework.boot\u0026lt;/groupId\u0026gt; 31 \u0026lt;artifactId\u0026gt;spring-boot-starter-web\u0026lt;/artifactId\u0026gt; 32 \u0026lt;scope\u0026gt;runtime\u0026lt;/scope\u0026gt; 33 \u0026lt;/dependency\u0026gt; 34 \u0026lt;dependency\u0026gt; 35 \u0026lt;groupId\u0026gt;org.springframework.boot\u0026lt;/groupId\u0026gt; 36 \u0026lt;artifactId\u0026gt;spring-boot-starter-actuator\u0026lt;/artifactId\u0026gt; 37 \u0026lt;scope\u0026gt;runtime\u0026lt;/scope\u0026gt; 38 \u0026lt;/dependency\u0026gt; 39 \u0026lt;/dependencies\u0026gt; 40\u0026lt;/project\u0026gt; Erweitern von \u0026quot;build.gradle\u0026quot; 1---------------- my-hugo-site/static/gradle-bom/build.gradle ----------------- 2index 0bfb773..bdc80ac 100644 3@@ -5,7 +5,7 @@ plugins { 4 5 group = \u0026#39;cool.heller\u0026#39; 6 //version = \u0026#39;1.0-SNAPSHOT\u0026#39; 7-version = \u0026#39;1.0.0\u0026#39; 8+version = \u0026#39;1.0.1\u0026#39; 9 10 dependencies { 11 // org.springframework.boot:spring-boot-dependencies:3.+ declared with a Maven incompatible version notation 12@@ -40,8 +40,15 @@ publishing { 13 publications { 14 javaLibrary(MavenPublication) { 15 from components.java 16- } 17- } 18+ pom.withXml { 19+ asNode().dependencyManagement.dependencies.dependency.each { dep -\u0026gt; 20+ if (dep.artifactId[0].text() in [\u0026#34;spring-boot-dependencies\u0026#34;, /*\u0026#34;slf4j-log4j12\u0026#34;*/]) { 21+ assert dep.parent().remove(dep) 22+ } 23+ } 24+ } // pom 25+ } // javaLibrary 26+ } // publications 27 repositories { 28 maven { 29 name \u0026#39;local-registry\u0026#39; Die Idee kommt von StackOverflow - How to exclude dependencies in the POM file generated by the Gradle!\nDie Zeile mit \u0026quot;spring-boot-dependencies\u0026quot; bedarf einiger Erklärungen:\n\u0026quot;dep\u0026quot; steht quasi für eine Dependency und ist vom Typ \u0026quot;groovy.util.Node\u0026quot; \u0026quot;dep.artifactId\u0026quot; liefert ein Array aller XML-Elemente '' - wir wissen, dass es nur eines gibt und \u0026quot;nehmen\u0026quot; deshalb das erste und das ist wieder vom Typ \u0026quot;groovy.util.Node\u0026quot; Die Methode \u0026quot;text()\u0026quot; liefert davon dann den \u0026quot;Inhalt\u0026quot;, der wiederum dem Wert der ArtifactId entspricht Dieser Wert wird dann mit einer Liste abgeglichen, die entfernt werden soll. Die Liste enthält nur ein Element Korrigierte POM-Datei Damit erhält man die POM-Datei gradle-bom-1.0.1.pom:\n1\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; 2\u0026lt;project xmlns=\u0026#34;http://maven.apache.org/POM/4.0.0\u0026#34; xsi:schemaLocation=\u0026#34;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\u0026#34; xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34;\u0026gt; 3 \u0026lt;!-- This module was also published with a richer model, Gradle metadata, --\u0026gt; 4 \u0026lt;!-- which should be used instead. Do not delete the following line which --\u0026gt; 5 \u0026lt;!-- is to indicate to Gradle or any Gradle module metadata file consumer --\u0026gt; 6 \u0026lt;!-- that they should prefer consuming it instead. --\u0026gt; 7 \u0026lt;!-- do_not_remove: published-with-gradle-metadata --\u0026gt; 8 \u0026lt;modelVersion\u0026gt;4.0.0\u0026lt;/modelVersion\u0026gt; 9 \u0026lt;groupId\u0026gt;cool.heller\u0026lt;/groupId\u0026gt; 10 \u0026lt;artifactId\u0026gt;gradle-bom\u0026lt;/artifactId\u0026gt; 11 \u0026lt;version\u0026gt;1.0.1\u0026lt;/version\u0026gt; 12 \u0026lt;dependencyManagement\u0026gt; 13 \u0026lt;dependencies/\u0026gt; 14 \u0026lt;/dependencyManagement\u0026gt; 15 \u0026lt;dependencies\u0026gt; 16 \u0026lt;dependency\u0026gt; 17 \u0026lt;groupId\u0026gt;org.springframework.boot\u0026lt;/groupId\u0026gt; 18 \u0026lt;artifactId\u0026gt;spring-boot-starter-validation\u0026lt;/artifactId\u0026gt; 19 \u0026lt;scope\u0026gt;compile\u0026lt;/scope\u0026gt; 20 \u0026lt;/dependency\u0026gt; 21 \u0026lt;dependency\u0026gt; 22 \u0026lt;groupId\u0026gt;org.springframework.boot\u0026lt;/groupId\u0026gt; 23 \u0026lt;artifactId\u0026gt;spring-boot-starter-web\u0026lt;/artifactId\u0026gt; 24 \u0026lt;scope\u0026gt;runtime\u0026lt;/scope\u0026gt; 25 \u0026lt;/dependency\u0026gt; 26 \u0026lt;dependency\u0026gt; 27 \u0026lt;groupId\u0026gt;org.springframework.boot\u0026lt;/groupId\u0026gt; 28 \u0026lt;artifactId\u0026gt;spring-boot-starter-actuator\u0026lt;/artifactId\u0026gt; 29 \u0026lt;scope\u0026gt;runtime\u0026lt;/scope\u0026gt; 30 \u0026lt;/dependency\u0026gt; 31 \u0026lt;/dependencies\u0026gt; 32\u0026lt;/project\u0026gt; Test: Funktioniert es? Java-Projekt, welches die beiden Varianten einbindet: github:java-example-gradle-bom-use\nIch teste beide Varianten durch Variation von \u0026quot;build.gradle\u0026quot;:\nVariante 0: implementation 'cool.heller:gradle-bom:1.0.0' Variante 1: implementation 'cool.heller:gradle-bom:1.0.1' Bei beiden Varianten läuft gradlew durch. Hier die \u0026quot;dependencies\u0026quot; für beide Varianten:\nVariante 0: dependencies-1.0.0.txt Variante 0: dependencies-1.0.1.txt Sehen beide super aus!\nVersionen Getestet mit\nGradle-8.11.1 Links StackOverflow - How to exclude dependencies in the POM file generated by the Gradle Historie 2024-12-18: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-18_gradle-publish-ohne-bom/","section":"blog","tags":["gradle","java","publish"],"title":"Gradle: Veröffentlichen ohne BOM"},{"body":"","link":"https://uli.heller.cool/tags/publish/","section":"tags","tags":null,"title":"Publish"},{"body":" Sehr häufig dienen meine Java-Projekte dazu, irgendwelche Artefakte zu publizieren. Manchmal enthalten die Artefakte irgendwelchen Mist und ich muß sie untersuchen, analysieren und korrigieren. Bislang habe ich die Artefakte wie üblich publiziert (bspw. nach Artifactory oder Gitlab) und dann von dort heruntergeladen und untersucht.\nEs geht auch einfacher!\nAusgangspunkt: Java-Projekt mit Veröffentlichung nach Gitlab build.gradle:\n1... 2tasks.withType(PublishToMavenRepository) { 3 doFirst { 4 println(\u0026#34;Publishing ${publication.groupId}:${publication.artifactId}:${publication.version} to ${repository.url}\u0026#34;) 5 } 6} 7 8publishing { 9 publications { 10 javaPlatform(MavenPublication) { 11 from components.javaPlatform 12 } 13 } 14 repositories { 15 maven { 16 name \u0026#39;gitlab-registry\u0026#39; 17\t// Projektname: uli/my-test-project \u0026lt;-- geht nicht (2024-12) 18\t// Projektname - urlencoded: uli%2Fmy-test-project \u0026lt;-- geht nicht (2024-12) 19\t// Projekt-ID (aus der Settings-Page): 123 \u0026lt;-------------------- geht (2024-12) 20 url = uri(\u0026#34;https://gitlab.heller.cool/api/v4/projects/123/packages/maven\u0026#34;) 21 credentials(HttpHeaderCredentials) { 22 name = \u0026#39;Job-Token\u0026#39; 23 value = System.getenv(\u0026#34;CI_JOB_TOKEN\u0026#34;) 24 } 25 authentication { 26 header(HttpHeaderAuthentication) 27 } 28 } // maven 29 } // repositories 30} 31... Anpassung: Veröffentlichung in lokales Verzeichnis build.gradle:\n1... 2tasks.withType(PublishToMavenRepository) { 3 doFirst { 4 println(\u0026#34;Publishing ${publication.groupId}:${publication.artifactId}:${publication.version} to ${repository.url}\u0026#34;) 5 } 6} 7 8publishing { 9 publications { 10 javaPlatform(MavenPublication) { 11 from components.javaPlatform 12 } 13 } 14 repositories { 15 maven { 16 name \u0026#39;local-registry\u0026#39; 17 url = uri(\u0026#34;file://${buildDir}/local-repository\u0026#34;) 18 } 19 /* 20 maven { 21 name \u0026#39;gitlab-registry\u0026#39; 22\t// Projektname: uli/my-test-project \u0026lt;-- geht nicht (2024-12) 23\t// Projektname - urlencoded: uli%2Fmy-test-project \u0026lt;-- geht nicht (2024-12) 24\t// Projekt-ID (aus der Settings-Page): 123 \u0026lt;-------------------- geht (2024-12) 25 url = uri(\u0026#34;https://gitlab.heller.cool/api/v4/projects/123/packages/maven\u0026#34;) 26 credentials(HttpHeaderCredentials) { 27 name = \u0026#39;Job-Token\u0026#39; 28 value = System.getenv(\u0026#34;CI_JOB_TOKEN\u0026#34;) 29 } 30 authentication { 31 header(HttpHeaderAuthentication) 32 } 33 } // maven 34 */ 35 } // repositories 36} 37... Anpassungen:\n1uli@ulicsl:~/git/github/uli-heller/uli.heller.cool/my-hugo-site/content/blog/2024-12-17_gradle-artefakte-untersuchen$ diff -u build-fragment.gradle.orig build-fragment.gradle 2--- build-fragment.gradle.orig\t2024-12-14 17:47:22.888022820 +0100 3+++ build-fragment.gradle\t2024-12-14 18:04:37.589040215 +0100 4@@ -13,6 +13,11 @@ 5 } 6 repositories { 7 maven { 8+ name \u0026#39;local-registry\u0026#39; 9+ url = uri(\u0026#34;file://${buildDir}/local-repository\u0026#34;) 10+ } 11+ /* 12+ maven { 13 name \u0026#39;gitlab-registry\u0026#39; 14 // Projektname: uli/my-test-project \u0026lt;-- geht nicht (2024-12) 15 // Projektname - urlencoded: uli%2Fmy-test-project \u0026lt;-- geht nicht (2024-12) 16@@ -26,6 +31,7 @@ 17 header(HttpHeaderAuthentication) 18 } 19 } // maven 20+ */ 21 } // repositories 22 } 23 ... Test 1$ ./gradlew publish 2To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/8.11.1/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation. 3Daemon will be stopped at the end of the build 4\u0026gt; Task :compileJava 5\u0026gt; Task :processResources NO-SOURCE 6\u0026gt; Task :classes 7\u0026gt; Task :jar 8\u0026gt; Task :generateMetadataFileForJavaPublication 9\u0026gt; Task :generatePomFileForJavaPublication 10 11\u0026gt; Task :publishJavaPublicationToLocal-registryRepository 12Publishing cool.heller:gradle-maven-publish:1.0-SNAPSHOT to file:/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/static/gradle-maven-publish/build/local-repository 13 14\u0026gt; Task :publish 15 16BUILD SUCCESSFUL in 4s 175 actionable tasks: 5 executed Erzeugte Ordner und Dateien:\nbuild/local-repository/cool/heller/gradle-maven-publish/ maven-metadata.xml maven-metadata.xml.md5 maven-metadata.xml.sha1 maven-metadata.xml.sha256 maven-metadata.xml.sha512 1.0-SNAPSHOT gradle-maven-publish-1.0-20241214.170633-1.jar gradle-maven-publish-1.0-20241214.170633-1.jar.md5 gradle-maven-publish-1.0-20241214.170633-1.jar.sha1 gradle-maven-publish-1.0-20241214.170633-1.jar.sha256 gradle-maven-publish-1.0-20241214.170633-1.jar.sha512 gradle-maven-publish-1.0-20241214.170633-1.module gradle-maven-publish-1.0-20241214.170633-1.module.md5 gradle-maven-publish-1.0-20241214.170633-1.module.sha1 gradle-maven-publish-1.0-20241214.170633-1.module.sha256 gradle-maven-publish-1.0-20241214.170633-1.module.sha512 gradle-maven-publish-1.0-20241214.170633-1.pom gradle-maven-publish-1.0-20241214.170633-1.pom.md5 gradle-maven-publish-1.0-20241214.170633-1.pom.sha1 gradle-maven-publish-1.0-20241214.170633-1.pom.sha256 gradle-maven-publish-1.0-20241214.170633-1.pom.sha512 maven-metadata.xml maven-metadata.xml.md5 maven-metadata.xml.sha1 maven-metadata.xml.sha256 maven-metadata.xml.sha512 Links Gradle - Maven Publish Plugin Historie 2024-12-17: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-17_gradle-artefakte-untersuchen/","section":"blog","tags":["gradle","java","publish"],"title":"Gradle: Artefakte untersuchen"},{"body":" Ich möchte nicht, dass meine Texte für das Anlernen von KI-Modellen verwendet werden. Hauptgrund: Wenn jemand meine Texte in eigene Machwerke einbezieht, dann möchte ich dort eine Referenz auf meinen Text sehen. Das klappt bei KI-generierten Texten überhaupt nicht. Also: Keine KI!\nIch verfolge einen doppelten Ansatz zur Verbannung von KI:\nEinerseits via Linzentbedingungen samt maschinenlesbarer Beschreibung Andererseits via \u0026quot;robots.txt\u0026quot; - da kann ich aber nur die mir bekannten KI-Agenten sperren Den Inhalt der \u0026quot;robots.txt\u0026quot; habe ich hiervon: Custom robots.txt\nDie Datei sieht so aus:\n1# AI bots 2User-agent: Amazonbot 3User-agent: Applebot 4User-agent: Bytespider Ich speichere sie in static/robots.txt.\nGemäß Custom robots.txt muß ich noch meine hugo.toml überarbeiten und die Zeile\n1enableRobotsTxt = false hinzufügen. Bei mir funktioniert es auch ohne. Eventuell liegt es am Theme? Ich verwende aktuell \u0026quot;mainroad\u0026quot;.\nLinks Michael Welford - More Hugo tips and tricks DarkVisitors ...automatische Erzeugung von \u0026quot;robots.txt\u0026quot; Meine Lizenz für Texte wie diesen Historie 2024-12-16: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-16_robots-txt/","section":"blog","tags":["hugo","lizenz"],"title":"Blockieren von KI-Scannern"},{"body":"","link":"https://uli.heller.cool/tags/lizenz/","section":"tags","tags":null,"title":"Lizenz"},{"body":"","link":"https://uli.heller.cool/categories/lizenz/","section":"categories","tags":null,"title":"Lizenz"},{"body":" Ich hasse die optimierte Konsolenausgabe in neueren Versionen von Gradle. Hier beschreibe ich, wie ich zur älteren einfacheren Konsolenausgabe zurückkomme.\nNeue Konsolenausgabe 1uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site/static/gradle-maven-publish$ ./gradlew publish 2 3BUILD SUCCESSFUL in 531ms 45 actionable tasks: 5 executed Was stört mich hieran? Ich kann nicht erkennen, was alles erledigt wurde!\nAlte einfache Konsolenausgabe 1uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site/static/gradle-maven-publish$ ./gradlew -Dorg.gradle.console=plain publish 2\u0026gt; Task :compileJava 3\u0026gt; Task :processResources NO-SOURCE 4\u0026gt; Task :classes 5\u0026gt; Task :jar 6\u0026gt; Task :generateMetadataFileForMavenJavaPublication 7\u0026gt; Task :generatePomFileForMavenJavaPublication 8\u0026gt; Task :publishMavenJavaPublicationToLocalTestRepoRepository 9\u0026gt; Task :publish 10 11BUILD SUCCESSFUL in 598ms 125 actionable tasks: 5 executed Drei Varianten zur Aktivierung der alten Konsolenausgabe Mittels Kommandozeilenoption \u0026quot;-Dorg.gradle.console=plain\u0026quot;\nMittels Kommandozeilenoption \u0026quot;--console=plain\u0026quot;\nMittels Erweiterung von gradle.properties:\n1diff --git a/my-hugo-site/static/gradle-maven-publish/gradle.properties b/my-hugo-site/static/gradle-maven-publish/gradle.properties 2index 336465c..0136d21 100644 3--- a/my-hugo-site/static/gradle-maven-publish/gradle.properties 4+++ b/my-hugo-site/static/gradle-maven-publish/gradle.properties 5@@ -1 +1 @@ 6+org.gradle.console=plain Versionen Getestet mit\nGradle-8.11.1 Links Make –console=plain default Historie 2024-12-15: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-15_gradle-console/","section":"blog","tags":["gradle","java","publish"],"title":"Gradle: \"Einfache\" Konsolenausgabe"},{"body":" Bei einem meiner Kunden habe ich bislang immer das Artifactory-Plugin verwendet um die Artefakte eines Java-Projektes zu veröffentlichen. Da der Kunde seine Artifactory-Instanz abschaltet, ist ein Wechsel zum Standard-Maven-Publish-Plugin fällig.\nLeider gibt dieses Plugin die Namen der Artefakte nicht aus. Die brauche ich aber!\nBeispiel-Ausgaben Artifactory-Plugin 1uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site/static/gradle-artifactory$ ./gradlew artifactoryPublish 2\u0026gt; Task :compileJava 3\u0026gt; Task :processResources NO-SOURCE 4\u0026gt; Task :classes 5\u0026gt; Task :jar 6\u0026gt; Task :generateMetadataFileForJavaPublication 7\u0026gt; Task :generatePomFileForJavaPublication 8\u0026gt; Task :artifactoryPublish 9\u0026gt; Task :extractModuleInfo 10[pool-1-thread-1] Deploying artifact: file:/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/static/gradle-artifactory/build/local-repository/artifactory/cool/heller/gradle-artifactory/1.0-SNAPSHOT/gradle-artifactory-1.0-SNAPSHOT.jar 11... Beispiel-Ausgaben Maven-Publish-Plugin 1uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site/static/gradle-maven-publish$ ./gradlew publish 2\u0026gt; Task :compileJava UP-TO-DATE 3\u0026gt; Task :processResources NO-SOURCE 4\u0026gt; Task :classes UP-TO-DATE 5\u0026gt; Task :jar UP-TO-DATE 6\u0026gt; Task :generateMetadataFileForMavenJavaPublication 7\u0026gt; Task :generatePomFileForMavenJavaPublication 8\u0026gt; Task :publishMavenJavaPublicationToLocalTestRepoRepository 9\u0026gt; Task :publish 10 11BUILD SUCCESSFUL in 476ms 125 actionable tasks: 3 executed, 2 up-to-date Erweiterung \u0026quot;build.gradle\u0026quot; 1------------ my-hugo-site/static/gradle-maven-publish/build.gradle ------------ 2index e4a94ba..ab170a1 100644 3@@ -6,6 +6,12 @@ plugins { 4 group = \u0026#39;cool.heller\u0026#39; 5 version = \u0026#39;1.0-SNAPSHOT\u0026#39; 6 7+tasks.withType(PublishToMavenRepository) { 8+ doFirst { 9+ println(\u0026#34;Publishing ${publication.groupId}:${publication.artifactId}:${publication.version} to ${repository.url}\u0026#34;) 10+ } 11+} 12+ 13 publishing { 14 repositories { 15 // Local repository which we can first publish in it to check artifacts Ausgaben mit Erweiterung 1uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site/static/gradle-maven-publish$ ./gradlew publish 2\u0026gt; Task :compileJava UP-TO-DATE 3\u0026gt; Task :processResources NO-SOURCE 4\u0026gt; Task :classes UP-TO-DATE 5\u0026gt; Task :jar UP-TO-DATE 6\u0026gt; Task :generateMetadataFileForMavenJavaPublication 7\u0026gt; Task :generatePomFileForMavenJavaPublication 8 9\u0026gt; Task :publishMavenJavaPublicationToLocalTestRepoRepository 10Publishing cool.heller:gradle-maven-publish:1.0-SNAPSHOT to file:/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/static/gradle-maven-publish/build/local-repository/ 11 12\u0026gt; Task :publish 13 14BUILD SUCCESSFUL in 510ms 155 actionable tasks: 3 executed, 2 up-to-date Links Gradle - Maven Publish Plugin github:java-example-gradle-artifactory StackOverflow - Get uri of published artifact using maven-publish gradle plugin Historie 2024-12-14: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-14_gradle-publish-info/","section":"blog","tags":["gradle","java","publish"],"title":"Gradle: Ausgabe des veröffentlichten Artefakts"},{"body":" Hier zeige ich, wie ich mit einem Java-Projekt \u0026quot;loslege\u0026quot;. Klar: Man kann auch SpringInitializer oder ähnliches verwenden. Ich versuche es ohne!\nLeeres Verzeichnis anlegen 1mkdir my-gradle-project 2cd my-gradle-projec 3touch settings.gradle 4gradle wrapper Gradle Wrapper aktualisieren 1./gradlew wrapper --gradle-version latest 2./gradlew wrapper --gradle-version latest Hinweis: Die doppelte Ausführung des gleichen Kommandos ist Absicht! Die erste Ausführung ersetzt nur die Versionsnummer in einer Konfigurationsdatei, die zweite lädt die neuen Komponenten herunter!\nJava-Klasse 1mkdir -p src/main/java 2cat \u0026gt;src/main/java/Main.java \u0026lt;\u0026lt;EOF 3class Main { 4 public static void main(String[] args) { 5 System.out.println(\u0026#34;Hello, World!\u0026#34;); 6 } 7} 8EOF Bauplan - build.gradle 1cat \u0026gt;build.gradle \u0026lt;\u0026lt;\u0026#39;EOF\u0026#39; 2plugins { 3 id(\u0026#34;maven-publish\u0026#34;) 4 id(\u0026#34;java\u0026#34;) 5} 6 7group = \u0026#39;cool.heller\u0026#39; 8version = \u0026#39;1.0-SNAPSHOT\u0026#39; 9 10publishing { 11 repositories { 12 // Local repository which we can first publish in it to check artifacts 13 maven { 14 name = \u0026#34;LocalTestRepo\u0026#34; 15 url = uri(\u0026#34;file://${buildDir}/local-repository\u0026#34;) 16 } 17 } 18 publications { 19 mavenJava(MavenPublication) { 20 from components.java 21 } 22 } 23} 24EOF Bauen und veröffentlichen 1./gradlew publish 2# Erzeugt ein Artefakt unter \u0026#34;build/local-repository/cool/heller/my-gradle-project/1.0-SNAPSHOT\u0026#34; Versionen Getestet mit\nGradle-8.11.1 Links Gradle - Maven Publish Plugin github:java-example-my-gradle-project Historie 2024-12-14: Hinweis auf Doppelausführung 2024-12-13: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-13_gradle/","section":"blog","tags":["gradle","java"],"title":"Gradle: Starten eines Java-Projektes"},{"body":" Ich stelle meine Webseite kurz um auf das Theme \u0026quot;Clarity\u0026quot; und schaue, wie's aussieht.\nTheme herunterladen 1git submodule add https://github.com/chipzoller/hugo-clarity themes/hugo-clarity.orig 2mkdir themes/hugo-clarity 3(cd themes/hugo-clarity.orig \u0026amp;\u0026amp; git archive HEAD)|(cd themes/hugo-clarity \u0026amp;\u0026amp; tar xf -) Theme einfach aktivieren Ändern in hugo.toml: theme=\u0026quot;hugo-clarity\u0026quot; Test mit: hugo -D -E -F server -\u0026gt; bricht ab mit Fehlern 1uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ hugo -D -E -F server 2Watching for changes in /home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/{archetypes,assets,content,data,i18n,layouts,static,themes} 3Watching for config changes in /home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/hugo.toml 4Start building sites … 5hugo v0.136.5-46cccb021bc6425455f4eec093f5cc4a32f1d12c+extended linux/amd64 BuildDate=2024-10-24T12:26:27Z VendorInfo=gohugoio 6 7ERROR render of \u0026#34;section\u0026#34; failed: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/_default/baseof.html:21:8\u0026#34;: execute of template failed: template: _default/list.html:21:8: executing \u0026#34;_default/list.html\u0026#34; at \u0026lt;partial \u0026#34;head\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/partials/head.html:24:4\u0026#34;: execute of template failed: template: partials/head.html:24:4: executing \u0026#34;partials/head.html\u0026#34; at \u0026lt;partial \u0026#34;opengraph\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/partials/opengraph.html:26:13\u0026#34;: execute of template failed: template: partials/opengraph.html:26:13: executing \u0026#34;partials/opengraph.html\u0026#34; at \u0026lt;absURL $s.logo\u0026gt;: error calling absURL: unable to cast maps.Params{\u0026#34;image\u0026#34;:\u0026#34;images/stuttgart.svg\u0026#34;, \u0026#34;subtitle\u0026#34;:\u0026#34;... da läuft was!\u0026#34;, \u0026#34;title\u0026#34;:\u0026#34;Ulis Welt\u0026#34;} of type maps.Params to string 8ERROR render of \u0026#34;home\u0026#34; failed: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/_default/baseof.html:21:8\u0026#34;: execute of template failed: template: index.html:21:8: executing \u0026#34;index.html\u0026#34; at \u0026lt;partial \u0026#34;head\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/partials/head.html:24:4\u0026#34;: execute of template failed: template: partials/head.html:24:4: executing \u0026#34;partials/head.html\u0026#34; at \u0026lt;partial \u0026#34;opengraph\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/partials/opengraph.html:26:13\u0026#34;: execute of template failed: template: partials/opengraph.html:26:13: executing \u0026#34;partials/opengraph.html\u0026#34; at \u0026lt;absURL $s.logo\u0026gt;: error calling absURL: unable to cast maps.Params{\u0026#34;image\u0026#34;:\u0026#34;images/stuttgart.svg\u0026#34;, \u0026#34;subtitle\u0026#34;:\u0026#34;... da läuft was!\u0026#34;, \u0026#34;title\u0026#34;:\u0026#34;Ulis Welt\u0026#34;} of type maps.Params to string 9ERROR render of \u0026#34;page\u0026#34; failed: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/_default/baseof.html:21:8\u0026#34;: execute of template failed: template: _default/single.html:21:8: executing \u0026#34;_default/single.html\u0026#34; at \u0026lt;partial \u0026#34;head\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/partials/head.html:24:4\u0026#34;: execute of template failed: template: partials/head.html:24:4: executing \u0026#34;partials/head.html\u0026#34; at \u0026lt;partial \u0026#34;opengraph\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/partials/opengraph.html:26:13\u0026#34;: execute of template failed: template: partials/opengraph.html:26:13: executing \u0026#34;partials/opengraph.html\u0026#34; at \u0026lt;absURL $s.logo\u0026gt;: error calling absURL: unable to cast maps.Params{\u0026#34;image\u0026#34;:\u0026#34;images/stuttgart.svg\u0026#34;, \u0026#34;subtitle\u0026#34;:\u0026#34;... da läuft was!\u0026#34;, \u0026#34;title\u0026#34;:\u0026#34;Ulis Welt\u0026#34;} of type maps.Params to string 10Built in 200 ms 11Error: error building site: render: failed to render pages: render of \u0026#34;404\u0026#34; failed: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/_default/baseof.html:21:8\u0026#34;: execute of template failed: template: 404.html:21:8: executing \u0026#34;404.html\u0026#34; at \u0026lt;partial \u0026#34;head\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/partials/head.html:24:4\u0026#34;: execute of template failed: template: partials/head.html:24:4: executing \u0026#34;partials/head.html\u0026#34; at \u0026lt;partial \u0026#34;opengraph\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/partials/opengraph.html:26:13\u0026#34;: execute of template failed: template: partials/opengraph.html:26:13: executing \u0026#34;partials/opengraph.html\u0026#34; at \u0026lt;absURL $s.logo\u0026gt;: error calling absURL: unable to cast maps.Params{\u0026#34;image\u0026#34;:\u0026#34;images/stuttgart.svg\u0026#34;, \u0026#34;subtitle\u0026#34;:\u0026#34;... da läuft was!\u0026#34;, \u0026#34;title\u0026#34;:\u0026#34;Ulis Welt\u0026#34;} 12... Nachtrag 2024-12-18: Für mich sieht es so aus, als gäbe es Probleme mit dem Logo.\nTheme aktivieren mit Zusatzdateien 1cp -a themes/hugo-clarity/exampleSite/* . \u0026amp;\u0026amp; rm -f config.toml Test mit: hugo -D -E -F server -\u0026gt; bricht ab mit Fehlern\n1uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ hugo -D -E -F server 2Watching for changes in /home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/{archetypes,assets,content,data,i18n,layouts,static,themes} 3Watching for config changes in /home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/hugo.toml, /home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/config/_default, /home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/config/_default/menus 4Start building sites … 5hugo v0.136.5-46cccb021bc6425455f4eec093f5cc4a32f1d12c+extended linux/amd64 BuildDate=2024-10-24T12:26:27Z VendorInfo=gohugoio 6 7ERROR render of \u0026#34;term\u0026#34; failed: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/_default/list.html:2:6\u0026#34;: execute of template failed: template: _default/list.html:2:6: executing \u0026#34;main\u0026#34; at \u0026lt;partial \u0026#34;archive\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/partials/archive.html:16:11\u0026#34;: execute of template failed: template: partials/archive.html:16:11: executing \u0026#34;partials/archive.html\u0026#34; at \u0026lt;partial \u0026#34;excerpt\u0026#34; .\u0026gt;: error calling partial: execute of template failed: template: partials/excerpt.html:12:12: executing \u0026#34;partials/excerpt.html\u0026#34; at \u0026lt;partial \u0026#34;image\u0026#34; (dict \u0026#34;file\u0026#34; . \u0026#34;alt\u0026#34; $.Title \u0026#34;type\u0026#34; \u0026#34;thumbnail\u0026#34; \u0026#34;Page\u0026#34; $.Page)\u0026gt;: error calling partial: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/partials/image.html:29:14\u0026#34;: execute of template failed: template: partials/image.html:29:14: executing \u0026#34;partials/image.html\u0026#34; at \u0026lt;strings.HasPrefix\u0026gt;: error calling HasPrefix: unable to cast maps.Params{\u0026#34;src\u0026#34;:\u0026#34;img/placeholder.png\u0026#34;, \u0026#34;visibility\u0026#34;:[]interface {}{\u0026#34;list\u0026#34;}} of type maps.Params to string 8ERROR render of \u0026#34;page\u0026#34; failed: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/_default/baseof.html:21:8\u0026#34;: execute of template failed: template: _default/single.html:21:8: executing \u0026#34;_default/single.html\u0026#34; at \u0026lt;partial \u0026#34;head\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/partials/head.html:24:4\u0026#34;: execute of template failed: template: partials/head.html:24:4: executing \u0026#34;partials/head.html\u0026#34; at \u0026lt;partial \u0026#34;opengraph\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/partials/opengraph.html:37:21\u0026#34;: execute of template failed: template: partials/opengraph.html:37:21: executing \u0026#34;partials/opengraph.html\u0026#34; at \u0026lt;add $relpath .\u0026gt;: error calling add: can\u0026#39;t apply the operator to the values 9Built in 1093 ms 10Error: error building site: render: failed to render pages: render of \u0026#34;section\u0026#34; failed: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/_default/list.html:2:6\u0026#34;: execute of template failed: template: _default/list.html:2:6: executing \u0026#34;main\u0026#34; at \u0026lt;partial \u0026#34;archive\u0026#34; .\u0026gt;: error calling partial: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/partials/archive.html:16:11\u0026#34;: execute of template failed: template: partials/archive.html:16:11: executing \u0026#34;partials/archive.html\u0026#34; at \u0026lt;partial \u0026#34;excerpt\u0026#34; .\u0026gt;: error calling partial: execute of template failed: template: partials/excerpt.html:12:12: executing \u0026#34;partials/excerpt.html\u0026#34; at \u0026lt;partial \u0026#34;image\u0026#34; (dict \u0026#34;file\u0026#34; . \u0026#34;alt\u0026#34; $.Title \u0026#34;type\u0026#34; \u0026#34;thumbnail\u0026#34; \u0026#34;Page\u0026#34; $.Page)\u0026gt;: error calling partial: \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/hugo-clarity/layouts/partials/image.html:29:14\u0026#34;: execute of template failed: template: partials/image.html:29:14: executing \u0026#34;partials/image.html\u0026#34; at \u0026lt;strings.HasPrefix\u0026gt;: error calling HasPrefix: unable to cast maps.Params{\u0026#34;src\u0026#34;:\u0026#34;img/placeholder.png\u0026#34;, \u0026#34;visibility\u0026#34;:[]interface {}{\u0026#34;list\u0026#34;}} of type maps.Params to string Links Github - Hugo-Clarity Getting Up And Running Historie 2024-12-18: Kurzanalyse Logo-Probleme 2024-12-12: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-12_hugo-clarity-kurztest/","section":"blog","tags":["hugo","clarity"],"title":"Hugo: Kurztest vom Theme Clarity"},{"body":"","link":"https://uli.heller.cool/tags/go/","section":"tags","tags":null,"title":"Go"},{"body":"","link":"https://uli.heller.cool/tags/yaml/","section":"tags","tags":null,"title":"Yaml"},{"body":"","link":"https://uli.heller.cool/categories/yaml/","section":"categories","tags":null,"title":"YAML"},{"body":" Für eine Analyse für einen meiner Kunden muß ich YAML-Dateien auswerten. Konkret geht es um die Gitlab-Konfigurationsdatei \u0026quot;gitlab-ci.yml\u0026quot; und da drin um die verwendeten Gitlab-Runner.\nQuelltext einspielen 1git clone git@github.com:mikefarah/yq.git Bauen 1cd yq 2go build 3# ... erzeugt \u0026#34;yq\u0026#34; Test 1./yq 2# ... gibt jede Menge Text aus Anzeige aller Gitlab-Runner Die Gitlab-Runner sind hinterlegt in der Datei \u0026quot;.gitlab-ci.yml\u0026quot;. Hier gibt es den Eintrag \u0026quot;tags\u0026quot; und dieser enthält die Kennungen der Gitlab-Runner. Hier die Abfrage:\n1yq \u0026#39;..|select(has\u0026#34;tags\u0026#34;)|.tags\u0026#39; .gitlab-ci.yml Ausgabe:\n1$ yq \u0026#39;..|select(has\u0026#34;tags\u0026#34;)|.tags\u0026#39; .gitlab-ci.yml 2- bach004-docker 3- bach005-docker Links YQ - Doku YQ - Quelltext Historie 2024-12-11: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-11_yaml-dateien-auswerten/","section":"blog","tags":["yaml","yq","go"],"title":"YAML-Dateien auswerten"},{"body":"","link":"https://uli.heller.cool/tags/yq/","section":"tags","tags":null,"title":"Yq"},{"body":"","link":"https://uli.heller.cool/tags/jpg/","section":"tags","tags":null,"title":"Jpg"},{"body":" Manchmal habe ich eine Reihe von JPG-Dateien, die ich gerne als PDF weiterverarbeiten und/oder archivieren möchte. Beispielsweise dann, wenn ich einen mehrseitigen Brief abfotografiert habe.\nAblauf:\nSeiten sortieren: s1.jpg, s2.jpg, s3.jpg Wandeln: convert s1.jpg s2.jpg s3.jpg -auto-orient brief.pdf Links Convert a directory of JPEG files to a single PDF document Historie 2024-12-10: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-10_jpg-nach-pdf/","section":"blog","tags":["jpg","pdf","imagemagick"],"title":"JPG nach PDF wandeln"},{"body":"","link":"https://uli.heller.cool/tags/datenschutz/","section":"tags","tags":null,"title":"Datenschutz"},{"body":"","link":"https://uli.heller.cool/categories/datenschutz/","section":"categories","tags":null,"title":"Datenschutz"},{"body":"","link":"https://uli.heller.cool/tags/dsgvo/","section":"tags","tags":null,"title":"Dsgvo"},{"body":" Aktuell (November 2024) wird meine Webseite via Github publiziert. Das ist einerseits bequem und kostengünstig, andererseits hat es Auswirkungen für die Nutzer. Hier ein paar Gedanken dazu!\nFür mich persönlich auf der positiven Seite:\nIch habe keinerlei Kontakt zu den Datenpaketen der Nutzer Ich kann damit keinerlei \u0026quot;Unsinn\u0026quot; anstellen und muß mir dementsprechend auch wenig Gedanken über Zulässigkeit/Sicherheit machen Keinerlei Werbeeinblendungen Dennoch sehr kostengünstig (Github verlangt für die \u0026quot;Dienstleistung\u0026quot; keine Bezahlung) Auf der negativen Seite sehe ich dies:\nFür Nutzer ist die Github-Nutzung schwierig zu erkennen Nutzer tauschen direkt Daten mit den Github-Servern aus und werden dort eventuell verfolgt (Tracking) oder anderweitig \u0026quot;mißbraucht\u0026quot; Was genau Github macht (Welche Daten werden erfasst? Was wird damit \u0026quot;angestellt\u0026quot;?) weiß ich aktuell nicht. Kann sich vermutlich auch jederzeit ändern! Bin mir noch nicht 100%ig sicher, ob ich mit der \u0026quot;negativen Seite\u0026quot; wirklich leben kann oder ob ich eine Änderung anstreben sollte. Rückmeldung willkommen!\nHistorie 2024-12-06: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-06_gedanken-zum-datenschutz/","section":"blog","tags":["datenschutz","dsgvo"],"title":"Gedanken zum Datenschutz"},{"body":" Hier beschreibe ich, wie ich LXC/LXD auf meinem Ubuntu-Rechner einrichte.\nZiele:\nAbgeschottete Container Container wahlweise mit und ohne Zugriff in's Internet Container netzwerktechnisch erreichbar via Containername (.lxd) LXD installieren 1$ sudo snap install lxd LXC/LXD-Grundinitialisierung 1 # Speicherplatz 2$ sudo vgdisplay 3 --- Volume group --- 4 VG Name ubuntu-vg 5 System ID 6 Format lvm2 7 Metadata Areas 1 8 Metadata Sequence No 7 9 VG Access read/write 10 VG Status resizable 11 MAX LV 0 12 Cur LV 5 13 Open LV 4 14 Max PV 0 15 Cur PV 1 16 Act PV 1 17 VG Size \u0026lt;475,42 GiB 18 PE Size 4,00 MiB 19 Total PE 121707 20 Alloc PE / Size 31744 / 124,00 GiB 21 Free PE / Size 89963 / \u0026lt;351,42 GiB 22 VG UUID He3sn9-GGjP-ZPBt-vvea-SDHc-SXOg-zUZ9DF 23 24$ sudo lvcreate -n lxclv -L 50G ubuntu-vg 25 Logical volume \u0026#34;lxclv\u0026#34; created. 26 27 # Initialisierung 28$ sudo lxd init 29Would you like to use LXD clustering? (yes/no) [default=no]: no 30Do you want to configure a new storage pool? (yes/no) [default=yes]: yes 31Name of the new storage pool [default=default]: 32Name of the storage backend to use (powerflex, zfs, btrfs, ceph, dir, lvm) [default=zfs]: btrfs 33Create a new BTRFS pool? (yes/no) [default=yes]: yes 34Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]: yes 35Path to the existing block device: /dev/mapper/ubuntu--vg-lxclv 36Would you like to connect to a MAAS server? (yes/no) [default=no]: 37Would you like to create a new local network bridge? (yes/no) [default=yes]: 38What should the new bridge be called? [default=lxdbr0]: 39What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 40What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 41Would you like the LXD server to be available over the network? (yes/no) [default=no]: 42Would you like stale cached images to be updated automatically? (yes/no) [default=yes]: 43Would you like a YAML \u0026#34;lxd init\u0026#34; preseed to be printed? (yes/no) [default=no]: yes 44config: {} 45networks: 46- config: 47 ipv4.address: auto 48 ipv6.address: auto 49 description: \u0026#34;\u0026#34; 50 name: lxdbr0 51 type: \u0026#34;\u0026#34; 52 project: default 53storage_pools: 54- config: 55 source: /dev/mapper/ubuntu--vg-lxclv 56 description: \u0026#34;\u0026#34; 57 name: default 58 driver: btrfs 59storage_volumes: [] 60profiles: 61- config: {} 62 description: \u0026#34;\u0026#34; 63 devices: 64 eth0: 65 name: eth0 66 network: lxdbr0 67 type: nic 68 root: 69 path: / 70 pool: default 71 type: disk 72 name: default 73projects: [] 74cluster: null Testcontainer 1$ lxc launch ubuntu:24.04 ubuntu-2404 2Creating ubuntu-2404 3Starting ubuntu-2404 4 5$ lxc exec ubuntu-2404 bash 6root@ubuntu-2404:~# apt update 7... 8root@ubuntu-2404:~# apt upgrade 9... 10root@ubuntu-2404:~# exit 11 12uli@uliip5:~$ lxc exec ubuntu-2404 -- sudo -u ubuntu -i 13To run a command as administrator (user \u0026#34;root\u0026#34;), use \u0026#34;sudo \u0026lt;command\u0026gt;\u0026#34;. 14See \u0026#34;man sudo_root\u0026#34; for details. 15 16ubuntu@ubuntu-2404:~$ exit Isolierte Benutzerkennungen /etc/subuid und /etc/subgid:\n1for es in /etc/subuid /etc/subgid; do 2 for u in lxd root; do 3 grep \u0026#34;^${u}:\u0026#34; \u0026#34;${es}\u0026#34; \u0026gt;/dev/null 2\u0026gt;\u0026amp;1 || { 4 echo \u0026#34;${u}:100000:1000000000\u0026#34; \u0026gt;\u0026gt;\u0026#34;${es}\u0026#34; 5 } 6 done 7done 8lxc profile set default security.idmap.isolated=true 9systemctl restart \u0026#34;$(systemctl |grep -o \u0026#39;[\\s][^\\s]*lxd\\.daemon\\.service\u0026#39;)\u0026#34; Diese Änderung ist auch Teil des Initialisierungsskripts: initialize-lxd.sh\nNetzwerkbrücken 1 # Network 2$ lxc network create lxdhostonly ipv4.address=10.2.210.1/24 ipv4.nat=false ipv6.address=none 3Network lxdhostonly created 4 5$ lxc network create lxdnat ipv4.address=10.38.231.1/24 ipv4.nat=true ipv6.address=none 6Network lxdnat created 7 8$ lxc profile device set default eth0 network=lxdnat 9 10$ lxc network delete lxdbr0 11Network lxdbr0 deleted 12 13$ lxc network list 14+-------------+----------+---------+----------------+------+-------------+---------+---------+ 15| NAME | TYPE | MANAGED | IPV4 | IPV6 | DESCRIPTION | USED BY | STATE | 16+-------------+----------+---------+----------------+------+-------------+---------+---------+ 17| docker0 | bridge | NO | | | | 0 | | 18+-------------+----------+---------+----------------+------+-------------+---------+---------+ 19| lxdhostonly | bridge | YES | 10.2.210.1/24 | none | | 0 | CREATED | 20+-------------+----------+---------+----------------+------+-------------+---------+---------+ 21| lxdnat | bridge | YES | 10.38.231.1/24 | none | | 2 | CREATED | 22+-------------+----------+---------+----------------+------+-------------+---------+---------+ 23| wlp1s0 | physical | NO | | | | 0 | | 24+-------------+----------+---------+----------------+------+-------------+---------+---------+ Diese Änderung ist auch Teil des Initialisierungsskripts: initialize-lxd.sh\nNamensauflösung - erste Tests Aktuelle Anleitung (basierend auf INCUS): How to integrate with systemd-resolved\nBasierend auf vorgenannter Anleitung mit Anpassung INCUS -\u0026gt; LXD und unter ausschliesslicher Berücksichtigung von IPV4:\n1$ lxc network get lxdnat ipv4.address 210.38.231.1/24 3$ lxc network get lxdhostonly ipv4.address 410.2.210.1/24 5 6$ lxc network get lxdnat dns.domain 7$ lxc network get lxdhostonly dns.domain 8 # If this option is not set, the default domain name is lxd 9 10$ sudo resolvectl dns lxdnat 10.38.231.1 11$ sudo resolvectl domain lxdnat \u0026#39;~lxd\u0026#39; 12$ sudo resolvectl dns lxdhostonly 10.2.210.1 13$ sudo resolvectl domain lxdhostonly \u0026#39;~lxd\u0026#39; Kurztest:\n1$ ping ubuntu-2404.lxd 2PING ubuntu-2404.lxd (10.38.231.56) 56(84) bytes of data. 364 bytes from ubuntu-2404.lxd (10.38.231.56): icmp_seq=1 ttl=64 time=0.044 ms 464 bytes from ubuntu-2404.lxd (10.38.231.56): icmp_seq=2 ttl=64 time=0.068 ms 5^C 6--- ubuntu-2404.lxd ping statistics --- 72 packets transmitted, 2 received, 0% packet loss, time 1007ms 8rtt min/avg/max/mdev = 0.044/0.056/0.068/0.012 ms Namensauflösung - dauerhafte Einrichtung Aktuelle Anleitung (basierend auf INCUS): How to integrate with systemd-resolved\nBasierend auf vorgenannter Anleitung mit Anpassung INCUS -\u0026gt; LXD und unter ausschliesslicher Berücksichtigung von IPV4 sind diese Schritte notwendig:\nNetzwerkbrücken einrichten (wie zuvor):\n1#!/bin/bash 2# 3 4# 5# Netzwerk-Brücken 6# 7lxc network create lxdhostonly ipv4.address=10.2.210.1/24 ipv4.nat=false ipv6.address=none 8lxc network create lxdnat ipv4.address=10.38.231.1/24 ipv4.nat=true ipv6.address=none Standardcontainer auf Nutzung von \u0026quot;lxdnat\u0026quot; festlegen:\n1lxc profile device set default eth0 network=lxdnat Profile für \u0026quot;hostonly\u0026quot; und \u0026quot;nat\u0026quot;:\n1lxc profile create hostonly 2lxc profile set hostonly security.idmap.isolated true 3lxc profile device add hostonly eth0 nic network=lxdhostonly 4lxc profile device add hostonly root disk path=/ pool=default 5 6lxc profile create nat 7lxc profile set nat security.idmap.isolated true 8lxc profile device add nat eth0 nic network=lxdhostonly 9lxc profile device add nat eth1 nic network=lxdnat 10lxc profile device add nat root disk path=/ pool=default DNS dauerhaft aktivieren für beide Netzwerkbrücken:\n1# 2# DNS 3# 4for bridge in lxdhostonly lxdnat; do 5ipaddress=\u0026#34;$(lxc network get ${bridge} ipv4.address|cut -d \u0026#34;/\u0026#34; -f 1)\u0026#34; 6cat \u0026gt;/etc/systemd/system/lxd-dns-${bridge}.service \u0026lt;\u0026lt;EOF 7[Unit] 8Description=LXD per-link DNS configuration for ${bridge} 9BindsTo=sys-subsystem-net-devices-${bridge}.device 10After=sys-subsystem-net-devices-${bridge}.device 11 12[Service] 13Type=oneshot 14ExecStart=/usr/bin/resolvectl dns ${bridge} ${ipaddress} 15ExecStart=/usr/bin/resolvectl domain ${bridge} ~lxd 16ExecStart=/usr/bin/resolvectl dnssec ${bridge} off 17ExecStart=/usr/bin/resolvectl dnsovertls ${bridge} off 18ExecStopPost=/usr/bin/resolvectl revert ${bridge} 19RemainAfterExit=yes 20 21[Install] 22WantedBy=sys-subsystem-net-devices-${bridge}.device 23EOF 24systemctl daemon-reload 25systemctl enable --now lxd-dns-${bridge} 26done Diese Änderung ist auch Teil des Initialisierungsskripts: initialize-lxd.sh\nVersionen Getestet mit Ubuntu 22.04.5 LTS auf dem Host Getestet mit LXC-6.1, snap version Getestet mit Ubuntu 24.04.1 LTS im Container Historie 2025-07-09: Profile für \u0026quot;hostonly\u0026quot; und \u0026quot;nat\u0026quot; 2025-02-10: Neuer Parameter: security.idmap.isolated=true 2025-01-27: Fehlerkorrektur Korrektur \u0026quot;${ipaddress}\u0026quot; 2024-12-05: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-05_lxc-mit-netzwerk/","section":"blog","tags":["lxc","lxd","linux","ubuntu","debian"],"title":"LXC/LXD: Grundeinrichtung mit Netzwerk"},{"body":"Interner Bereich Technische Anleitungen Private Dokumente ","link":"https://uli.heller.cool/i/","section":"i","tags":null,"title":""},{"body":" Ablauf Neues Handy Finom-App installieren (war bei mir automatisch installiert) Finom-App öffnen Anmelden mit bestehender Email + Passwort Bestätigung der Email (gleiches Gerät, also auf Handy!!) Handy-PIN vergeben Historie 2024-12-04: Erste Version ","link":"https://uli.heller.cool/i/privat/2024-12-04_finom-handywechsel/","section":"i","tags":null,"title":"Finom: Handywechsel"},{"body":"","link":"https://uli.heller.cool/tags/json/","section":"tags","tags":null,"title":"Json"},{"body":"Handy-Wechsel Finom ","link":"https://uli.heller.cool/i/privat/","section":"i","tags":null,"title":"Private Dokumente"},{"body":"","link":"https://uli.heller.cool/tags/sqlite/","section":"tags","tags":null,"title":"Sqlite"},{"body":" TRIVE ist ein Sicherheitsscanner. Die Berichte des Scanners kann man in verschiedenen Formaten erzeugen, bspw. auch im HTML-Format zur Einbindung in Webseiten. Leider fehlen dann gewisse Informationen, bspw. der SCORE.\nHier beschreibe ich, wie ich den TRIVY-Report im JSON-Format mit JQ in's CSV-Format wandele.\nWandel-Skript trivy-check-json-2-csv.sh\n1jq -r \u0026#39;[\u0026#34;score\u0026#34;,\u0026#34;severity\u0026#34;,\u0026#34;cve\u0026#34;,\u0026#34;pkgname\u0026#34;,\u0026#34;title\u0026#34;,\u0026#34;description\u0026#34;,\u0026#34;installed_version\u0026#34;,\u0026#34;fixed_version\u0026#34;,\u0026#34;target\u0026#34;,\u0026#34;class\u0026#34;,\u0026#34;type\u0026#34;], 2 ( .Results[] 3 |.Target as $target 4 |.Class as $class 5 |.Type as $type 6 |.Vulnerabilities 7 |select(.!=null) 8 | .[] 9 | [ ([ .CVSS|..|.V3Score?|select(. != null) ]|first), .Severity, .VulnerabilityID, .PkgName, .Title, .Description, .InstalledVersion, .FixedVersion, $target, $class, $type ] 10 )|@csv\u0026#39; Test 1./trivy-check-json-2-csv.sh \u0026lt;ubuntu-2404.trivy-check.json \u0026gt;ubuntu-2404.trivy-check.csv ubuntu-2404.trivy-check.csv:\n1\u0026#34;score\u0026#34;,\u0026#34;severity\u0026#34;,\u0026#34;cve\u0026#34;,\u0026#34;pkgname\u0026#34;,\u0026#34;title\u0026#34;,\u0026#34;description\u0026#34;,\u0026#34;installed_version\u0026#34;,\u0026#34;fixed_version\u0026#34;,\u0026#34;target\u0026#34;,\u0026#34;class\u0026#34;,\u0026#34;type\u0026#34; 27,\u0026#34;MEDIUM\u0026#34;,\u0026#34;CVE-2024-52533\u0026#34;,\u0026#34;gir1.2-glib-2.0\u0026#34;,\u0026#34;glib: buffer overflow in set_connect_msg()\u0026#34;,\u0026#34;gio/gsocks4aproxy.c in GNOME GLib before 2.82.1 has an off-by-one error and resultant buffer overflow because SOCKS4_CONN_MSG_LEN is not sufficient for a trailing \u0026#39;\\0\u0026#39; character.\u0026#34;,\u0026#34;2.80.0-6ubuntu3.1\u0026#34;,\u0026#34;2.80.0-6ubuntu3.2\u0026#34;,\u0026#34;/tmp/7af54f429a9c161382d6fdcb516d07cf984f92ef74caa02fddb218babeddd81d.sbom.json (ubuntu 24.04)\u0026#34;,\u0026#34;os-pkgs\u0026#34;,\u0026#34;ubuntu\u0026#34; 37,\u0026#34;MEDIUM\u0026#34;,\u0026#34;CVE-2024-52533\u0026#34;,\u0026#34;libglib2.0-0t64\u0026#34;,\u0026#34;glib: buffer overflow in set_connect_msg()\u0026#34;,\u0026#34;gio/gsocks4aproxy.c in GNOME GLib before 2.82.1 has an off-by-one error and resultant buffer overflow because SOCKS4_CONN_MSG_LEN is not sufficient for a trailing \u0026#39;\\0\u0026#39; character.\u0026#34;,\u0026#34;2.80.0-6ubuntu3.1\u0026#34;,\u0026#34;2.80.0-6ubuntu3.2\u0026#34;,\u0026#34;/tmp/7af54f429a9c161382d6fdcb516d07cf984f92ef74caa02fddb218babeddd81d.sbom.json (ubuntu 24.04)\u0026#34;,\u0026#34;os-pkgs\u0026#34;,\u0026#34;ubuntu\u0026#34; 47,\u0026#34;MEDIUM\u0026#34;,\u0026#34;CVE-2024-52533\u0026#34;,\u0026#34;libglib2.0-data\u0026#34;,\u0026#34;glib: buffer overflow in set_connect_msg()\u0026#34;,\u0026#34;gio/gsocks4aproxy.c in GNOME GLib before 2.82.1 has an off-by-one error and resultant buffer overflow because SOCKS4_CONN_MSG_LEN is not sufficient for a trailing \u0026#39;\\0\u0026#39; character.\u0026#34;,\u0026#34;2.80.0-6ubuntu3.1\u0026#34;,\u0026#34;2.80.0-6ubuntu3.2\u0026#34;,\u0026#34;/tmp/7af54f429a9c161382d6fdcb516d07cf984f92ef74caa02fddb218babeddd81d.sbom.json (ubuntu 24.04)\u0026#34;,\u0026#34;os-pkgs\u0026#34;,\u0026#34;ubuntu\u0026#34; 5... Weitere Umwandlungen nach Markdown und nach HTML 1sqlite3 trivy.db \u0026#34;.mode csv\u0026#34; \u0026#34;.import ubuntu-2404.trivy-check.csv cve\u0026#34; 2sqlite3 trivy.db \u0026#34;.mode markdown\u0026#34; \u0026#34;select * from cve;\u0026#34; \u0026gt;ubuntu-2404.trivy-check.md 3sqlite3 trivy.db \u0026#34;.mode html\u0026#34; \u0026#34;select * from cve;\u0026#34; \u0026gt;ubuntu-2404.trivy-check.html~ 4echo \u0026#34;\u0026lt;html\u0026gt;\u0026lt;body\u0026gt;\u0026lt;table\u0026gt;\u0026#34; \u0026gt;ubuntu-2404.trivy-check.html 5cat ubuntu-2404.trivy-check.html~ \u0026gt;\u0026gt;ubuntu-2404.trivy-check.html 6echo \u0026#34;\u0026lt;/table\u0026gt;\u0026lt;/body\u0026gt;\u0026lt;/html\u0026gt;\u0026#34; \u0026gt;\u0026gt;ubuntu-2404.trivy-check.html 7rm -f ubuntu-2404.trivy-check.html~ 8rm -f trivy.db Erzeugte Dateien:\nMarkdown: ubuntu-2404.trivy-check.md HTML: ubuntu-2404.trivy-check.html Historie 2024-12-30: trivy-json -\u0026gt; trivy-check-json (zur Abgrenzung gegenüber trivy-sbom-json) 2024-12-04: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-04_trivy-report-nach-csv/","section":"blog","tags":["trivy","jq","json","csv","sqlite"],"title":"TRIVY: JSON nach CSV wandeln"},{"body":" Hier beschreibe ich, wie man eine JSON-Datei mit JQ in's CSV-Format wandelt.\nEinfache JSON-Datei 1[ 2 { \u0026#34;Name\u0026#34;: \u0026#34;Uli\u0026#34;, \u0026#34;Year\u0026#34;: 1965 }, 3 { \u0026#34;Name\u0026#34;: \u0026#34;Andrea\u0026#34;, \u0026#34;Year\u0026#34;: 1971 }, 4 { \u0026#34;Name\u0026#34;: \u0026#34;Lilly\u0026#34;, \u0026#34;Year\u0026#34;: 2002 } 5] simple.json\nEinfache Wandlung mit festen Feldern 1$ jq -r \u0026#39;[\u0026#34;Name\u0026#34;,\u0026#34;Year\u0026#34;],(.[]|[.Name,.Year])|@csv\u0026#39; \u0026lt;simple.json 2\u0026#34;Name\u0026#34;,\u0026#34;Year\u0026#34; 3\u0026#34;Uli\u0026#34;,1965 4\u0026#34;Andrea\u0026#34;,1971 5\u0026#34;Lilly\u0026#34;,2002 simple.csv\nGenerische Wandlung mit variablen Feldern 1$ jq -r \u0026#39;(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv\u0026#39; \u0026lt;simple.json 2\u0026#34;Name\u0026#34;,\u0026#34;Year\u0026#34; 3\u0026#34;Uli\u0026#34;,1965 4\u0026#34;Andrea\u0026#34;,1971 5\u0026#34;Lilly\u0026#34;,2002 simple.csv\nMulti-level JSON-Datei 1[ 2 { 3 \u0026#34;type\u0026#34;: \u0026#34;human\u0026#34;, 4 \u0026#34;individuals\u0026#34;: 5 [ 6 { \u0026#34;Name\u0026#34;: \u0026#34;Uli\u0026#34;, \u0026#34;Year\u0026#34;: 1965 }, 7 { \u0026#34;Name\u0026#34;: \u0026#34;Andrea\u0026#34;, \u0026#34;Year\u0026#34;: 1971 }, 8 { \u0026#34;Name\u0026#34;: \u0026#34;Lilly\u0026#34;, \u0026#34;Year\u0026#34;: 2002 } 9 ] 10 }, 11 { 12 \u0026#34;type\u0026#34;: \u0026#34;dog\u0026#34;, 13 \u0026#34;individuals\u0026#34;: 14 [ 15 { \u0026#34;Name\u0026#34;: \u0026#34;Rusty\u0026#34;, \u0026#34;Year\u0026#34;: 2015 }, 16 { \u0026#34;Name\u0026#34;: \u0026#34;Shadow\u0026#34;, \u0026#34;Year\u0026#34;: 2001 }, 17 { \u0026#34;Name\u0026#34;: \u0026#34;Copper\u0026#34;, \u0026#34;Year\u0026#34;: 2022 } 18 ] 19 } 20] multi.json\nWandlung mit festen Feldern 1$ jq -r \u0026#39;[\u0026#34;type\u0026#34;,\u0026#34;Name\u0026#34;,\u0026#34;Year\u0026#34;],(.[]|.type as $type|.individuals|.[]|[$type,.Name,.Year])|@csv\u0026#39; \u0026lt;multi.json 2\u0026#34;type\u0026#34;,\u0026#34;Name\u0026#34;,\u0026#34;Year\u0026#34; 3\u0026#34;human\u0026#34;,\u0026#34;Uli\u0026#34;,1965 4\u0026#34;human\u0026#34;,\u0026#34;Andrea\u0026#34;,1971 5\u0026#34;human\u0026#34;,\u0026#34;Lilly\u0026#34;,2002 6\u0026#34;dog\u0026#34;,\u0026#34;Rusty\u0026#34;,2015 7\u0026#34;dog\u0026#34;,\u0026#34;Shadow\u0026#34;,2001 8\u0026#34;dog\u0026#34;,\u0026#34;Copper\u0026#34;,2022 multi.csv\nHistorie 2024-12-03: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-03_jq-nach-csv/","section":"blog","tags":["jq","json","csv"],"title":"JQ: JSON nach CSV wandeln"},{"body":" Wie aktiviert man global in allen Artikeln das Inhaltsverzeichnis? Wie deaktiviert man es für einzelne Artikel?\nGlobale Aktivierung des Inhaltsverzeichnisses Die globale Aktivierung erfolgt durch Anpassung der Datei \u0026quot;hugo.toml\u0026quot;. Eigentlich sollte es mittels tableOfContents=true funktionieren. Da klappt bei mir zumindest mit dem Theme \u0026quot;mainroad\u0026quot; nicht. Über Params.toc=true geht's!\n1diff --git hugo.toml hugo.toml 2index 7103dfb..5ffecf8 100644 3--- hugo.toml 4+++ hugo.toml 5@@ -7,6 +7,7 @@ theme = \u0026#34;mainroad\u0026#34; 6 disqusShortname = \u0026#34;\u0026#34; # Enable comments by entering your Disqus shortname 7 googleAnalytics = \u0026#34;\u0026#34; # Enable Google Analytics by entering your tracking id 8 enableGitInfo = true 9+#tableOfContents = true # 2024-12-01_01: Parameter funktioniert zumindest mit \u0026#39;mainroad\u0026#39; nicht, siehe unten! 10 11@@ -20,6 +21,7 @@ enableGitInfo = true 12 [Params] 13 readmore = true # Show \u0026#34;Read more\u0026#34; button in list if true - Weiterlesen... 14 authorbox = true 15 pager = true 16+ toc = true # 2024-12-01_01: Parameter funktioniert mit \u0026#39;mainroad\u0026#39; 17 post_meta = [\u0026#34;date\u0026#34;, \u0026#34;categories\u0026#34;] # Order of post meta information 18 mainSections = [ \u0026#34;articles\u0026#34;, \u0026#34;blog\u0026#34; ] Deaktivierung für einzelne Artikel Für einen einzelnen Artikel kann man das Inhaltserzeichnis deaktivieren mittels \u0026quot;FrontPage\u0026quot;. Das ist der Parameterblock am Beginn des Artikels.\n1diff --git content/blog/2024-12-05_lxc-mit-netzwerk/index.md content/blog/2024-12-05_lxc-mit-netzwerk/index.md 2index e27231c..db524d2 100644 3--- content/blog/2024-12-05_lxc-mit-netzwerk/index.md 4+++ content/blog/2024-12-05_lxc-mit-netzwerk/index.md 5@@ -4,6 +4,7 @@ draft = false 6 title = \u0026#39;LXC/LXD: Grundeinrichtung mit Netzwerk\u0026#39; 7 categories = [ \u0026#39;LXC/LXD\u0026#39; ] 8 tags = [ \u0026#39;lxc\u0026#39;, \u0026#39;lxd\u0026#39;, \u0026#39;linux\u0026#39;, \u0026#39;ubuntu\u0026#39;, \u0026#39;debian\u0026#39; ] 9+toc = false 10 +++ 11 12 \u0026lt;!-- Links Hugo: How to Add a Table of Contents (TOC) to Your Post? Mainroad - README.md Versionen Getestet mit\nhugo v0.136.5-46cc... Theme: mainroad, main, commit:13e04b3694ea2d20a68cfbfaea42a8c565079809 Historie 2024-12-02: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-02_inhaltsverzeichnis/","section":"blog","tags":["hugo","mainroad"],"title":"Hugo: Inhaltsverzeichnis"},{"body":"","link":"https://uli.heller.cool/tags/mainroad/","section":"tags","tags":null,"title":"Mainroad"},{"body":" Hier beschreibe ich, wie ich einen Container anlege, in dem ich Ubuntu-Pakete bauen kann. Die Beschreibung verwendet einen Container für Ubuntu-24.04 (noble) und erstellt das Paket \u0026quot;git\u0026quot;.\nVoraussetzung LXC/LXD ist installiert ... und initialisiert Basiscontainer 1$ lxc launch ubuntu:24.04 build-2404 2Creating build-2404 3Starting build-2404 4 5$ lxc exec build-2404 bash 6root@build-2404:~# apt update 7... 8root@build-2404:~# apt upgrade 9... 10 # Zusatzpakete installieren 11root@build-2404:~# apt install dpkg-dev devscripts joe 12 13root@build-2404:~# exit 14 15uli@uliip5:~$ lxc exec build-2404 -- sudo -u ubuntu -i 16To run a command as administrator (user \u0026#34;root\u0026#34;), use \u0026#34;sudo \u0026lt;command\u0026gt;\u0026#34;. 17See \u0026#34;man sudo_root\u0026#34; for details. 18 19ubuntu@build-2404:~$ exit Quelltext-Repos aktivieren 1$ lxc exec build-2404 bash 2root@build-2404:~# sed -e \u0026#34;s/:\\s*deb/: deb-src/\u0026#34; \u0026lt;/etc/apt/sources.list.d/ubuntu.sources \u0026gt;/etc/apt/sources.list.d/deb-src.sources 3 4root@build-2404:~# apt update Paket-Quelltext installieren 1$ lxc exec build-2404 -- sudo -u ubuntu -i 2To run a command as administrator (user \u0026#34;root\u0026#34;), use \u0026#34;sudo \u0026lt;command\u0026gt;\u0026#34;. 3See \u0026#34;man sudo_root\u0026#34; for details. 4 5ubuntu@build-2404:~$ mkdir -p build/git 6ubuntu@build-2404:~$ cd build/git 7 8ubuntu@build-2404:~$ apt source git 9Reading package lists... Done 10NOTICE: \u0026#39;git\u0026#39; packaging is maintained in the \u0026#39;Git\u0026#39; version control system at: 11https://repo.or.cz/r/git/debian.git/ 12... 13Fetched 8159 kB in 5s (1634 kB/s) 14sh: 1: dpkg-source: not found 15E: Unpack command \u0026#39;dpkg-source --no-check -x git_2.43.0-1ubuntu7.1.dsc\u0026#39; failed. 16N: Check if the \u0026#39;dpkg-dev\u0026#39; package is installed. 17 18ubuntu@build-2404:~$ sudo apt install dpkg-dev 19... 20 21ubuntu@build-2404:~/build/git$ apt source git 22Reading package lists... Done 23NOTICE: \u0026#39;git\u0026#39; packaging is maintained in the \u0026#39;Git\u0026#39; version control system at: 24https://repo.or.cz/r/git/debian.git/ 25... 26dpkg-source: info: applying CVE-2024-32020.patch 27dpkg-source: info: applying CVE-2024-32021.patch 28dpkg-source: info: applying CVE-2024-32465.patch 29 30ubuntu@build-2404:~/build/git$ sudo apt build-dep git 31Reading package lists... Done 32Reading package lists... Done 33... Bauen 1$ lxc exec build-2404 -- sudo -u ubuntu -i 2To run a command as administrator (user \u0026#34;root\u0026#34;), use \u0026#34;sudo \u0026lt;command\u0026gt;\u0026#34;. 3See \u0026#34;man sudo_root\u0026#34; for details. 4 5ubuntu@build-2404:~$ mkdir -p build/git 6ubuntu@build-2404:~$ cd build/git 7 8ubuntu@build-2404:~/build/git$ apt source git 9 10ubuntu@build-2404:~/build/git$ sudo apt build-dep git 11 12ubuntu@build-2404:~/build/git$ cd git-2.43.0 13 14ubuntu@build-2404:~/build/git/git-2.43.0$ dpkg-buildpackage 15dpkg-buildpackage: info: source package git 16dpkg-buildpackage: info: source version 1:2.43.0-1ubuntu7.1 17dpkg-buildpackage: info: source distribution noble-security 18dpkg-buildpackage: info: source changed by Leonidas Da Silva Barbosa... 19... Aktualisieren 1ubuntu@build-2404:~/build/git/git-2.43.0$ uupdate -u ../git-2.47.1.tar.xz 2Command \u0026#39;uupdate\u0026#39; not found, but can be installed with: 3 4sudo apt install devscripts 5sudo apt install joe 6 7ubuntu@build-2404:~/build/git/git-2.43.0$ uupdate -u ../git-2.47.1.tar.xz 8uupdate: New Release will be 1:2.47.1-0ubuntu1. 9Symlinking to pristine source from git_2.47.1.orig.tar.xz... 10uupdate: Untarring the new sourcecode archive ../git-2.47.1.tar.xz 11uupdate: Unpacking the debian/ directory from version 1:2.43.0-1ubuntu7.1 worked fine. 12debchange warning: neither DEBEMAIL nor EMAIL environment variable is set 13debchange warning: building email address from username and FQDN 14debchange: Did you see those 2 warnings? Press RETURN to continue... 15 16uupdate: Remember: Your current directory is the OLD sourcearchive! 17uupdate: Do a \u0026#34;cd ../git-2.47.1\u0026#34; to see the new package 18 19ubuntu@build-2404:~/build/git/git-2.43.0$ cd ../git-2.47.1 20ubuntu@build-2404:~/build/git/git-2.47.1$ jmacs debian/changelog 21ubuntu@build-2404:~/build/git/git-2.47.1$ head debian/changelog 22git (1:2.47.1-0dp11~1noble7.1) noble; urgency=medium 23 24 * New upstream release. 25 26 -- Uli Heller \u0026lt;uli.heller@daemons-point.com\u0026gt; Tue, 26 Nov 2024 22:52:42 +0000 27 28ubuntu@build-2404:~/build/git/git-2.47.1$ jmacs debian/patches/series 29ubuntu@build-2404:~/build/git/git-2.47.1$ dpkg-buildpackage Probleme Kein Zugriff auf's Internet vom Container aus Der Container hat keinen Zugriff auf's Internet. Dies äußert sich bspw. so:\n1$ lxc exec build-2404 bash 2root@build-2404:~# nc -z -v -w5 google.com 443 3nc: connect to google.com (142.250.185.78) port 443 (tcp) timed out: Operation now in progress 4nc: connect to google.com (2a00:1450:4001:810::200e) port 443 (tcp) failed: Network is unreachable Gelöst habe ich es mit:\nLöschen von Docker: sudo apt purge docker.io Neustart: sudo reboot (ohne ging es nicht) Danach klappt es:\n1root@build-2404:~# nc -z -v -w5 google.com 443 2Connection to google.com (142.250.185.78) 443 port [tcp/https] succeeded! Versionen Getestet mit Ubuntu 22.04.5 LTS auf dem Host Getestet mit LXC-6.1, snap version Getestet mit Ubuntu 24.04.1 LTS im Container Historie 2024-12-01: Erste Version ","link":"https://uli.heller.cool/blog/2024-12-01_lxc-build-container/","section":"blog","tags":["lxc","lxd","linux","ubuntu","debian"],"title":"LXC: Erzeugen eines Build-Containers"},{"body":" Manchmal benötige ich die Quellen eines Ubuntu-Pakets. Die Quellen spielt man ein mit apt source (paketname). Bei einer \u0026quot;frischen\u0026quot; Installation wird das Kommando quitiert mit dieser Fehlermeldung:\n1/tmp# apt source git 2Reading package lists... Done 3E: You must put some \u0026#39;deb-src\u0026#39; URIs in your sources.list Die Korrektur dieser Fehlermeldung folgt!\nAktivieren der Quelltext-Repos 1$ sudo cat /etc/apt/sources.list /etc/apt/sources.list.d/*\\ 2 |sed -e \u0026#34;s/^deb/deb-src/\u0026#34; -e \u0026#34;s/:\\s*deb$/: deb-src/\u0026#34;\\ 3 \u0026gt;/etc/apt/sources.list.d/deb-src.sources Aktualisierung 1$ sudo apt update 2Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease 3Get:2 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB] 4Get:3 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB] 5Get:4 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB] 6Get:5 http://archive.ubuntu.com/ubuntu noble-updates/main Sources [301 kB] 7Get:6 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [673 kB] 8Get:7 http://security.ubuntu.com/ubuntu noble-security/main Sources [127 kB] 9... Quelltext einspielen 1$ apt source git 2eading package lists... Done 3NOTICE: \u0026#39;git\u0026#39; packaging is maintained in the \u0026#39;Git\u0026#39; version control system at: 4https://repo.or.cz/r/git/debian.git/ 5Please use: 6git clone https://repo.or.cz/r/git/debian.git/ 7to retrieve the latest (possibly unreleased) updates to the package. 8Need to get 8159 kB of source archives. 9Get:1 http://archive.ubuntu.com/ubuntu noble-updates/main git 1:2.43.0-1ubuntu7.1 (dsc) [2927 B] 10Get:2 http://archive.ubuntu.com/ubuntu noble-updates/main git 1:2.43.0-1ubuntu7.1 (tar) [7383 kB] 11Get:3 http://archive.ubuntu.com/ubuntu noble-updates/main git 1:2.43.0-1ubuntu7.1 (diff) [773 kB] 12Fetched 8159 kB in 3s (2987 kB/s) 13dpkg-source: info: extracting git in git-2.43.0 14dpkg-source: info: unpacking git_2.43.0.orig.tar.xz 15dpkg-source: info: unpacking git_2.43.0-1ubuntu7.1.debian.tar.xz 16dpkg-source: info: using patch list from debian/patches/series 17dpkg-source: info: applying CVE-2024-32002.patch 18dpkg-source: info: applying CVE-2024-32004.patch 19dpkg-source: info: applying CVE-2024-32020.patch 20dpkg-source: info: applying CVE-2024-32021.patch 21dpkg-source: info: applying CVE-2024-32465.patch Versionen Getestet mit Ubuntu 22.04.5 LTS auf dem Host Getestet mit Ubuntu 24.04.1 LTS im Container Historie 2024-11-30: Erste Version ","link":"https://uli.heller.cool/blog/2024-11-30_source-repos/","section":"blog","tags":["lxc","lxd","linux","ubuntu","debian"],"title":"Ubuntu: Aktivieren der Quelltext-Repositories"},{"body":" Heute habe ich auf meinem Laptop erstmals mit LXC/LXD rumgespielt. Leider gab es Probleme beim Zugriff auf das Internet aus einem Container heraus!\nVorbemerkung Die LXC/LXD-Grundinitialisierung beschreibe ich in einer anderen Anleitung! Hier konzentriere ich mich auf obiges Problem!\nContainer anlegen und aktualisieren Container anlegen:\n1$ lxc launch ubuntu:24.04 build-2404 2Creating build-2404 3Starting build-2404 Container aktualisieren:\n1$ lxc exec build-2404 apt update 2Ign:1 http://archive.ubuntu.com/ubuntu noble InRelease 3Ign:2 http://archive.ubuntu.com/ubuntu noble-updates InRelease 4... 5W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/noble-security/InRelease Cannot initiate the connection to security.ubuntu.com:80 (2620:2d:4000:1::102). - connect (101: Network is unreachable) Cannot initiate the connection to security.ubuntu.com:80 (2620:2d:4000:1::103). - connect (101: Network is unreachable) Cannot initiate the connection to security.ubuntu.com:80 (2620:2d:4002:1::103). - connect (101: Network is unreachable) Cannot initiate the connection to security.ubuntu.com:80 (2620:2d:4002:1::102). - connect (101: Network is unreachable) Cannot initiate the connection to security.ubuntu.com:80 (2620:2d:4000:1::101). - connect (101: Network is unreachable) Cannot initiate the connection to security.ubuntu.com:80 (2620:2d:4002:1::101). - connect (101: Network is unreachable) Could not connect to security.ubuntu.com:80 (91.189.91.83), connection timed out Could not connect to security.ubuntu.com:80 (91.189.91.82), connection timed out Could not connect to security.ubuntu.com:80 (185.125.190.82), connection timed out Could not connect to security.ubuntu.com:80 (185.125.190.83), connection timed out Could not connect to security.ubuntu.com:80 (91.189.91.81), connection timed out Could not connect to security.ubuntu.com:80 (185.125.190.81), connection timed out 6W: Some index files failed to download. They have been ignored, or old ones used instead. Die Aktualisierung klappt nicht!\nKurztest Internet-Zugriff:\n1$ lxc exec build-2404 -- nc -z -w5 -v google.com 443 2nc: connect to google.com (142.250.186.110) port 443 (tcp) timed out: Operation now in progress 3nc: connect to google.com (2a00:1450:4001:829::200e) port 443 (tcp) failed: Network is unreachable Internet-Zugriff klappt nicht!\nKurzanalyse auf dem Laptop 1$ sudo iptables -L 2[sudo] Passwort für uli: 3# Warning: iptables-legacy tables present, use iptables-legacy to see them 4Chain INPUT (policy ACCEPT) 5target prot opt source destination 6 7Chain FORWARD (policy DROP) 8target prot opt source destination 9DOCKER-USER all -- anywhere anywhere 10DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere 11ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED 12DOCKER all -- anywhere anywhere 13ACCEPT all -- anywhere anywhere 14ACCEPT all -- anywhere anywhere 15 16Chain OUTPUT (policy ACCEPT) 17target prot opt source destination 18 19Chain DOCKER (1 references) 20target prot opt source destination 21 22Chain DOCKER-ISOLATION-STAGE-1 (1 references) 23target prot opt source destination 24DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere 25RETURN all -- anywhere anywhere 26 27Chain DOCKER-ISOLATION-STAGE-2 (1 references) 28target prot opt source destination 29DROP all -- anywhere anywhere 30RETURN all -- anywhere anywhere 31 32Chain DOCKER-USER (1 references) 33target prot opt source destination 34RETURN all -- anywhere anywhere Es werden ungewöhnlich viele Regeln angezeigt. Sie scheinen mit Docker zusammenzuhängen.\n1$ dpkg -l docker.io 2Gewünscht=Unbekannt/Installieren/R=Entfernen/P=Vollständig Löschen/Halten 3| Status=Nicht/Installiert/Config/U=Entpackt/halb konFiguriert/ 4 Halb installiert/Trigger erWartet/Trigger anhängig 5|/ Fehler?=(kein)/R=Neuinstallation notwendig (Status, Fehler: GROSS=schlecht) 6||/ Name Version Architektur Beschreibung 7+++-==============-=======================-============-================================= 8ii docker.io 24.0.7-0ubuntu2~22.04.1 amd64 Linux container runtime Korrekturversuch - Docker löschen 1$ sudo apt purge docker.io 2Paketlisten werden gelesen… Fertig 3Abhängigkeitsbaum wird aufgebaut… Fertig 4Statusinformationen werden eingelesen… Fertig 5Die folgenden Pakete wurden automatisch installiert und werden nicht mehr benötigt: 6 containerd libclamav9 libtfm1 pigz runc ubuntu-fan 7Verwenden Sie »sudo apt autoremove«, um sie zu entfernen. 8Die folgenden Pakete werden ENTFERNT: 9 docker.io* 100 aktualisiert, 0 neu installiert, 1 zu entfernen und 0 nicht aktualisiert. 11Nach dieser Operation werden 108 MB Plattenplatz freigegeben. 12Möchten Sie fortfahren? [J/n] J 13... Leider klappt der Internet-Zugriff noch immer nicht:\n1$ lxc exec build-2404 -- nc -z -w5 -v google.com 443 2nc: connect to google.com (142.250.186.110) port 443 (tcp) timed out: Operation now in progress 3nc: connect to google.com (2a00:1450:4001:80e::200e) port 443 (tcp) failed: Network is unreachable Es gibt auch immer noch viele Regeln in iptables für Docker:\n1$ sudo iptables -L 2... 3Chain DOCKER-USER (1 references) 4target prot opt source destination 5RETURN all -- anywhere anywhere Korrekturversuch - Reboot Nach einem Reboot passen die Regeln:\n1$ sudo iptables -L 2[sudo] Passwort für uli: 3# Warning: iptables-legacy tables present, use iptables-legacy to see them 4Chain INPUT (policy ACCEPT) 5target prot opt source destination 6 7Chain FORWARD (policy ACCEPT) 8target prot opt source destination 9 10Chain OUTPUT (policy ACCEPT) 11target prot opt source destination Leider klappt der Internet-Zugriff noch immer nicht:\n1$ lxc exec build-2404 -- nc -z -w5 -v google.com 443 2Connection to google.com (142.250.186.110) 443 port [tcp/https] succeeded! Aktualisierung klappt auch:\n1$ lxc exec build-2404 apt update 2Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease 3Get:2 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB] 4Get:3 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB] 5Reading state information... Done 61 package can be upgraded. Run \u0026#39;apt list --upgradable\u0026#39; to see it. 7 8$ lxc exec build-2404 apt upgrade 9Reading package lists... Done 10Building dependency tree... Done 11Reading state information... Done 12Calculating upgrade... Done 13# 14# Patches available for the local privilege escalation issue in needrestart 15# tracked by CVE-2024-48990, CVE-2024-48991, CVE-2024-48992, and CVE-2024-10224 16# For more see: https://ubuntu.com/blog/needrestart-local-privilege-escalation 17# 18The following upgrades have been deferred due to phasing: 19 snapd 200 upgraded, 0 newly installed, 0 to remove and 1 not upgraded. Damit bin ich erstmal zufrieden. Docker brauche ich vorerst nicht.\nVersionen Getestet mit Ubuntu 22.04.5 LTS auf dem Host Getestet mit LXC-6.1, snap version und docker.io-24.0.7 Getestet mit Ubuntu 24.04.1 LTS im Container Historie 2024-11-29: Erste Version ","link":"https://uli.heller.cool/blog/2024-11-29_lxc-kein-internet/","section":"blog","tags":["lxc","lxd","linux","ubuntu","debian"],"title":"LXC: Kein Zugriff auf das Internet"},{"body":" Manchmal passe ich Artikel und BlogPosts auf meiner Webseite nachträglich an. Ich bemühe mich, innerhalb Dokumente die Änderungshistorie zu dokumentieren (was wurde wann geändert?). Hier zeige ich, wie man nachträgliche Änderungen auch in den Übersichten erkennen kann.\nAktivierung \u0026quot;Zuletzt geändert\u0026quot; 1diff --git a/my-hugo-site/hugo.toml b/my-hugo-site/hugo.toml 2index 84b7c7d..7103dfb 100644 3--- a/my-hugo-site/hugo.toml 4+++ b/my-hugo-site/hugo.toml 5@@ -6,6 +6,7 @@ pagination.pageSize = \u0026#34;10\u0026#34; # Number of posts per page 6 theme = \u0026#34;mainroad\u0026#34; 7 disqusShortname = \u0026#34;\u0026#34; # Enable comments by entering your Disqus shortname 8 googleAnalytics = \u0026#34;\u0026#34; # Enable Google Analytics by entering your tracking id 9+enableGitInfo = true 10 11 [Params.author] 12 name = \u0026#34;John Doe\u0026#34; Mit voriger Änderung wird der Zeitpunkt der letzten Änderung via GIT ermittelt. Die Darstellung in den Übersichten sieht dann so aus:\n\u0026quot;Zuletzt geändert\u0026quot; vor Datum der Erstveröffentlichung Manchmal bereite ich Artikel frühzeitig zur Veröffentlichung vor. Beispielsweise habe ich nachfolgenden Artikel erstellt am 25.11. zur Veröffentlichung am 27.11.:\nIdealerweise wird \u0026quot;zuletzt geändert\u0026quot; nur angezeigt, wenn die Änderung nach der Erstveröffentlichung erfolgt! Erreicht wird dies beim Theme \u0026quot;mainroad\u0026quot; mit dieser Änderung:\n1diff --git a/my-hugo-site/themes/mainroad/layouts/partials/post_meta/date.html b/my-hugo-site/themes/mainroad/layouts/partials/post_meta/date.html 2index 33055a5..f9bdd8d 100644 3--- a/my-hugo-site/themes/mainroad/layouts/partials/post_meta/date.html 4+++ b/my-hugo-site/themes/mainroad/layouts/partials/post_meta/date.html 5@@ -4,7 +4,7 @@ 6 \u0026lt;time class=\u0026#34;meta__text\u0026#34; datetime=\u0026#34;{{ .Date.Format \u0026#34;2006-01-02T15:04:05Z07:00\u0026#34; }}\u0026#34;\u0026gt; 7 {{- .Date | dateFormat (.Site.Params.dateformat | default \u0026#34;January 02, 2006\u0026#34;) -}} 8 \u0026lt;/time\u0026gt; 9- {{- if ne .Date .Lastmod }} 10+ {{- if lt .Date .Lastmod }} 11 \u0026lt;time class=\u0026#34;meta__text\u0026#34; datetime=\u0026#34;{{ .Lastmod.Format \u0026#34;2006-01-02T15:04:05Z07:00\u0026#34; }}\u0026#34;\u0026gt;( 12 {{- T \u0026#34;meta_lastmod\u0026#34; }}: {{ .Lastmod | dateFormat (.Site.Params.dateformat | default \u0026#34;January 02, 2006\u0026#34;) -}} 13 )\u0026lt;/time\u0026gt; \u0026quot;Zuletzt geändert\u0026quot; am Datum der Erstveröffentlichung Wenn ich einen Artikel veröffentliche und dann am selben Tag noch Änderungen vornehme, dann erscheint manchmal die Anzeige \u0026quot;November 23, 2024 (Zuletzt geändert: November 23, 2024)\u0026quot;, also zweimal dasselbe Datum:\nDas Problem löse ich durch Überarbeitung der Abfragebedingung in \u0026quot;date.html\u0026quot;:\n1diff --git a/my-hugo-site/themes/mainroad/layouts/partials/post_meta/date.html b/my-hugo-site/themes/mainroad/layouts/partials/post_meta/date.html 2index 33055a5..f9bdd8d 100644 3--- a/my-hugo-site/themes/mainroad/layouts/partials/post_meta/date.html 4+++ b/my-hugo-site/themes/mainroad/layouts/partials/post_meta/date.html 5@@ -4,7 +4,7 @@ 6 \u0026lt;time class=\u0026#34;meta__text\u0026#34; datetime=\u0026#34;{{ .Date.Format \u0026#34;2006-01-02T15:04:05Z07:00\u0026#34; }}\u0026#34;\u0026gt; 7 {{- .Date | dateFormat (.Site.Params.dateformat | default \u0026#34;January 02, 2006\u0026#34;) -}} 8 \u0026lt;/time\u0026gt; 9- {{- if ne .Date .Lastmod }} 10+\t{{- if ge (sub .Lastmod.Unix .Date.Unix) 86400 }} 11 \u0026lt;time class=\u0026#34;meta__text\u0026#34; datetime=\u0026#34;{{ .Lastmod.Format \u0026#34;2006-01-02T15:04:05Z07:00\u0026#34; }}\u0026#34;\u0026gt;( 12 {{- T \u0026#34;meta_lastmod\u0026#34; }}: {{ .Lastmod | dateFormat (.Site.Params.dateformat | default \u0026#34;January 02, 2006\u0026#34;) -}} 13 )\u0026lt;/time\u0026gt; Ursprüngliche Variante OBSOLET, es gibt eine bessere Lösung!\nDas Problem kann man sicherlich irgendwie über Anpassungen am Mainroad-Theme lösen. Mein pragmatischer Ansatz besteht im richtigen Setzen des Veröffentlichungsdatums:\n1diff --git a/my-hugo-site/content/blog/2024-11-23_github-oder-codeberg/index.md b/my-hugo-site/content/blog/2024-11-23_github-oder-codeberg/index.md 2index e5ddcc1..0ed0230 100644 3--- a/my-hugo-site/content/blog/2024-11-23_github-oder-codeberg/index.md 4+++ b/my-hugo-site/content/blog/2024-11-23_github-oder-codeberg/index.md 5@@ -1,5 +1,5 @@ 6 +++ 7-date = \u0026#39;2024-11-23\u0026#39; 8+date = \u0026#39;2024-11-23T22:00:00\u0026#39; 9 draft = false 10 title = \u0026#39;Github oder Codeberg oder ???\u0026#39; 11 categories = [ \u0026#39;Github\u0026#39; ] Versionen Getestet mit\nhugo v0.136.5-46cc... Theme: mainroad, main, commit:13e04b3694ea2d20a68cfbfaea42a8c565079809 Historie 2024-11-28: Erste Version ","link":"https://uli.heller.cool/blog/2024-11-28_hugo-letzte-aenderung/","section":"blog","tags":["hugo","mainroad"],"title":"Hugo: Letzte Änderung anzeigen"},{"body":" Bei meiner Webseite stören mich die Ränder oben und an den Seiten. Sind zwar nur ein paar Pixel, dennoch sollen sie weg:\n\u0026quot;Halbe\u0026quot; Korrektur 1uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site/content/blog/2024-11-27_hugo-mainroad-rand$ git diff \u0026#39;kein-rand~1..kein-rand\u0026#39; 2diff --git a/my-hugo-site/themes/mainroad/assets/css/style.css b/my-hugo-site/themes/mainroad/assets/css/style.css 3index a64bc86..b2f024d 100644 4--- a/my-hugo-site/themes/mainroad/assets/css/style.css 5+++ b/my-hugo-site/themes/mainroad/assets/css/style.css 6@@ -67,8 +67,8 @@ body { 7 } 8 9 .container--outer { 10- margin: 25px auto; 11- box-shadow: 0 0 10px rgba(50, 50, 50, .17); 12+ /*margin: 25px auto;*/ 13+ /*box-shadow: 0 0 10px rgba(50, 50, 50, .17);*/ 14 } 15 16 .wrapper { Danach sieht es so aus:\nDer obere Rand ist weg, rechts und links gibt es aber noch einen Rand!\nWeitergehende Analyse Wenn ich die Menüzeile bei verschiedenen Breiten des Browserfensters beobachte, dann stelle ich fest:\nBreite kleiner 900px: Kein Rand links und rechts Breite größer 900px: Rand links und rechts Also:\nTheme \u0026quot;mainroad\u0026quot; durchsuchen nach 900px Gefunden in themes/mainroad/assets/css/style.css Ändern auf 9000px Sichten -\u0026gt; klappt nun, Menü ist immer ohne Rand 1diff --git themes/mainroad/assets/css/style.css themes/mainroad/assets/css/style.css 2index 72d9df7..c0f66e4 100644 3--- themes/mainroad/assets/css/style.css 4+++ themes/mainroad/assets/css/style.css 5@@ -1197,7 +1197,7 @@ textarea { 6 } 7 } 8 9-@media screen and (max-width: 900px) { 10+@media screen and (max-width: 9000px) { 11 .container--outer { 12 width: 100%; 13 margin: 0 auto; Versionen Getestet mit\nhugo v0.136.5-46cc... Theme: mainroad, main, commit:13e04b3694ea2d20a68cfbfaea42a8c565079809 Historie 2024-12-01: Leider nur halbe Korrektur und weitergehende Analyse 2024-11-27: Erste Version ","link":"https://uli.heller.cool/blog/2024-11-27_hugo-mainroad-rand/","section":"blog","tags":["hugo","mainroad"],"title":"Hugo: Ränder entfernen"},{"body":" Momentan ist mir persönlich noch nicht 100%ig klar, unter welcher Lizenz ich meine Artikel hier veröffentlichen möchte. Stand November 2024 habe ich noch keine Lizenz festgelegt. Das wird sich wahrscheinlich in den nächsten Wochen oder Monaten ändern. In diesem Post halte ich meine Gedanken dazu fest!\nGrundsätzliche Überlegungen Ich höre immer wieder, dass ich eine Lizenz festlegen muß um nicht in einer Grauzone zu landen. Für mich ist klar, dass ich\ndie Wiederverwendung grundsätzlich zulassen möchte bei Wiederverwendung in den Quellen genannt werden möchte nicht haftbar sein möchte wenn jemand die Posts \u0026quot;nachspielt\u0026quot; und dabei Schaden anrichtet gleiches für Aufgreifen der Posts und schadhafte Anwendung Ob jemand mit der Verwendung Geld verdient oder nicht ist mir persönlich erstmal egal!\nKünstliche Intelligenz Etwas problematisch finde ich die Nutzung meiner Texte für's Anlernen von KI-Modellen oder ähnlichem sowie den daran anschliessenden Folgenutzungen. KI-Modelle erzeugen aus den angelernten Daten für den Nutzer der Modelle neue Daten. Diese basieren auf den für's Anlernen genutzten Quellen, also im Zweifel auf meinen Texten. Der Nutzer kann dies aber nicht erkennen. Also kann er auch den von mir gewünschten Quellverweis nicht erstellen.\nZur Vermeidung von \u0026quot;Unstimmigkeiten\u0026quot; möchte ich die Verwendung für's Anlernen von KI-Modellen ausschliessen! Mir geht es bei dem Ausschluss nicht um den konkreten Ablauf des Anlernens oder um Begrifflichkeiten.\nWas möchte ich zulassen?\nVerwendung in \u0026quot;Suchmaschinen\u0026quot;. \u0026quot;Suchmaschinen\u0026quot; sind für mich in diesem Zusammenhang Einrichtungen, die meine Texte und/oder Bilder auswerten und ihren menschliche Nutzern präsentieren mit Hinweisen und Verweisen auf die Quellen\nStand 2024 gibt es mehrere dieser \u0026quot;Suchmaschinen\u0026quot;. Man gibt als menschlicher Nutzer Schlagworte ein und bekommt Auszüge aus Webseiten angezeigt samt Verweis auf die Webseite. Der menschliche Nutzer bewertet die erlangte Information und nutzt sie entsprechend den dahinterliegenden Lizenen. Diese Art der Nutzung finde ich absolut in Ordnung!\nWas möchte ich nicht zulassen?\nVerwendung in \u0026quot;Wissenswolken\u0026quot;. \u0026quot;Wissenswolken\u0026quot; sind für mich in diesem Zusammenhang Einrichtungen, die meine Texte und/oder Bilder auswerten, optional mit anderen Inhalten vermischen und ihren Nutzern präsentieren ohne sinnvollen Hinweisen auf die Quellen\nStand 2024 gibt es mehrere dieser \u0026quot;Wissenswolken\u0026quot;. Die aktuell bekannteste \u0026quot;Wissenswolke\u0026quot; ist wohl ChatGPT. Als Nutzer der \u0026quot;Wissenswolke\u0026quot; präsentiere ich eine Fragestellung und erhalte als Ergebnis eine Vermischung aus den Eingangsdaten der \u0026quot;Wissenswolke\u0026quot;. Der Nutzer kann am Ergebnis die Quellen nicht mehr erkennen. Er kann also die dahinterliegenden Lizenzen auch nicht einhalten. Diese Art der Nutzung möchte ich ausschliessen!\nIm Artikel The future is now: Künstliche Intelligenz und das Urheberrecht wird darauf hingewiesen, dass Einschränkungen der oben genannten Art nur zulässig sind, wenn sie in maschinenlesbarer Form bereitgestellt werden. Die maschinenlesbare Form findet sich hier: robots.json.\nFür Techniker:\n1{ 2 \u0026#34;search\u0026#34;: true, 3 \u0026#34;ai\u0026#34;: false 4} \u0026quot;search\u0026quot; und \u0026quot;ai\u0026quot; entsprechen dabei den vorgenannten Bereichen \u0026quot;Suchmaschine\u0026quot; und \u0026quot;Wissenswolke\u0026quot;. 'true' bedeutet, dass die entsprechende Nutzung zugelassen ist, 'false' schliesst die Nutzung aus!\nEntscheidungshilfen Ein Ausgangspunkt für die Lizenz scheint mir Creative Commons zu sein. Dort gibt es einen \u0026quot;Lizenz-Wähler\u0026quot;. Wenn ich den durchspiele, dann wird die Lizenz CC BY-SA 4.0 gewählt. Hier die Lizenzbedingungen in einfach verständlicher Form: NAMENSNENNUNG-SHARE ALIKE 4.0 INTERNATIONAL.\nCreativeCommons-Lizenz-Auswähler License Expertise Do you know which license you need? -\u0026gt; No Attribution Do you want attribution for your work? -\u0026gt; Yes Commercial Use Do you want to allow others to use your work commercially? -\u0026gt; Yes Derivative Works Do you want to allow others to remix, adapt, or build upon your work? -\u0026gt; Yes Sharing Requirements Do you want to allow others to share adaptations of your work under any terms? -\u0026gt; No Confirm that CC licensing is appropriate I own or have authority to license the work -\u0026gt; Yes I have read and understand the terms of the license -\u0026gt; Yes I understand that CC licensing is not revocable -\u0026gt; Yes Attribution Details Title: Ulis Welt ... da läuft was! Creator: Uli Heller Link to Work: https://uli.heller.cool Link to Profile: https://uli.heller.cool/about Year Of Creation: 2024 Ergebnis:\nText: \u0026quot;Ulis Welt ... da läuft was! © 2024 by Uli Heller is licensed under CC BY-SA 4.0. To view a copy of this license, visit https://creativecommons.org/licenses/by-sa/4.0/\" HTML: Ulis Welt ... da läuft was! by Uli Heller is licensed under CC BY-SA 4.0\nMarkdown: Ulis Welt ... da läuft was! (c) 2024 by Uli Heller is licensed under CC BY-SA 4.0 Noch zu erledigen Klären: Wie \u0026quot;verkuddle\u0026quot; ich die CC-BY-SA mit meinen KI-Ausschlüssen? Ist das überhaupt möglich? Ich habe den Eindruck, dass bei CC dieses Themengebiet aktuell in Arbeit ist, vermutlich werde ich mich an deren Ergebnissen orientieren Klären: Geht der KI-Ausschluss, wenn ich Github verwende? Github-Nutzungsbedingungen lesen Eventuell wechseln auf ein anderes Code-Repo Fußzeile entsprechend erweitern! Lizenzseite erstellen! Links Creative Commons CC-BY-SA 4.0 CC-BY-SA 3.0 \u0026quot;Lizenz-Wähler\u0026quot; The future is now: Künstliche Intelligenz und das Urheberrecht Historie 2024-11-25: Erste Version ","link":"https://uli.heller.cool/blog/2024-11-25_lizenzen/","section":"blog","tags":["hugo","lizenz"],"title":"Lizenzen"},{"body":" Das Einbinden von Bildern in Markdown ist für mich persönlich ein stetiger Quell an Ärger. Insbesondere wenn ich SVG-Bilder einbinde, dann werden die so angezeigt, dass sie die gesamte verfügbare Breite \u0026quot;einnehmen\u0026quot;. Das ist besonders \u0026quot;doof\u0026quot; bei Mini-Piktogrammen wie bspw. diesem hier:\nHoffen wir mal, dass Abhilfe möglich ist!\nHuanlin ImageRenderer Huanlin Docs - A Hugo image render hook that supports width parameter beschreibt ein Verfahren, mit dem es möglich sein sollte, die Breite vorzugeben.\nImplementierung des ImageRenderers Einspielen nach \u0026quot;layouts/_default/_markup/render-image.html\u0026quot; Anpassen der Bilder-Syntax: Bislang: ![Creative Commons Logo](images/logo.svg) Nun: ![Creative Commons Logo](images/logo.svg?width=20px) Sichten: Wie sieht es \u0026quot;oben\u0026quot; aus? Gut! Hugo Images Module Es gibt auch eine etwas komfortablere und umfangreichere Implementierung in Form eines Hugo-Modul für Images. Das wird auch im Artikel von Huanlin erwähnt. Es ist schwieriger einzuspielen. Außerdem hat es wohl diese Einschränkungen (bei Huanlin auf Chinesisch):\nBilder-Pfade, die mit \u0026quot;.\u0026quot; beginnen (bspw. \u0026quot;./images/uli.png\u0026quot;), werden nicht richtig unterstützt Bilder werden mit den angegebenen Dimensionen gespeichert. Das Original-Bild ist nicht mehr verfügbar! Typischerweise wird das Bild zusätzlich im WEBP-Format abgespeichert. Anmerkung Uli: Kann unterdrückt werden! Konfiguration Ich verwende das Modul vorerst nicht!\nLinks Huanlin Docs - A Hugo image render hook that supports width parameter Lizenz CC BY-NC-ND 4.0 Hugo-Modul für Images ... verwende ich aktuell nicht Notizen Implementierung des ImageRenderers Historie 2024-11-24: Erste Version ","link":"https://uli.heller.cool/blog/2024-11-24_hugo-bilder-mit-breite/","section":"blog","tags":["hugo"],"title":"Hugo: Bilder mit Breite"},{"body":"","link":"https://uli.heller.cool/tags/png/","section":"tags","tags":null,"title":"Png"},{"body":"","link":"https://uli.heller.cool/tags/svg/","section":"tags","tags":null,"title":"Svg"},{"body":" Hier einige Tipps zum Umgang mit SVG-Dateien.\nWandeln nach PNG Quelle: Symbol_OK.svg Lokale Kopie: Symbol_OK.svg Gewandelt nach PNG: Symbol_OK.png (mit convert Symbol_OK.svg Symbol_OK.png) (Farbe versaut!) Historie 2024-12-23: Strukturelle Anpassungen 2024-11-24: Erste Version ","link":"https://uli.heller.cool/articles/svg-cheatsheet/","section":"articles","tags":["svg","pdf","png","imagemagick"],"title":"SVG Cheatsheet"},{"body":"","link":"https://uli.heller.cool/tags/codeberg/","section":"tags","tags":null,"title":"Codeberg"},{"body":"","link":"https://uli.heller.cool/categories/github/","section":"categories","tags":null,"title":"Github"},{"body":" Aktuell gibt es Diskussionen um die Verwendung von Github beispielsweise hier: Software Freedom Conservancy - Give Up Github!.\nIm November 2024 liegt meine Webseite komplett auf Github. Nachfolgend einige Gedanken hierzu. Warum mache ich es so? Wie kann es weitergehen?\nAktuell ist dies hier noch eine lose Ideensammlung. Keine Ahnung, ob die Veröffentlichung zu diesem Zeitpunkt eine gute Idee ist?\nWarum Github? Weil ich es \u0026quot;schon immer so mache\u0026quot;! Gitlab habe ich mal ausprobiert, ist \u0026quot;anders\u0026quot; Beruflich nutze ich primär Gitlab und Gitea/Forgejo (selbst aufgesetzt) Weil GithubPages so schön einfach sind! Einfach einzurichten Einfach zu nutzen! Nutzung mit beliebigen StaticSiteGenerators, nicht nur mit Jekyll (= Mechanismus, der in Github eingebaut ist) Weil ich für viele Dinge eh' auf Github arbeiten muß! Fremdprojekte, die ich nutze, liegen zum Großteil auf Github Mitarbeit bei Fremdprojekten, die nicht auf Github liegen, ist \u0026quot;anders\u0026quot; Warum besser nicht Github? Monopolartiger Dienst Gewinnorientiert. Hat teilweise Auswirkung auf die Nutzung, bspw wird Jekyll nicht mehr so intensiv weiterentwickelt wie früher! Datenkrake Links Codeberg Github Gitlab Software Freedom Conservancy - Give Up Github! Historie 2024-11-29: Zusatzmarkierungen: Datenschutz, DSGVO 2024-11-23: Erste Version ","link":"https://uli.heller.cool/blog/2024-11-23_github-oder-codeberg/","section":"blog","tags":["codeberg","git","github","datenschutz","dsgvo"],"title":"Github oder Codeberg oder ???"},{"body":" Ich verwende auf meiner Hugo-Seite gerne Page Bundles. Die erlauben mir, alle Teile eines Dokuments in einem Ordner abzulegen. Damit weiß ich dann, was zusammengehört und kann so veraltete Dokumente problemlos löschen.\nLeider stellt sich heraus, dass es Probleme mit Bildern gibt. Wenn eine Seite auf dem Page Bundle auf ein Bild innerhalb des Bundles verweist, dann funktioniert das Einblenden des Bildes in der Detailansicht problemlos. In der Dokumenten-Übersicht wird das Bild aber nicht dargestellt. Das sieht dann so wie hier aus:\nDamit das Bild in der Dokumenten-Übersicht angezeigt wird, muß es auf jeden Fall oberhalb von \u0026quot;\u0026lt;!--more--\u0026gt;\u0026quot; stehen! Obiges Bild ist bewusst \u0026quot;kaputt\u0026quot;. Es wird immer als kaputt angezeigt!\nAbhilfe Aus meiner Sicht wird das Problem an einfachsten korrigiert durch Image render hooks - Default. Bei mir sieht das so aus:\n1diff --git a/my-hugo-site/hugo.toml b/my-hugo-site/hugo.toml 2index 5ba0696..84b7c7d 100644 3--- a/my-hugo-site/hugo.toml 4+++ b/my-hugo-site/hugo.toml 5@@ -37,3 +37,9 @@ googleAnalytics = \u0026#34;\u0026#34; # Enable Google Analytics by entering your tracking id 6 [Params.widgets] 7 recent_num = 10 # Set the number of articles in the \u0026#34;Recent articles\u0026#34; widget 8 tags_counter = false # Enable counter for each tag in \u0026#34;Tags\u0026#34; widget (disabled by default) 9+ 10+[markup] 11+ [markup.goldmark] 12+ [markup.goldmark.renderHooks] 13+ [markup.goldmark.renderHooks.image] 14+ enableDefault = true Danach werden die Bilder auch in der Übersicht korrekt angezeigt!\nLinks Page Bundles Image render hooks - Default Historie 2024-11-23: Erste Version ","link":"https://uli.heller.cool/blog/2024-11-23_hugo-bilder-bei-page-bundles/","section":"blog","tags":["hugo"],"title":"Hugo: Bilder bei Page Bundles"},{"body":" Wenn ich mit Git-Submodulen arbeite, dann sehe ich gelegentlich Fehlermeldungen wie diese:\n1uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ git commit -m \u0026#34;png-cheatsheet.md: Skalieren auf Breite und Höhe\u0026#34; . 2Fehler: \u0026#39;my-hugo-site/themes/mainroad.orig\u0026#39; hat keinen Commit ausgecheckt 3Schwerwiegend: Aktualisierung der Dateien fehlgeschlagen 4 5$ LANG=C git commit . 6error: \u0026#39;my-hugo-site/themes/mainroad.orig\u0026#39; does not have a commit checked out 7fatal: updating files failed Hier beschreibe ich, was zu tun ist, damit die Fehlermeldung verschwindet!\nFehlerbeschreibung Wenn ich mich richtig erinnere, dann tritt der Fehler beispielsweise bei folgendem Abauf aus:\nIch habe einen Checkout und füge diesem ein Submodul hinzu\nIch wechsle zu einem anderen Rechner\nIch clone das Repo ohne spezielle Berücksichtigung des Submoduls\nIch versuche eine Änderung im Repo abzuspeichern (git commit ...)\nKO: git commit -m XYZ . OK: git commit -m XYZ content Submodul liegt außerhalb von \u0026quot;content\u0026quot; Hier die Fehler im Detail:\n1uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ git commit -m \u0026#34;png-cheatsheet.md: Skalieren auf Breite und Höhe\u0026#34; . 2Fehler: \u0026#39;my-hugo-site/themes/mainroad.orig\u0026#39; hat keinen Commit ausgecheckt 3Schwerwiegend: Aktualisierung der Dateien fehlgeschlagen 4 5uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ git commit -m \u0026#34;png-cheatsheet.md: Skalieren auf Breite und Höhe\u0026#34; content 6[main 9ada5c8] png-cheatsheet.md: Skalieren auf Breite und Höhe 7 1 file changed, 11 insertions(+) Abhilfe Den Fehler kann man recht einfach korrigieren mit:\n1git submodule init 2git submodule update Die Ausgaben im Detail sehen so aus:\n1uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ git submodule init 2Submodul \u0026#39;my-hugo-site/themes/mainroad.orig\u0026#39; (https://github.com/vimux/mainroad.git) für Pfad \u0026#39;themes/mainroad.orig\u0026#39; in die Konfiguration eingetragen. 3 4uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ git submodule update 5Klone nach \u0026#39;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/themes/mainroad.orig\u0026#39;... 6Submodul-Pfad \u0026#39;themes/mainroad.orig\u0026#39;: \u0026#39;13e04b3694ea2d20a68cfbfaea42a8c565079809\u0026#39; ausgecheckt Historie 2024-12-20: Tippfehler korrigiert 2024-11-22: Erste Version ","link":"https://uli.heller.cool/blog/2024-11-22_git-submodule-kein-commit/","section":"blog","tags":["git"],"title":"Git: Mecker über fehlenden Commit"},{"body":" Meine Webseite verhält sich aus meiner Sicht ungünstig, wenn man das Browserfenster verbreitert. Es wird dann links und rechts ein leerer Bereich eingeblendet. Der Nutztext bleibt schmal, links und rechts gibt es einen leeren Bereich.\nAnzeige in einem schmalen Browserfenster Bei einem verhältnismässig schmalen Browserfenster passt die Darstellung halbwegs: Außen rum ein schmaler Rand, Text nimmt fast das gesamte Browser-Fenster ein:\nAnzeige in einem breiten Browserfenster Wenn man das Browserfenster in die Breite zieht, so wird der Text zunächst auch breiter. Ab einem bestimmten Punkt friert dessen Breite aber ein und es werden links und rechts leere Bereiche eingefügt:\nIch bin mir durchaus bewußt, dass das dem übliche Vorgehen entspricht. Mir persönlich gefällt es aber überhaupt nicht. Für mich ist das Platzverschwendung!\nAufhebung der Breitenlimitierung Über die Browser-Funktion \u0026quot;Rechtsklick - Untersuchen\u0026quot; habe ich die Darstellung gesichtet. Dabei ist mir aufgefallen, dass die Breite des Textbereichs auf \u0026quot;1080px\u0026quot; begrenzt ist. Danach habe ich dann im Unterverzeichnis \u0026quot;themes/mainroad\u0026quot; gesucht und die Limitierung entfernt:\n1--- my-hugo-site/themes/mainroad/assets/css/style.css --- 2index 651a2c7..a64bc86 100644 3@@ -62,7 +62,7 @@ body { 4 .container { 5 position: relative; 6 width: 100%; 7-\tmax-width: 1080px; 8+\t/*max-width: 1080px;*/ 9 margin: 0 auto; 10 } Damit erfolgt die Darstellung dann ohne Rand links und rechts:\nVersionen Getestet mit\nhugo v0.136.5-46cc... Theme: mainroad, main, commit:13e04b3694ea2d20a68cfbfaea42a8c565079809 Historie 2024-11-22: Erste Version ","link":"https://uli.heller.cool/blog/2024-11-22_hugo-mainroad-breite/","section":"blog","tags":["hugo","mainroad"],"title":"Hugo: Breitenlimitierung aufheben"},{"body":" Ich muß immer mal wieder mit PNG-Dateien arbeiten. Die muß ich dann oft bearbeiten, bspw. die Größe anpassen. Gefühlt muß ich jedes mal wieder auf's neue \u0026quot;googlen\u0026quot;, wie das funktioniert. Hier sammle ich Tipps für solche Tätigkeiten. Im Moment ist die Sammlung noch recht überschaubar, sie wird wachsen!\nGröße halbieren convert -resize 50% (alt).png (neu).png\nAuf Breite skalieren convert -resize 1024x (alt).png (neu).png\nAuf Höhe skalieren convert -resize x240 (alt).png (neu).png\nHintergrund transparent Original convert stuttgart.svg stuttgart.png ... liefert einen weißen Hintergrund convert stuttgart.svg -transparent white stuttgart-t.png ... liefert einen transparenten Hintergrund Skalieren und transparent Original convert stuttgart.svg -resize 60x -transparent white stuttgart-rt.png ... unschönes Bild mit weißem Rand convert stuttgart.svg -transparent white -resize 60x stuttgart-tr.png ... besseres Bild ohne Rand Dateigröße reduzieren pngquant -o (neu).png 32 (alt).png\nWandeln nach PDF convert s1.png s2.png s3.png -auto-orient result.pdf\nHistorie 2024-12-29: Transparenz 2024-12-10: Wandeln nach PDF 2024-11-25: Dateigröße reduzieren 2024-11-22: Skalieren auf Breite und Höhe 2024-11-22: Erste Version ","link":"https://uli.heller.cool/articles/png-cheatsheet/","section":"articles","tags":["pdf","png","imagemagick"],"title":"Tipps und Tricks mit PNG-Dateien"},{"body":" Ich habe gerade erst begonnen mit Hugo zu arbeiten. Hier sammle ich alle möglichen Kniffe, die mir über den Weg laufen. Idealerweise muß ich dann nicht permanent immer die gleichen Probleme \u0026quot;googlen\u0026quot;.\nVorabkontrolle Alle Artikel anzeigen: hugo --buildDrafts --buildExpired --buildFuture server Historie 2024-11-21: Erste Version ","link":"https://uli.heller.cool/articles/hugo-cheatsheet/","section":"articles","tags":["hugo"],"title":"Hugo: Tipps und Tricks"},{"body":" Meine mit Hugo erstellte Webseite eignet sich ideal zur Veröffentlichung auf Github. Den auf OctoPress basierenden Vorgänger habe ich veröffentlicht als statische Webapp auf dem Webserver meiner Firma \u0026quot;daemons-point.com\u0026quot;.\nDazu braucht's:\nEinen Rechner, der die Seite zusammenbaut Einen Rechner, der als Webserver fungiert Für meine private Seite möchte ich möglichst wenig Infrastruktur-Komponenten verwenden, also versuche ich mich an Github und Github-Pages. Mal sehen, wie's läuft!\nVorbedingungen Nutzer auf Github: uli-heller Repository auf Github: uli.heller.cool Ablauf Repository öffnen - uli.heller.cool Settings Pages Traditioneller Weg Build and deployment Source: Deploy from a branch Branch: gh-pages Custom domain: uli.heller.cool Danach: Lokal bauen und \u0026quot;my-hugo-site/pubic\u0026quot; in den Branch \u0026quot;gh-pages\u0026quot; ausrollen Neuer Weg Workflow-Datei anlegen - .github/workflows/hugo.yaml\nDie Workflow-Datei muß in \u0026quot;main\u0026quot; landen! Die Pfade werden angepasst (zumindest vorerst) hugo.yaml: 1# Sample workflow for building and deploying a Hugo site to GitHub Pages 2name: Deploy Hugo site to Pages 3 4on: 5 # Runs on pushes targeting the default branch 6 push: 7 branches: 8 - main\t9 10 # Allows you to run this workflow manually from the Actions tab 11 workflow_dispatch: 12 13# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 14permissions: 15 contents: read 16 pages: write 17 id-token: write 18 19# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. 20# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. 21concurrency: 22 group: \u0026#34;pages\u0026#34; 23 cancel-in-progress: false 24 25# Default to bash 26defaults: 27 run: 28 shell: bash 29 30jobs: 31 # Build job 32 build: 33 runs-on: ubuntu-latest 34 env: 35 HUGO_VERSION: 0.137.1 36 steps: 37 - name: Install Hugo CLI 38 run: | 39 wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \\ 40 \u0026amp;\u0026amp; sudo dpkg -i ${{ runner.temp }}/hugo.deb 41 - name: Install Dart Sass 42 run: sudo snap install dart-sass 43 - name: Checkout 44 uses: actions/checkout@v4 45 with: 46 submodules: recursive 47 fetch-depth: 0 48 - name: Setup Pages 49 id: pages 50 uses: actions/configure-pages@v5 51 - name: Install Node.js dependencies 52 run: \u0026#34;[[ -f package-lock.json || -f npm-shrinkwrap.json ]] \u0026amp;\u0026amp; npm ci || true\u0026#34; 53 - name: Build with Hugo 54 env: 55 HUGO_CACHEDIR: ${{ runner.temp }}/hugo_cache 56 HUGO_ENVIRONMENT: production 57 TZ: America/Los_Angeles 58 run: | 59 hugo \\ 60 --gc \\ 61 --minify \\ 62 --source my-hugo-site \\ 63 --baseURL \u0026#34;${{ steps.pages.outputs.base_url }}/\u0026#34; 64 - name: Upload artifact 65 uses: actions/upload-pages-artifact@v3 66 with: 67 path: ./my-hugo-site/public 68 69 # Deployment job 70 deploy: 71 environment: 72 name: github-pages 73 url: ${{ steps.deployment.outputs.page_url }} 74 runs-on: ubuntu-latest 75 needs: build 76 steps: 77 - name: Deploy to GitHub Pages 78 id: deployment 79 uses: actions/deploy-pages@v4 Build and deployment\nSource: Github Actions Branch: gh-pages Custom domain: uli.heller.cool Sichten: Wie sehen die Actions von uli.heller.cool aus? Idealerweise ist alles \u0026quot;grün\u0026quot;!\nSichten: Wie sieht https://uli.heller.cool aus? Idealerweise ähnlich zur lokalen Sichtung!\nLinks: Host on GitHub Pages Historie 2024-11-21: Erste Version ","link":"https://uli.heller.cool/blog/2024-11-21_hugo-veroeffentlichen-auf-github/","section":"blog","tags":["git","github","hugo"],"title":"Hugo: Veröffentlichen auf Github"},{"body":" Ich verwende Hugo mit dem Theme \u0026quot;mainroad\u0026quot;. Einige Dinge stören mich. Diese sammle ich hier, idealerweise mit Lösungen.\nOffen 2024-11-21_01 - Persönliches Styling. Die Aufmachung muß ein wenig personalisiert werden, damit ich mich \u0026quot;wiederfinde\u0026quot;.\n2024-11-21_03 - Kopf- und Fußzeilen bleiben nicht sichtbar. Wenn ich durch eine längere Seite blättere, dann verschwinden Kopf- und Fußzeilen. Ich würde mir wünschen, dass diese (zumindest auf meinem Arbeitsplatzrechner) dauernd sichtbar sind!\n2024-11-30_02 - LICENSE.txt\n2024-11-30_04 - Fußzeile erweitern um \u0026quot;Edit in Github\u0026quot;\nhttps://discourse.gohugo.io/t/hugo-v0-112-0-new-template-functions/44512 2024-12-02_01 - Inhaltsverzeichnis ein- und ausblendbar\n2024-12-03_01 - Sichten von HugoBlox\n2024-12-03_02 - Sichten von ThomasVölkl\nErstellt mit Hugo und \u0026quot;mainroad\u0026quot; (zunächst) Nutzt Hugo und \u0026quot;clarity\u0026quot; (aktuell) 2024-12-11_01 - Michael Welford\nCustom code blocks in Hugo - mit \u0026quot;Unterschriften\u0026quot; und \u0026quot;Copy\u0026quot; 2024-12-11_02 - Hugo Survival Guide\nBeschreibt viele Hugo-Konzepte 2024-12-11_03 - DecapCMS\nCMS für Hugo (und andere StaticSiteGenerators) 2024-12-11_04 - Tag-Cloud für Hugo\n2024-12-11_05 - Diagramme in Hugo\n2024-12-19_01 - Fehlermeldungen beim Test mit hugo -D -E -F server\n1WARN Raw HTML omitted while rendering \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/content/blog/2024-12-03_jq-nach-csv/index.md\u0026#34;; see https://gohugo.io/getting-started/configuration-markup/#rendererunsafe 2You can suppress this warning by adding the following to your site configuration: 3ignoreLogs = [\u0026#39;warning-goldmark-raw-html\u0026#39;] 2024-12-21_02 - Theme PaperMod\n2024-12-29_01 - Clarity: Logo+Motto oben links\n2024-12-29_02 - Clarity: Home\n2024-12-29_03 - Clarity: Suchen\n2024-12-29_09 - Clarity: Copyright + Lizenz\n2025-02-03_01 - Clarity: Kopieren eines Artikels und Verpacken in Roundcube -\u0026gt; CodeBlöcke sind quasi unsichtbar\nErledigt 2024-11-21_04 - Klären: Was hat es mit den \u0026quot;Categories\u0026quot; und \u0026quot;Tags\u0026quot; auf sich?\nStand 2024-11-23 gibt es diese \u0026quot;Categories\u0026quot;: Git, Hugo, Markdown Stand 2024-11-23 gibt es diese \u0026quot;Tags\u0026quot;: Github Sollte \u0026quot;Tags\u0026quot; eine Obermenge von \u0026quot;Categories\u0026quot; sein? 2024-12-04_01 - Clarity\nChange From Beautifulhugo to Clarity Theme Adding a floating TOC to the Hugo-Clarity theme Organizing page resources 2024-12-21_01 - Kommentare mit Utterances\n2024-11-30_01 - Fußzeile erweitern um Lizenz - wird nicht mehr umgesetzt wegen Wechsel mainroad -\u0026gt; clarity\n./themes/mainroad/layouts/partials/footer_links.html Wertet Site.Menus.footer aus .URL und .Name definieren Links ./themes/mainroad/layouts/partials/footer.html Wertet Site.Params.copyright aus Und Site.Title 2024-12-29_08 - Clarity: Inhaltsverzeichnis - Adding a floating TOC to the Hugo-Clarity theme | No D in Rogers\n2024-12-29_04 - Clarity: Bildbreite\nSiehe Hugo-Clarity: Diverse Kleinprobleme 2024-12-29_05 - Clarity: Textbreite\nSiehe Hugo-Clarity: Diverse Kleinprobleme 2024-12-29_06 - Clarity: Menübreite\nSiehe Hugo-Clarity: Diverse Kleinprobleme 2024-12-29_07 - Clarity: Aktiven Eintrag im Menü markieren\nSiehe Hugo-Clarity: Diverse Kleinprobleme 2024-12-11_01 - More Hugo Tipps, robots.txt\n2024-11-30_03 - Lizenzseite\n2024-12-01_01 - Inhaltsverzeichnis\n2024-11-22_01 - Bilder in den Übersichtseiten nicht sichtbar. Beispiel: \u0026quot;Hugo: Breitenlimitierung aufheben\u0026quot;\nRelative linking in Hugo https://github.com/zoni/obsidian-export/issues/8#issuecomment-774521792 Hugo - relative paths in page bundles Image processing Legt nahe, dass die URL keinen Pfad enthalten darf Klappt leider nicht! Hier gibt es ein paar Testseiten:\nÜbersicht - Bilder fehlen Detailseite - Bilder sind sichtbar 2024-11-21_02 - Breite: Wenn ich das Browser-Fenster sehr breit ziehe, dann erscheint rechts und links ein zunehmend breiter Rahmen. Entspricht aktuell dem Zeitgeist, mich stört es. Ich würde lieber mehr Text sehen!\n2024-11-21_06 - Reihenfolge in Menü und im Recent-Widget unklar\nMenü-Reihenfolge: weight Recent-Reihenfolge: Neueste zuerst 2024-11-21_05 - Klären: Wie passe ich das Menü an? Was erscheint dort? Was nicht?\nDas geht via \u0026quot;Front Matter\u0026quot; in einem Betrag:\n1menu: 2 main: 3 name: FAQ 4# 5# oder 6# 7title: Getting started 8menu: main Geht auch via \u0026quot;_index.md\u0026quot; in einem Verzeichnis!\nHistorie 2025-01-05: Aktualisierung einiger TODOs beim Theme \u0026quot;Clarity\u0026quot; 2024-12-29: Viele TODOs beim Theme \u0026quot;Clarity\u0026quot; 2024-12-21: Kommentare mit Utterances und Theme PaperMod 2024-12-19: Fehlermeldungen beim Test mit hugo -D -E -F server 2024-12-15: TODO bzgl. robots.txt erledigt 2024-12-11: Viele neue TODOs und Links 2024-12-06: Clarity und PageBundles 2024-12-03: Clarity 2024-11-30: Mehr TODOs bzgl. Fusszeile und Lizenz 2024-11-21: Erste Version ","link":"https://uli.heller.cool/articles/hugo-todos/","section":"articles","tags":["hugo"],"title":"Störende Details bei Hugo"},{"body":"Ich bin Uli Heller, männlich und Jahrgang 1965. Ich lebe im Raum Stuttgart, arbeite im IT-Umfeld und interessiere mich dort für alles, was mit Kommunikation zu tun hat. Nutzeroberflächen finde ich eher uninteressant.\nPrivat jogge ich gerne und Fahrradfahren gefällt mir auch!\nDiese Seite habe ich aufgebaut mit Hugo und dem Clarity-Theme (keine Ahnung, wie man \u0026quot;Theme\u0026quot; richtig übersetzt). Früher habe ich für solche Zwecke OctoPress oder Nikola verwendet. Mal sehen, wie Hugo sich bewährt!\nBis Anfang 2025 habe ich das Theme Mainroad verwendet. Clarity bietet einige Vorteile, bspw. Anzeige der voraussichtlichen Lesezeit.\nViele meiner älteren Artikel finden sich auf https://daemons-point.com. Darüber kann auch Kontakt mit mir aufgenommen werden falls technische Unterstützung gewünscht wird. Ich bin immer offen für neue Herausforderungen! Mein beruflicher Kontakt am liebsten wie Email uli.heller@daemons-point.com.\nAuf ein Impressum verzichte ich vorerst. Aus meiner Sicht handelt es sich hier um eine rein private Seite. Falls jemand anderer Ansicht ist, bitte ich um kurze Info. Dann kann ich das Impressum gerne ergänzen!\nHistorie 2025-01-06: Hinweise auf Umstellung Mainroad-\u0026gt;Clarity 2024-11-27: Tippfehler korrigiert und Hinweis auf Region Stuttgart 2024-11-21: Erste Version ","link":"https://uli.heller.cool/about/me/","section":"about","tags":null,"title":"Über mich"},{"body":" Bislang habe ich Octopress benutzt, um meine Artikel und Hinweise zu veröffentlichen. Octopress war mal \u0026quot;der heiße Scheiß\u0026quot;, ist mittlerweile aber ziemlich veraltet.\nViele Leute sind umgestiegen auf Jekyll. Das ist für mich nicht super motivierend, weil\nJekyll auch nicht super gut weiterentwickelt wird Jekyll eine Ruby-Installation voraussetzt und da kenne ich mich nicht aus Hugo scheint sehr einfach zu sein, wird sehr aktiv weiterentwickelt und von vielen Leuten genutzt. Warum nicht?\nAblauf Hugo installieren, Test: hugo version -\u0026gt; hugo v0.136.5-46cc...\nGrundinitialisierung: hugo new site my-hugo-site\nWechseln in's Hugo-Verzeichnis: cd my-hugo-site\nTheme \u0026quot;mainroad\u0026quot; einspielen: git clone https://github.com/vimux/mainroad.git themes/mainroad\nrm -rf themes/mainroad/.git Test mit neuem Theme:\n1echo \u0026#34;theme = \u0026#39;mainroad\u0026#39;\u0026#34; \u0026gt;\u0026gt;hugo.toml 2hugo serve Browser: http://localhost:1313 -\u0026gt; sieht sehr schlicht aus!\nTest mit dem Beispiel:\n1cp -a themes/mainroad/exampleSite/* . 2mv config.toml hugo.toml 3hugo serve 4# Fehlermeldung -\u0026gt; kleinere Korrekturen Browser: http://localhost:1313 -\u0026gt; sieht etwas besser aus!\nErsten Artikel anlegen: hugo new content blog/2024-11-20_start-mit-hugo.md Danach: Artikel erweitern!\nAlles in GIT abspeichern - leere Verzeichnisse erfordern besondere Aufmerksamkeit!\nfind . -type d -empty|xargs -I{} touch {}/.gitkeep git add . git commit -m \u0026quot;Hugo - neu - mainroad\u0026quot; . git push Notizen Grundinitialisierung 1uli@uliip5:~/git/github/uli-heller/uli.heller.cool$ hugo new site my-hugo-site 2Congratulations! Your new Hugo site was created in /home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site. 3 4Just a few more steps... 5 61. Change the current directory to /home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site. 72. Create or install a theme: 8 - Create a new theme with the command \u0026#34;hugo new theme \u0026lt;THEMENAME\u0026gt;\u0026#34; 9 - Or, install a theme from https://themes.gohugo.io/ 103. Edit hugo.toml, setting the \u0026#34;theme\u0026#34; property to the theme name. 114. Create new content with the command \u0026#34;hugo new content \u0026lt;SECTIONNAME\u0026gt;/\u0026lt;FILENAME\u0026gt;.\u0026lt;FORMAT\u0026gt;\u0026#34;. 125. Start the embedded web server with the command \u0026#34;hugo server --buildDrafts\u0026#34;. 13 14See documentation at https://gohugo.io/. Theme \u0026quot;mainroad\u0026quot; einspielen 1uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ git clone https://github.com/vimux/mainroad.git themes/mainroad 2Klone nach \u0026#39;themes/mainroad\u0026#39;... 3remote: Enumerating objects: 2489, done. 4remote: Counting objects: 100% (194/194), done. 5remote: Compressing objects: 100% (118/118), done. 6remote: Total 2489 (delta 96), reused 143 (delta 64), pack-reused 2295 (from 1) 7Empfange Objekte: 100% (2489/2489), 1.61 MiB | 2.44 MiB/s, fertig. 8Löse Unterschiede auf: 100% (1454/1454), fertig. 9 10uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ rm -rf themes/mainroad/.git 11 12uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ git add themes/mainroad/ 13 14uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ git commit -m \u0026#34;Theme \u0026#39;mainroad\u0026#39;\u0026#34; . 15[main 070f948] Theme \u0026#39;mainroad\u0026#39; 16 104 files changed, 14059 insertions(+) 17 create mode 100644 my-hugo-site/themes/mainroad/.browserslistrc 18... Test mit dem Beispiel 1uli@uliip5:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ hugo serve 2WARN deprecated: site config key paginate was deprecated in Hugo v0.128.0 and will be removed in a future release. Use pagination.pagerSize instead. 3Watching for changes in /home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/{archetypes,assets,content,data,i18n,layouts,static,themes} 4Watching for config changes in /home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/hugo.toml 5Start building sites … 6hugo v0.136.5-46cccb021bc6425455f4eec093f5cc4a32f1d12c+extended linux/amd64 BuildDate=2024-10-24T12:26:27Z VendorInfo=gohugoio 7 8ERROR deprecated: .Site.Author was deprecated in Hugo v0.124.0 and will be removed in Hugo 0.137.0. Implement taxonomy \u0026#39;author\u0026#39; or use .Site.Params.Author instead. 9Built in 41 ms 10Error: error building site: logged 1 error(s) Korrektur:\n1 2diff -u themes/mainroad/exampleSite/config.toml hugo.toml 3--- themes/mainroad/exampleSite/config.toml\t2024-11-21 00:08:05.289738324 +0100 4+++ hugo.toml\t2024-11-21 00:21:07.265500676 +0100 5@@ -1,12 +1,12 @@ 6 baseurl = \u0026#34;/\u0026#34; 7 title = \u0026#34;Mainroad\u0026#34; 8 languageCode = \u0026#34;en-us\u0026#34; 9-paginate = \u0026#34;10\u0026#34; # Number of posts per page 10+pagination.pageSize = \u0026#34;10\u0026#34; # Number of posts per page 11 theme = \u0026#34;mainroad\u0026#34; 12 disqusShortname = \u0026#34;\u0026#34; # Enable comments by entering your Disqus shortname 13 googleAnalytics = \u0026#34;\u0026#34; # Enable Google Analytics by entering your tracking id 14 15-[Author] 16+[Params.author] 17 name = \u0026#34;John Doe\u0026#34; 18 bio = \u0026#34;John Doe\u0026#39;s true identity is unknown. Maybe he is a successful blogger or writer. Nobody knows it.\u0026#34; 19 avatar = \u0026#34;img/avatar.png\u0026#34; Ersten Artikel anlegen 1uli@ulicsl:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ hugo new content blog/2024-11-20_start-mit-hugo.md 2Content \u0026#34;/home/uli/git/github/uli-heller/uli.heller.cool/my-hugo-site/content/blog/2024-11-20_start-mit-hugo.md\u0026#34; created Alles in GIT abspeichern 1uli@ulicsl:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ find . -type d -empty|xargs -I{} touch {}/.gitkeep 2 3uli@ulicsl:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ git add . 4 5uli@ulicsl:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ git commit -m \u0026#34;Hugo - neu - mainroad\u0026#34; . 6[hugo-mainroad e89c5c4] Hugo - neu - mainroad 7 9 files changed, 8 insertions(+) 8 create mode 100644 my-hugo-site/archetypes/default.md 9 create mode 100644 my-hugo-site/assets/.gitkeep 10 create mode 100644 my-hugo-site/content/.gitkeep 11... 12 13uli@ulicsl:~/git/github/uli-heller/uli.heller.cool/my-hugo-site$ git push 14Objekte aufzählen: 151, fertig. 15Zähle Objekte: 100% (151/151), fertig. 16Delta-Kompression verwendet bis zu 16 Threads. 17Komprimiere Objekte: 100% (118/118), fertig. 18Schreibe Objekte: 100% (150/150), 235.24 KiB | 2.24 MiB/s, fertig. 19... Historie 2024-11-21: Viele Ergänzungen 2024-11-20: Erste Version ","link":"https://uli.heller.cool/blog/2024-11-20_start-mit-hugo/","section":"blog","tags":["hugo"],"title":"Mein Start mit Hugo"},{"body":" Manchmal würde man gerne leere Verzeichnisse in Git speichern. Beispielsweise dann, wenn ich neu eingerichtete und fast leere Hugo-Sites per Git von einem Rechner zum anderen kopiert werden. Das Erzeugen von neuen Inhalten mit hugo new content blog/new-blog-post.md scheitert mit dem Fehler \u0026quot;Error: no existing content directory configured for this project\u0026quot;.\nHier erkläre ich, wie man das Problem umgeht!\nFehlerbeschreibung Ablauf:\nAuf Rechner A eine Hugo-Site anlegen (hugo new site ...) In Git speichern (git add...; git commit...; git push) Auf Rechner B das Git-Repo clonen (git clone...) Auf Rechner B mit der Hugo-Site arbeiten (hugo new content bog/new-blog-post.md) Der letzte Schritt scheitert mit dem Fehler \u0026quot;Error: no existing content directory configured for this project\u0026quot;.\nWenn man die Hugo-Site auf Rechner B sichtet und mit Rechner A vergleicht, so stellt man fest, dass viele Verzeichnisse fehlen:\nRechner A - ls -1 archetypes assets content data hugo.toml i18n layouts static themes Rechner B - ls -1 archetypes hugo.toml Alle fehlenden Verzeichnisse sind leer. Sie werden von Git nicht gespeichert (=bekanntes Verhalten).\nAbhilfe Damit das besser klappt, muß man auf Rechner A beim Speichern in Git einen Zusatzschritt unternehmen:\nHugo-Site anlegen - Verzeichnis \u0026quot;hugo-site\u0026quot; Zusätzlich - Dummy-Dateien anlegen: find hugo-site -type d -empty|xargs -I{} touch {}/.gitkeep In Git speichern usw. Danach kann das Repo auf Rechner B geclont und dort damit gearbeitet werden.\nHistorie 2024-11-16: Erste Version ","link":"https://uli.heller.cool/blog/2024-11-16_git-leere-verzeichnisse/","section":"blog","tags":["git","hugo"],"title":"Git: Leere Verzeichnisse"},{"body":" Der interne Bereich dient der Ablage von Informationen, die nur für mich persönlich interessant sind. Er ist nicht via Menü oder Links erreichbar und taucht hoffentlich auch nicht bei der Google-Suche auf!\nSichtung interner Bereich Den internen Bereich kann ich wie folgt sichten:\nNavigation auf die Grundseite Anpassen der Adresszeile Anhängen von \u0026quot;/i\u0026quot; Eingabetaste -\u0026gt; interner Bereich wird angezeigt Aufbau interner Bereich content i index.md anleitungen _index.md erstes-dokument.pdf zweites-dokument.pdf content/i/index.md 1Interner Bereich 2================ 3 4- [Anleitungen](anleitungen) content/i/anleitungen/_index.md 1--- 2title: Anleitungen 3description: Diverse Anleitungen zu technischen Geräten 4#menu: main 5#weight: 2 6--- 7 8Bose Ultra Open Earbuds 9----------------------- 10 11- [Bedienungsanleitung (deutsch) 2024-11](889371_OG_ULT-HEADPHONEOPN_de.pdf) 12- [Kurzanleitung (mehrsprachig) 2024-11](886741_QSG_CMWB-ULT-CASEPWR_ml.pdf) 13 14Openshokz Openrun Pro 2 15----------------------- 16 17- [Bedienungsanleitung (deutsch) 2024-11](OpenRun_Pro_2_Benutzerhandbuch-DE.pdf) Historie 2024-11-01: Erste Version ","link":"https://uli.heller.cool/blog/2024-11-01_interner-bereich/","section":"blog","tags":["hugo"],"title":"Hugo: Interner Bereich"},{"body":"Ulis Welt ... da läuft was! (c) 2024 by Uli Heller ist lizenziert unter CC BY-SA 4.0 mit KI-Beschränkungen\nUlis Welt ... da läuft was! (c) 2024 by Uli Heller is licensed under CC BY-SA 4.0 with AI restrictions\nKI-Beschränkungen Ich möchte nicht, dass die von mir veröffentlichten Texte für das Anlernen von KI-Modellen oder ähnliches verwendet werden! Details finden sich hier: Lizenzen.\nIn maschinenlesbarer Form: robots.json.\nAI-Restrictions I do not want my content to be used for AI models or similar usages. For details, look here: Lizenzen (in German).\nIn machine readable format: robots.json.\nHistorie 2024-11-01: Erste Version ","link":"https://uli.heller.cool/license/","section":"","tags":null,"title":"Lizenz"},{"body":"The main purpose of this article is to make sure that all basic HTML Elements are decorated with CSS so as to not miss any possible elements when creating new themes for Hugo.\nHeadings Let's start with all possible headings. The HTML \u0026lt;h1\u0026gt;—\u0026lt;h6\u0026gt; elements represent six levels of section headings. \u0026lt;h1\u0026gt; is the highest section level and \u0026lt;h6\u0026gt; is the lowest.\nHeading 1 Heading 2 Heading 3 Heading 4 Heading 5 Heading 6 Paragraph According to the HTML5 specification by W3C, HTML documents consist of a tree of elements and text. Each element is denoted in the source by a start tag, such as \u0026lt;body\u0026gt;, and an end tag, such as \u0026lt;/body\u0026gt;. (Certain start tags and end tags can in certain cases be omitted and are implied by other tags.)\nElements can have attributes, which control how the elements work. For example, hyperlink are formed using the a element and its href attribute.\nList Types Ordered List First item Second item Third item Unordered List List item Another item And another item Nested list First item Second item Second item First subitem Second item second subitem Second item Second subitem First sub-subitem Second item Second subitem Second sub-subitem Second item Second subitem Third sub-subitem Second item Third subitem Second item Third subitem First sub-subitem Second item Third subitem Second sub-subitem Second item Third subitem Third sub-subitem Third item Definition List HTML also supports definition lists.\nBlanco tequila The purest form of the blue agave spirit... Reposado tequila Typically aged in wooden barrels for between two and eleven months... Blockquotes The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a footer or cite element, and optionally with in-line changes such as annotations and abbreviations.\nQuoted text. This line is part of the same quote. Also you can put Markdown into a blockquote.\nBlockquote with a citation.\nMy goal wasn't to make a ton of money. It was to build good computers. I only started the company when I realized I could be an engineer forever.\n— Steve Wozniak According to Mozilla's website, Firefox 1.0 was released in 2004 and became a big success.\nTables Tables aren't part of the core Markdown spec, but Hugo supports them.\nID Make Model Year 1 Honda Accord 2009 2 Toyota Camry 2012 3 Hyundai Elantra 2010 Colons can be used to align columns.\nTables Are Cool align: left align: center align: right align: left align: center align: right align: left align: center align: right You can also use inline Markdown.\nInline Markdown In Table italics bold strikethrough code Code 1\u0026lt;!DOCTYPE html\u0026gt; 2\u0026lt;html lang=\u0026#34;en\u0026#34;\u0026gt; 3\u0026lt;head\u0026gt; 4 \u0026lt;meta charset=\u0026#34;UTF-8\u0026#34;\u0026gt; 5 \u0026lt;title\u0026gt;Example HTML5 Document\u0026lt;/title\u0026gt; 6\u0026lt;/head\u0026gt; 7\u0026lt;body\u0026gt; 8 \u0026lt;p\u0026gt;Test\u0026lt;/p\u0026gt; 9\u0026lt;/body\u0026gt; 10\u0026lt;/html\u0026gt; 1\u0026lt;!DOCTYPE html\u0026gt; 2\u0026lt;html lang=\u0026#34;en\u0026#34;\u0026gt; 3\u0026lt;head\u0026gt; 4 \u0026lt;meta charset=\u0026#34;UTF-8\u0026#34;\u0026gt; 5 \u0026lt;title\u0026gt;Example HTML5 Document\u0026lt;/title\u0026gt; 6\u0026lt;/head\u0026gt; 7\u0026lt;body\u0026gt; 8 \u0026lt;p\u0026gt;Test\u0026lt;/p\u0026gt; 9\u0026lt;/body\u0026gt; 10\u0026lt;/html\u0026gt; Other stuff — abbr, sub, sup, kbd, etc. GIF is a bitmap image format.\nH2O\nC6H12O6\nXn + Yn = Zn\nPress X to win. Or press CTRL+ALT+F to show FPS counter.\nAs a unit of information in information theory, the bit has alternatively been called a shannon, named after Claude Shannon, the founder of field of information theory.\n","link":"https://uli.heller.cool/hugo-docs/basic-elements/","section":"hugo-docs","tags":["hugo","markdown"],"title":"Basic Markdown/HTML Elements"},{"body":"","link":"https://uli.heller.cool/tags/markdown/","section":"tags","tags":null,"title":"Markdown"},{"body":"","link":"https://uli.heller.cool/categories/markdown/","section":"categories","tags":null,"title":"Markdown"},{"body":"Hugo uses the excellent Go html/template library for its template engine. It is an extremely lightweight engine that provides a very small amount of logic. In our experience that it is just the right amount of logic to be able to create a good static website. If you have used other template systems from different languages or frameworks you will find a lot of similarities in Go templates.\nThis document is a brief primer on using Go templates. The Go docs provide more details.\nIntroduction to Go Templates Go templates provide an extremely simple template language. It adheres to the belief that only the most basic of logic belongs in the template or view layer. One consequence of this simplicity is that Go templates parse very quickly.\nA unique characteristic of Go templates is they are content aware. Variables and content will be sanitized depending on the context of where they are used. More details can be found in the Go docs.\nBasic Syntax Golang templates are HTML files with the addition of variables and functions.\nGo variables and functions are accessible within {{ }}\nAccessing a predefined variable \u0026quot;foo\u0026quot;:\n{{ foo }} Parameters are separated using spaces\nCalling the add function with input of 1, 2:\n{{ add 1 2 }} Methods and fields are accessed via dot notation\nAccessing the Page Parameter \u0026quot;bar\u0026quot;\n{{ .Params.bar }} Parentheses can be used to group items together\n{{ if or (isset .Params \u0026quot;alt\u0026quot;) (isset .Params \u0026quot;caption\u0026quot;) }} Caption {{ end }} Variables Each Go template has a struct (object) made available to it. In hugo each template is passed either a page or a node struct depending on which type of page you are rendering. More details are available on the variables page.\nA variable is accessed by referencing the variable name.\n\u0026lt;title\u0026gt;{{ .Title }}\u0026lt;/title\u0026gt; Variables can also be defined and referenced.\n{{ $address := \u0026quot;123 Main St.\u0026quot;}} {{ $address }} Functions Go template ship with a few functions which provide basic functionality. The Go template system also provides a mechanism for applications to extend the available functions with their own. Hugo template functions provide some additional functionality we believe are useful for building websites. Functions are called by using their name followed by the required parameters separated by spaces. Template functions cannot be added without recompiling hugo.\nExample:\n{{ add 1 2 }} Includes When including another template you will pass to it the data it will be able to access. To pass along the current context please remember to include a trailing dot. The templates location will always be starting at the /layout/ directory within Hugo.\nExample:\n{{ template \u0026quot;chrome/header.html\u0026quot; . }} Logic Go templates provide the most basic iteration and conditional logic.\nIteration Just like in Go, the Go templates make heavy use of range to iterate over a map, array or slice. The following are different examples of how to use range.\nExample 1: Using Context\n{{ range array }} {{ . }} {{ end }} Example 2: Declaring value variable name\n{{range $element := array}} {{ $element }} {{ end }} Example 2: Declaring key and value variable name\n{{range $index, $element := array}} {{ $index }} {{ $element }} {{ end }} Conditionals If, else, with, or, \u0026amp; and provide the framework for handling conditional logic in Go Templates. Like range, each statement is closed with end.\nGo Templates treat the following values as false:\nfalse 0 any array, slice, map, or string of length zero Example 1: If\n{{ if isset .Params \u0026quot;title\u0026quot; }}\u0026lt;h4\u0026gt;{{ index .Params \u0026quot;title\u0026quot; }}\u0026lt;/h4\u0026gt;{{ end }} Example 2: If -\u0026gt; Else\n{{ if isset .Params \u0026quot;alt\u0026quot; }} {{ index .Params \u0026quot;alt\u0026quot; }} {{else}} {{ index .Params \u0026quot;caption\u0026quot; }} {{ end }} Example 3: And \u0026amp; Or\n{{ if and (or (isset .Params \u0026quot;title\u0026quot;) (isset .Params \u0026quot;caption\u0026quot;)) (isset .Params \u0026quot;attr\u0026quot;)}} Example 4: With\nAn alternative way of writing \u0026quot;if\u0026quot; and then referencing the same value is to use \u0026quot;with\u0026quot; instead. With rebinds the context . within its scope, and skips the block if the variable is absent.\nThe first example above could be simplified as:\n{{ with .Params.title }}\u0026lt;h4\u0026gt;{{ . }}\u0026lt;/h4\u0026gt;{{ end }} Example 5: If -\u0026gt; Else If\n{{ if isset .Params \u0026quot;alt\u0026quot; }} {{ index .Params \u0026quot;alt\u0026quot; }} {{ else if isset .Params \u0026quot;caption\u0026quot; }} {{ index .Params \u0026quot;caption\u0026quot; }} {{ end }} Pipes One of the most powerful components of Go templates is the ability to stack actions one after another. This is done by using pipes. Borrowed from unix pipes, the concept is simple, each pipeline's output becomes the input of the following pipe.\nBecause of the very simple syntax of Go templates, the pipe is essential to being able to chain together function calls. One limitation of the pipes is that they only can work with a single value and that value becomes the last parameter of the next pipeline.\nA few simple examples should help convey how to use the pipe.\nExample 1 :\n{{ if eq 1 1 }} Same {{ end }} is the same as\n{{ eq 1 1 | if }} Same {{ end }} It does look odd to place the if at the end, but it does provide a good illustration of how to use the pipes.\nExample 2 :\n{{ index .Params \u0026quot;disqus_url\u0026quot; | html }} Access the page parameter called \u0026quot;disqus_url\u0026quot; and escape the HTML.\nExample 3 :\n{{ if or (or (isset .Params \u0026quot;title\u0026quot;) (isset .Params \u0026quot;caption\u0026quot;)) (isset .Params \u0026quot;attr\u0026quot;)}} Stuff Here {{ end }} Could be rewritten as\n{{ isset .Params \u0026quot;caption\u0026quot; | or isset .Params \u0026quot;title\u0026quot; | or isset .Params \u0026quot;attr\u0026quot; | if }} Stuff Here {{ end }} Context (aka. the dot) The most easily overlooked concept to understand about Go templates is that {{ . }} always refers to the current context. In the top level of your template this will be the data set made available to it. Inside of a iteration it will have the value of the current item. When inside of a loop the context has changed. . will no longer refer to the data available to the entire page. If you need to access this from within the loop you will likely want to set it to a variable instead of depending on the context.\nExample:\n{{ $title := .Site.Title }} {{ range .Params.tags }} \u0026lt;li\u0026gt; \u0026lt;a href=\u0026quot;{{ $baseurl }}/tags/{{ . | urlize }}\u0026quot;\u0026gt;{{ . }}\u0026lt;/a\u0026gt; - {{ $title }} \u0026lt;/li\u0026gt; {{ end }} Notice how once we have entered the loop the value of {{ . }} has changed. We have defined a variable outside of the loop so we have access to it from within the loop.\nHugo Parameters Hugo provides the option of passing values to the template language through the site configuration (for sitewide values), or through the meta data of each specific piece of content. You can define any values of any type (supported by your front matter/config format) and use them however you want to inside of your templates.\nUsing Content (page) Parameters In each piece of content you can provide variables to be used by the templates. This happens in the front matter.\nAn example of this is used in this documentation site. Most of the pages benefit from having the table of contents provided. Sometimes the TOC just doesn't make a lot of sense. We've defined a variable in our front matter of some pages to turn off the TOC from being displayed.\nHere is the example front matter:\n1--- 2title: \u0026#34;Permalinks\u0026#34; 3date: \u0026#34;2013-11-18\u0026#34; 4aliases: 5 - \u0026#34;/doc/permalinks/\u0026#34; 6groups: [\u0026#34;extras\u0026#34;] 7groups_weight: 30 8notoc: true 9--- Here is the corresponding code inside of the template:\n{{ if not .Params.notoc }} \u0026lt;div id=\u0026quot;toc\u0026quot; class=\u0026quot;well col-md-4 col-sm-6\u0026quot;\u0026gt; {{ .TableOfContents }} \u0026lt;/div\u0026gt; {{ end }} Using Site (config) Parameters In your top-level configuration file (eg, config.yaml) you can define site parameters, which are values which will be available to you in chrome.\nFor instance, you might declare:\n1params: 2 CopyrightHTML: \u0026#34;Copyright \u0026amp;#xA9; 2013 John Doe. All Rights Reserved.\u0026#34; 3 TwitterUser: \u0026#34;spf13\u0026#34; 4 SidebarRecentLimit: 5 Within a footer layout, you might then declare a \u0026lt;footer\u0026gt; which is only provided if the CopyrightHTML parameter is provided, and if it is given, you would declare it to be HTML-safe, so that the HTML entity is not escaped again. This would let you easily update just your top-level config file each January 1st, instead of hunting through your templates.\n1{{if .Site.Params.CopyrightHTML}}\u0026lt;footer\u0026gt; 2\u0026lt;div class=\u0026#34;text-center\u0026#34;\u0026gt;{{.Site.Params.CopyrightHTML | safeHtml}}\u0026lt;/div\u0026gt; 3\u0026lt;/footer\u0026gt;{{end}} An alternative way of writing the \u0026quot;if\u0026quot; and then referencing the same value is to use \u0026quot;with\u0026quot; instead. With rebinds the context . within its scope, and skips the block if the variable is absent:\n1{{with .Site.Params.TwitterUser}}\u0026lt;span class=\u0026#34;twitter\u0026#34;\u0026gt; 2\u0026lt;a href=\u0026#34;https://twitter.com/{{.}}\u0026#34; rel=\u0026#34;author\u0026#34;\u0026gt; 3\u0026lt;img src=\u0026#34;/images/twitter.png\u0026#34; width=\u0026#34;48\u0026#34; height=\u0026#34;48\u0026#34; title=\u0026#34;Twitter: {{.}}\u0026#34; 4alt=\u0026#34;Twitter\u0026#34;\u0026gt;\u0026lt;/a\u0026gt; 5\u0026lt;/span\u0026gt;{{end}} Finally, if you want to pull \u0026quot;magic constants\u0026quot; out of your layouts, you can do so, such as in this example:\n1\u0026lt;nav class=\u0026#34;recent\u0026#34;\u0026gt; 2 \u0026lt;h1\u0026gt;Recent Posts\u0026lt;/h1\u0026gt; 3 \u0026lt;ul\u0026gt;{{range first .Site.Params.SidebarRecentLimit .Site.Recent}} 4 \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;{{.RelPermalink}}\u0026#34;\u0026gt;{{.Title}}\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; 5 {{end}}\u0026lt;/ul\u0026gt; 6\u0026lt;/nav\u0026gt; ","link":"https://uli.heller.cool/hugo-docs/hugo-template-primer/","section":"hugo-docs","tags":["hugo"],"title":"(Hu)go Template Primer"},{"body":"Step 1. Install Hugo Go to Hugo releases and download the appropriate version for your OS and architecture.\nSave it somewhere specific as we will be using it in the next step.\nMore complete instructions are available at Install Hugo\nStep 2. Build the Docs Hugo has its own example site which happens to also be the documentation site you are reading right now.\nFollow the following steps:\nClone the Hugo repository Go into the repo Run hugo in server mode and build the docs Open your browser to http://localhost:1313 Corresponding pseudo commands:\ngit clone https://github.com/spf13/hugo cd hugo /path/to/where/you/installed/hugo server --source=./docs \u0026gt; 29 pages created \u0026gt; 0 tags index created \u0026gt; in 27 ms \u0026gt; Web Server is available at http://localhost:1313 \u0026gt; Press ctrl+c to stop Once you've gotten here, follow along the rest of this page on your local build.\nStep 3. Change the docs site Stop the Hugo process by hitting Ctrl+C.\nNow we are going to run hugo again, but this time with hugo in watch mode.\n/path/to/hugo/from/step/1/hugo server --source=./docs --watch \u0026gt; 29 pages created \u0026gt; 0 tags index created \u0026gt; in 27 ms \u0026gt; Web Server is available at http://localhost:1313 \u0026gt; Watching for changes in /Users/spf13/Code/hugo/docs/content \u0026gt; Press ctrl+c to stop Open your favorite editor and change one of the source content pages. How about changing this very file to fix the typo. How about changing this very file to fix the typo.\nContent files are found in docs/content/. Unless otherwise specified, files are located at the same relative location as the url, in our case docs/content/overview/quickstart.md.\nChange and save this file.. Notice what happened in your terminal.\n\u0026gt; Change detected, rebuilding site \u0026gt; 29 pages created \u0026gt; 0 tags index created \u0026gt; in 26 ms Refresh the browser and observe that the typo is now fixed.\nNotice how quick that was. Try to refresh the site before it's finished building. I double dare you. Having nearly instant feedback enables you to have your creativity flow without waiting for long builds.\nStep 4. Have fun The best way to learn something is to play with it.\n","link":"https://uli.heller.cool/hugo-docs/getting-started-with-hugo/","section":"hugo-docs","tags":["hugo"],"title":"Getting Started with Hugo"},{"body":"JIB-Projekt\n1./gradlew jibBuildTar lädt das Basisimage herunter und speichert das \u0026quot;neue\u0026quot; Image unter \u0026quot;build/jib-image.tar\u0026quot;.\nWiederholte Ausführung geht \u0026quot;schnell\u0026quot;.\nWo wird das Basisimage zwischengespeichert?\n1uli@uliip5:~/git/github/uli-heller/java-example-jib$ find . -size +40M 2./build/jib-image.tar 3uli@uliip5:~/git/github/uli-heller/java-example-jib$ find ~/.gradle -size +40M 4/home/uli/.gradle/caches/modules-2/files-2.1/org.rocksdb/rocksdbjni/7.9.2/6409b667493149191b09fe1fce94bada6096a3e9/rocksdbjni-7.9.2.jar 5/home/uli/.gradle/wrapper/dists/gradle-8.12-bin/cetblhg4pflnnks72fxwobvgv/gradle-8.12/lib/kotlin-compiler-embeddable-2.0.21.jar 6/home/uli/.gradle/wrapper/dists/gradle-8.11.1-bin/bpt9gzteqjrbo1mjrsomdt32c/gradle-8.11.1/lib/kotlin-compiler-embeddable-2.0.20.jar 7uli@uliip5:~/git/github/uli-heller/java-example-jib$ find ~/.cache -size +40M 8/home/uli/.cache/google-cloud-tools-java/jib/layers/587b49ab5385c6f5be0e6991c10019ab858a1af9825c21ccdda057797d644f80/99e3c800615e51a23ebb5c4c7982a1d5288504a1ccef4e6a9b78930b67b791d6 9/home/uli/.cache/trivy/java-db/trivy-java.db 10/home/uli/.cache/trivy/db/trivy.db Also: In \u0026quot;/home/uli/.cache/google-cloud-tools-java/jib/layers\u0026quot;\nErste Erzeugung des Container-Images 1java-example-jib$ ./gradlew --console=plain jibBuildTar 2\u0026gt; Task :compileJava 3\u0026gt; Task :processResources NO-SOURCE 4\u0026gt; Task :classes 5 6\u0026gt; Task :jibBuildTar 7Tagging image with generated image reference java-example-jib:0.0.2. If you\u0026#39;d like to specify a different tag, you can set the jib.to.image parameter in your build.gradle, or use the --image=\u0026lt;MY IMAGE\u0026gt; commandline flag. 8 9Containerizing application to file at \u0026#39;/home/uli/git/github/uli-heller/java-example-jib/build/jib-image.tar\u0026#39;... 10Base image \u0026#39;eclipse-temurin:17-jre\u0026#39; does not use a specific image digest - build may not be reproducible 11Getting manifest for base image eclipse-temurin:17-jre... 12Building dependencies layer... 13Building snapshot dependencies layer... 14Building classes layer... 15Building jvm arg files layer... 16The base image requires auth. Trying again for eclipse-temurin:17-jre... 17Using base image with digest: sha256:38e0afc86a10bf4cadbf1586fb617b3a9a4d09c9a0be882e29ada4ed0895fc84 18Container entrypoint set to [java, -cp, @/app/jib-classpath-file, Main] 19Building image to tar file... 20 21Built image tarball at /home/uli/git/github/uli-heller/java-example-jib/build/jib-image.tar 22 23BUILD SUCCESSFUL in 31s 242 actionable tasks: 1 executed, 1 up-to-date 1java-example-jib$ ./gradlew --console=plain jibBuildTar 2\u0026gt; Task :compileJava UP-TO-DATE 3\u0026gt; Task :processResources NO-SOURCE 4\u0026gt; Task :classes UP-TO-DATE 5\u0026gt; Task :jibBuildTar UP-TO-DATE 6 7BUILD SUCCESSFUL in 741ms 82 actionable tasks: 2 up-to-date 1java-example-jib$ rm build/jib-image.tar 2java-example-jib$ ./gradlew --console=plain jibBuildTar 3\u0026gt; Task :compileJava UP-TO-DATE 4\u0026gt; Task :processResources NO-SOURCE 5\u0026gt; Task :classes UP-TO-DATE 6 7\u0026gt; Task :jibBuildTar 8Tagging image with generated image reference java-example-jib:0.0.2. If you\u0026#39;d like to specify a different tag, you can set the jib.to.image parameter in your build.gradle, or use the --image=\u0026lt;MY IMAGE\u0026gt; commandline flag. 9 10Containerizing application to file at \u0026#39;/home/uli/git/github/uli-heller/java-example-jib/build/jib-image.tar\u0026#39;... 11Base image \u0026#39;eclipse-temurin:17-jre\u0026#39; does not use a specific image digest - build may not be reproducible 12Getting manifest for base image eclipse-temurin:17-jre... 13Building dependencies layer... 14Building snapshot dependencies layer... 15Building classes layer... 16Building jvm arg files layer... 17The base image requires auth. Trying again for eclipse-temurin:17-jre... 18Using base image with digest: sha256:38e0afc86a10bf4cadbf1586fb617b3a9a4d09c9a0be882e29ada4ed0895fc84 19 20Container entrypoint set to [java, -cp, @/app/jib-classpath-file, Main] 21Building image to tar file... 22 23Built image tarball at /home/uli/git/github/uli-heller/java-example-jib/build/jib-image.tar 24 25BUILD SUCCESSFUL in 5s 262 actionable tasks: 1 executed, 1 up-to-date Probleme Read timed out 1java-example-jib$ ./gradlew --console=plain jibBuildTar 2\u0026gt; Task :compileJava 3\u0026gt; Task :processResources NO-SOURCE 4\u0026gt; Task :classes 5 6\u0026gt; Task :jibBuildTar 7Tagging image with generated image reference java-example-jib:0.0.2. If you\u0026#39;d like to specify a different tag, you can set the jib.to.image parameter in your build.gradle, or use the --image=\u0026lt;MY IMAGE\u0026gt; commandline flag. 8 9Containerizing application to file at \u0026#39;/home/uli/git/github/uli-heller/java-example-jib/build/jib-image.tar\u0026#39;... 10Base image \u0026#39;eclipse-temurin:17-jre\u0026#39; does not use a specific image digest - build may not be reproducible 11Getting manifest for base image eclipse-temurin:17-jre... 12Building dependencies layer... 13Building snapshot dependencies layer... 14Building classes layer... 15Building jvm arg files layer... 16The base image requires auth. Trying again for eclipse-temurin:17-jre... 17Using base image with digest: sha256:38e0afc86a10bf4cadbf1586fb617b3a9a4d09c9a0be882e29ada4ed0895fc84 18I/O error for image [registry-1.docker.io/library/eclipse-temurin]: 19 java.net.SocketTimeoutException 20 Read timed out 21I/O error for image [registry-1.docker.io/library/eclipse-temurin]: 22 java.net.SocketTimeoutException 23 Read timed out 24 25\u0026gt; Task :jibBuildTar FAILED 26 27FAILURE: Build failed with an exception. 28 29* What went wrong: 30Execution failed for task \u0026#39;:jibBuildTar\u0026#39;. 31\u0026gt; com.google.cloud.tools.jib.plugins.common.BuildStepsExecutionException: Read timed out 32 33* Try: 34\u0026gt; Run with --stacktrace option to get the stack trace. 35\u0026gt; Run with --info or --debug option to get more log output. 36\u0026gt; Run with --scan to get full insights. 37\u0026gt; Get more help at https://help.gradle.org. 38 39BUILD FAILED in 38s 402 actionable tasks: 2 executed Abhilfe: Wiederholen!\n","link":"https://uli.heller.cool/blog/2025-01-31_gradle-jib-zwischenspeicher/","section":"blog","tags":null,"title":""},{"body":"Create 1# Create credential parameters 2echo credential challenge | openssl sha256 -binary | base64 \u0026gt; cred_param 3echo relying party \u0026gt;\u0026gt; cred_param 4echo user name \u0026gt;\u0026gt; cred_param 5dd if=/dev/urandom bs=1 count=32 | base64 \u0026gt;\u0026gt; cred_param 6 7# Make credential on device and verify it 8fido2-cred -M -i cred_param /dev/hidraw5 | fido2-cred -V -o cred Output:\n1. client data hash (base64 blob); 2. relying party id (UTF-8 string); 3. credential format (UTF-8 string); 4. authenticator data (base64 blob); 5. credential id (base64 blob); 6. attestation signature (base64 blob); 7. attestation certificate, if present (base64 blob). 8. the credential's associated 32-byte symmetric key (“largeBlobKey”), if present (base64 blob). PoC of using FIDO2 hmac-secret with a YubiKey 1# https://github.com/trezor/trezor-firmware/blob/master/tests/fido_tests/libfido2/hmac-secret.sh 2 3# DEVICE=$(fido2-token -L | cut -d : -f 1) 4DEVICE=$(fido2-token -L | cut -d : -f 1-2) 5 6if [ -z \u0026#34;$DEVICE\u0026#34; ] ; then 7 echo \u0026#34;No FIDO2 token found\u0026#34; 8 exit 1 9fi 10 11# taken from https://github.com/Yubico/libfido2/issues/58 12 13echo credential challenge | openssl sha256 -binary | base64 \u0026gt; cred_param 14echo relying party \u0026gt;\u0026gt; cred_param 15echo user name \u0026gt;\u0026gt; cred_param 16dd if=/dev/urandom bs=1 count=32 | base64 \u0026gt;\u0026gt; cred_param 17fido2-cred -M -h -i cred_param \u0026#34;$DEVICE\u0026#34; | fido2-cred -V -h -o cred 18 19# taken from https://github.com/Yubico/libfido2/issues/58 20 21echo assertion challenge | openssl sha256 -binary | base64 \u0026gt; assert_param 22echo relying party \u0026gt;\u0026gt; assert_param 23head -1 cred \u0026gt;\u0026gt; assert_param 24tail -n +2 cred \u0026gt; pubkey 25#dd if=/dev/urandom bs=1 count=64 | base64 -w0 \u0026gt;\u0026gt; assert_param # hmac salt 26dd if=/dev/urandom bs=1 count=64 | base64 \u0026gt;\u0026gt; assert_param # hmac salt 27fido2-assert -G -h -i assert_param \u0026#34;$DEVICE\u0026#34; \u0026gt; hmac_assert 28fido2-assert -V -h -i hmac_assert pubkey es256 29tail -1 hmac_assert | base64 -d | xxd # hmac secret ","link":"https://uli.heller.cool/blog/2026-03-21_fido2-cred/fido2-cred/","section":"blog","tags":null,"title":""},{"body":"2024-11-22_01 - Bilder in den Übersichtseiten nicht sichtbar Bild im gleichen Verzeichnis:\nBild in einem Unterverzeichnis:\n","link":"https://uli.heller.cool/tests/2024-11-22_01-relative-links-to-images/","section":"tests","tags":null,"title":""},{"body":"Kopfhörer Bose Ultra Open Earbuds Bedienungsanleitung (deutsch) 2024-11 Download Kurzanleitung (mehrsprachig) 2024-11 Download Openshokz OpenRun Pro 2 Bedienungsanleitung (deutsch) 2024-11 Download Openshokz OpenFit Bedienungsanleitung (deutsch) 2024-11 Download Openshokz OpenRun Pro Bedienungsanleitung (deutsch) 2024-11 Download Navi TomTom Go 6100 Bedienungsanleitung (deutch) 2025-07-22 Download ","link":"https://uli.heller.cool/i/anleitungen/","section":"i","tags":null,"title":"Anleitungen"},{"body":"","link":"https://uli.heller.cool/series/","section":"series","tags":null,"title":"Series"},{"body":"","link":"https://uli.heller.cool/tests/","section":"tests","tags":null,"title":"Tests"}]