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

<channel>
	<title>linux | Learn C Games Programming Blog</title>
	<atom:link href="https://learncgames.com/category/linux/feed/" rel="self" type="application/rss+xml" />
	<link>https://learncgames.com</link>
	<description>A blog about C, programming games and my ebook(s).</description>
	<lastBuildDate>Mon, 15 Dec 2025 11:13:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://learncgames.com/wp-content/uploads/2020/03/cropped-favicon-32x32.png</url>
	<title>linux | Learn C Games Programming Blog</title>
	<link>https://learncgames.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">181446779</site>	<item>
		<title>Linux challenges with the Flutter game</title>
		<link>https://learncgames.com/linux-challenges-with-the-flutter-game/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=linux-challenges-with-the-flutter-game</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Mon, 15 Dec 2025 11:11:59 +0000</pubDate>
				<category><![CDATA[Flutter]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Dart]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3482</guid>

					<description><![CDATA[<p>The architecture of this is all Flutter and Dart running on a Ubuntu Linux box. There are two pure Dart programs- one to create the game setup and one to do the processing. The first is run manually, the second by crontab. Then there&#8217;s the Flutter web app. The Flutter web app has to read [&#8230;]</p>
The post <a href="https://learncgames.com/linux-challenges-with-the-flutter-game/">Linux challenges with the Flutter game</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<figure id="attachment_3483" aria-describedby="caption-attachment-3483" style="width: 500px" class="wp-caption alignleft"><img fetchpriority="high" decoding="async" class="wp-image-3483 size-full" src="https://learncgames.com/wp-content/uploads/2025/12/tuxandFlutter.png" alt="Tux and Flutter having a tussle" width="500" height="273" srcset="https://learncgames.com/wp-content/uploads/2025/12/tuxandFlutter.png 500w, https://learncgames.com/wp-content/uploads/2025/12/tuxandFlutter-300x164.png 300w" sizes="(max-width: 500px) 100vw, 500px" /><figcaption id="caption-attachment-3483" class="wp-caption-text">Generated by Gemini</figcaption></figure>
<p>The architecture of this is all Flutter and Dart running on a Ubuntu Linux box. There are two pure Dart programs- one to create the game setup and one to do the processing. The first is run manually, the second by crontab. Then there&#8217;s the Flutter web app.</p>
<p>The Flutter web app has to read and write files from the file system which of course it can&#8217;t do directly. I&#8217;ve created a backend of sorts using PHP.  There&#8217;s an API; it works but not without issues. If you&#8217;re calling a PHP script from a Flutter app, what is the URL?  It depends.</p>
<p>Say the URL is /file?params where I&#8217;ve modified .htaccess to pass /file urls onto a PHP script.</p>
<p>If I want to test this on the box in a browser I have to call <em>localhost/file?params</em> but in a Dart program running on the box it just calls<em> /file?params</em>.</p>
<p>The next problem is where are the game files stored. The setup program doesn&#8217;t really care. Any location will do so long as it doesn&#8217;t need to run elevated.  But the web app is limited to /var/www/html &#8211; it&#8217;s running under Apache on a linux box. In the end I created a folder under /var/www/game and each game is stored under there. PHP can read mostly anywhere, not just in /var/www/html and this provide a little extra security.</p>
<p>However there&#8217;s the not-so slight issue of permissions. The setup program runs under my login &#8211; call it <em>user</em>. So files are created owned by <em>user</em> <em>user</em>. The web app runs under <em>www-data</em> so to keep things simple, I&#8217;ve set permissions to <em>user:www-data</em> so both can access it. It&#8217;s a bit of a faff.</p>
<p>Here&#8217;s a tip. If you are developing a Flutter web app, develop it on Linux and do development as a Linux app. It&#8217;s far quicker building and launching a Linux app than it is the web app.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>The post <a href="https://learncgames.com/linux-challenges-with-the-flutter-game/">Linux challenges with the Flutter game</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3482</post-id>	</item>
		<item>
		<title>Great mysteries &#8211; number 1</title>
		<link>https://learncgames.com/great-mysteries-number-1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=great-mysteries-number-1</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Thu, 28 Aug 2025 08:37:45 +0000</pubDate>
				<category><![CDATA[bugs]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Hyper-V]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3453</guid>

					<description><![CDATA[<p>I run Ubuntu in a hyper-V session.  It works very well and handy for getting screenshots. I&#8217;ve been using a 24.04 LTS for a while and decided I needed another one to test CyberPanel. i already have Webmin on my main one so wanted a clean Ubuntu so as not to mess Webmin.  It took [&#8230;]</p>
The post <a href="https://learncgames.com/great-mysteries-number-1/">Great mysteries – number 1</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="alignleft size-large wp-image-3454" src="https://learncgames.com/wp-content/uploads/2025/08/hyper-v_issue-1024x579.png" alt="Hyper-v that refuses to become fullscreen!" width="1024" height="579" srcset="https://learncgames.com/wp-content/uploads/2025/08/hyper-v_issue-1024x579.png 1024w, https://learncgames.com/wp-content/uploads/2025/08/hyper-v_issue-300x170.png 300w, https://learncgames.com/wp-content/uploads/2025/08/hyper-v_issue-768x434.png 768w, https://learncgames.com/wp-content/uploads/2025/08/hyper-v_issue-1536x869.png 1536w, https://learncgames.com/wp-content/uploads/2025/08/hyper-v_issue.png 1910w" sizes="(max-width: 1024px) 100vw, 1024px" />I run Ubuntu in a hyper-V session.  It works very well and handy for getting screenshots. I&#8217;ve been using a 24.04 LTS for a while and decided I needed another one to test CyberPanel. i already have Webmin on my main one so wanted a clean Ubuntu so as not to mess Webmin.  It took ten minutes to setup then another 20 minutes to install 300+ updates.</p>
<p>Then I edited Grub to give me a fullscreen- 1920 x 1080.  You just edit /etc/default/grub with an editor run under sudo. I use Gedit but nano will do. Just change the line to this:</p>
<pre>GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video=hyperv_fb:1920x1080"</pre>
<p>followed by</p>
<pre>sudo update-grub</pre>
<p>and that should be it. Only it didn&#8217;t work in my new Ubuntu 24.04 LTS VM. I installed ifconfig from net-tools, connected to it from my Windows PC and copied grub across. I did the same with my older 24.04 LTS VM and compared the two grub files. Both identical yet one works fullscreen and the newer one doesn&#8217;t. Any ideas?</p>The post <a href="https://learncgames.com/great-mysteries-number-1/">Great mysteries – number 1</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3453</post-id>	</item>
		<item>
		<title>eBook 2 now published on Amazon</title>
		<link>https://learncgames.com/ebook-2-now-publisjed-on-amazon/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ebook-2-now-publisjed-on-amazon</link>
					<comments>https://learncgames.com/ebook-2-now-publisjed-on-amazon/#comments</comments>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Mon, 19 May 2025 09:08:06 +0000</pubDate>
				<category><![CDATA[Ebook]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[raspberry-pi]]></category>
		<category><![CDATA[ebook]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3388</guid>

					<description><![CDATA[<p>This is the Linux and Raspberry Pi version of the first book which uses VS Code.  All code updated plus screenshots mostly from Raspberry Pis and a new book cover!</p>
The post <a href="https://learncgames.com/ebook-2-now-publisjed-on-amazon/">eBook 2 now published on Amazon</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:16,&quot;href&quot;:&quot;https:\/\/amzn.eu\/d\/87tHW3A&quot;,&quot;archived_href&quot;:&quot;&quot;,&quot;redirect_href&quot;:&quot;https:\/\/www.amazon.co.uk\/dp\/B0F92TGVD1?ref=cm_sw_r_ffobk_cp_ud_dp_SGCWV17P59HBXDKZEMDQ&amp;ref_=cm_sw_r_ffobk_cp_ud_dp_SGCWV17P59HBXDKZEMDQ&amp;social_share=cm_sw_r_ffobk_cp_ud_dp_SGCWV17P59HBXDKZEMDQ&amp;bestFormat=true&amp;previewDoh=1&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;}]'></div>
<p><img decoding="async" class="alignleft size-full wp-image-3389" src="https://learncgames.com/wp-content/uploads/2025/05/learnc-games-programming-Linux.png" alt="Learn C Games programming " width="1140" height="464" srcset="https://learncgames.com/wp-content/uploads/2025/05/learnc-games-programming-Linux.png 1140w, https://learncgames.com/wp-content/uploads/2025/05/learnc-games-programming-Linux-300x122.png 300w, https://learncgames.com/wp-content/uploads/2025/05/learnc-games-programming-Linux-1024x417.png 1024w, https://learncgames.com/wp-content/uploads/2025/05/learnc-games-programming-Linux-768x313.png 768w" sizes="(max-width: 1140px) 100vw, 1140px" />This is the <a title="Link to ebook on Amazon" href="https://amzn.eu/d/87tHW3A" target="_blank" rel="noopener">Linux and Raspberry Pi version</a> of the first book which uses VS Code.  All code updated plus screenshots mostly from Raspberry Pis and a new book cover!</p>The post <a href="https://learncgames.com/ebook-2-now-publisjed-on-amazon/">eBook 2 now published on Amazon</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://learncgames.com/ebook-2-now-publisjed-on-amazon/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3388</post-id>	</item>
		<item>
		<title>Bit of a curiosity &#8211; Rust runs slower on Windows than Linux</title>
		<link>https://learncgames.com/bit-of-a-curiosity-rust-runs-slower-on-windows-than-linux/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=bit-of-a-curiosity-rust-runs-slower-on-windows-than-linux</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Fri, 28 Feb 2025 00:00:38 +0000</pubDate>
				<category><![CDATA[64-bit]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Rust]]></category>
		<category><![CDATA[Techniques]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[poker]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3317</guid>

					<description><![CDATA[<p>And it is a fair comparison because the Linux I&#8217;m running (Ubuntu 24.04 LTS) runs on my Windows 11 box in a hyper-V VM. I wrote a Poker hand evaluation program which loaded a text file containing lines of seven playing cards in text format TS 2C 4D sort of thing. It was seven cards [&#8230;]</p>
The post <a href="https://learncgames.com/bit-of-a-curiosity-rust-runs-slower-on-windows-than-linux/">Bit of a curiosity – Rust runs slower on Windows than Linux</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>And it is a fair comparison because the Linux I&#8217;m running (Ubuntu 24.04 LTS) runs on my Windows 11 box in a hyper-V VM. I wrote a Poker hand evaluation program which loaded a text file containing lines of seven playing cards in text format TS 2C 4D sort of thing. It was seven cards because there&#8217;s two in your hand and five on the table.</p>
<p>There were 1,000 lines of these and the program loaded the file into memory, holding the cards in a Vec&lt;Vec&lt;Card&gt;&gt;. Then it loops through the 1,000 elements and figures out the best hand for each set.  The bit that was timed was the loop not the loading the file into memory.</p>
<p>The source file is on GitHub. It has the project files plus some test cards. You can try it yourself. <strong>Note at the bottom of this article is a link to a much faster version.</strong></p>
<pre>https://github.com/David-H-Bolton/Projects/blob/main/rust_pokerhand.zip</pre>
<p>On my PC, the Windows one average time per hand is 768 ns. On Ubuntu is 540ns. Mad eh! The same program runs in 70% of the time on Linux compared to Windows. Both are run with this command from a terminal/command line.</p>
<pre>cargo run --release 1000_card_hads.txt</pre>
<p>You can also try the test_card_hands.txt but you need to enable the show_cards feature. That shows the cards but doesn&#8217;t do timing. The default is do the timing but don&#8217;t show the cards or the evaluation.</p>
<pre>cargo run --release --features show_card test_card_hands.txt</pre>
<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-3319" src="https://learncgames.com/wp-content/uploads/2025/02/testcards.png" alt="Shows the Rust program with the feature" width="750" height="431" srcset="https://learncgames.com/wp-content/uploads/2025/02/testcards.png 750w, https://learncgames.com/wp-content/uploads/2025/02/testcards-300x172.png 300w" sizes="auto, (max-width: 750px) 100vw, 750px" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>The test cards say what each hand is and the output at the bottom is the program working out each hand.<br />
The file</p>
<pre>https://github.com/David-H-Bolton/Projects/blob/main/rust_pokerhand_faster.zip</pre>
<p>contains a much faster version. On Linux it takes about 127 ns per hand. On Windows it&#8217;s about 190 ns.</p>The post <a href="https://learncgames.com/bit-of-a-curiosity-rust-runs-slower-on-windows-than-linux/">Bit of a curiosity – Rust runs slower on Windows than Linux</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3317</post-id>	</item>
		<item>
		<title>Raspberry Pi Sound issues- trying to fix it</title>
		<link>https://learncgames.com/raspberry-pi-sound-issues-trying-to-fix-it/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=raspberry-pi-sound-issues-trying-to-fix-it</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Mon, 19 Dec 2022 00:00:02 +0000</pubDate>
				<category><![CDATA[bugs]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Ebook]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[raspberry-pi]]></category>
		<category><![CDATA[sound]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3145</guid>

					<description><![CDATA[<p>In working through my Linux/Raspberry Pi eBook(Yes &#8211; the second eBook!), I&#8217;m up to the chapter where sounds are introduced using the SDL_mixer library. And I&#8217;ve hit two sets of problems. It sometimes refuses to initialize the sound code.  This code below hits the LogError line: int success=Mix_OpenAudio(22050, AUDIO_S16LSB, 2, 8192); if (success==-1 ) { [&#8230;]</p>
The post <a href="https://learncgames.com/raspberry-pi-sound-issues-trying-to-fix-it/">Raspberry Pi Sound issues- trying to fix it</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:38,&quot;href&quot;:&quot;https:\/\/pixabay.com\/users\/openclipart-vectors-30363\/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=158394&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20251230124419\/https:\/\/pixabay.com\/users\/openclipart-vectors-30363\/?utm_source=link-attribution&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:14:50&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-02-11 00:49:37&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-02-15 09:57:58&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-02-22 03:49:13&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-02-27 11:03:50&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-04 08:58:03&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-10 04:10:04&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-14 23:28:01&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-23 04:24:55&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-26 18:05:22&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-04 12:46:30&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-09 07:36:36&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-12 11:45:04&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-20 08:36:45&quot;,&quot;http_code&quot;:403}],&quot;broken&quot;:true,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-20 08:36:45&quot;,&quot;http_code&quot;:403},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:39,&quot;href&quot;:&quot;https:\/\/pixabay.com\/\/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=158394&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260205102120\/https:\/\/pixabay.com\/?utm_source=link-attribution&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:14:54&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-02-11 00:49:37&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-02-15 09:57:57&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-02-22 03:49:12&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-02-27 11:03:50&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-04 08:58:03&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-10 04:10:04&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-14 23:28:01&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-23 04:24:56&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-26 18:05:20&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-04 12:46:30&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-09 07:36:39&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-12 11:45:04&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-19 12:07:41&quot;,&quot;http_code&quot;:403}],&quot;broken&quot;:true,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 12:07:41&quot;,&quot;http_code&quot;:403},&quot;process&quot;:&quot;done&quot;}]'></div>
<figure id="attachment_3146" aria-describedby="caption-attachment-3146" style="width: 295px" class="wp-caption alignleft"><img loading="lazy" decoding="async" class="size-medium wp-image-3146" src="https://learncgames.com/wp-content/uploads/2022/12/loudspeaker-295x300.png" alt="Loudpeaker" width="295" height="300" srcset="https://learncgames.com/wp-content/uploads/2022/12/loudspeaker-295x300.png 295w, https://learncgames.com/wp-content/uploads/2022/12/loudspeaker.png 630w" sizes="auto, (max-width: 295px) 100vw, 295px" /><figcaption id="caption-attachment-3146" class="wp-caption-text">Image by <a href="https://pixabay.com/users/openclipart-vectors-30363/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=158394">OpenClipart-Vectors</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=158394">Pixabay</a></figcaption></figure>
<p>In working through my Linux/Raspberry Pi eBook(<em>Yes &#8211; the second eBook!)</em>, I&#8217;m up to the chapter where sounds are introduced using the SDL_mixer library. And I&#8217;ve hit two sets of problems.</p>
<p>It sometimes refuses to initialize the sound code.  This code below hits the LogError line:</p>
<pre><code class="language-c" data-line=""></code></pre>
<pre><code class="language-c" data-line="">	int success=Mix_OpenAudio(22050, AUDIO_S16LSB, 2, 8192);
	if (success==-1 ) {
		LogError(&quot;InitSetup failed to init audio&quot;);
	}</code></pre>
<pre><code class="language-c" data-line=""></code></pre>
<p>The other day it was working but not today. Now I have updated the Pi&#8217;s code (<em>sudo apt update</em> <em>etc</em>) but I wouldn&#8217;t have expected that to break it. I&#8217;ve been looking on the internet and find the whole thing a bit complicated.</p>
<p>I&#8217;ve got my Pi running 64-bit Raspberry Pi OS. I&#8217;ve changed the output device to headphones which plug into the headphone socket. If I run the VLC media player and tell it to play into the headphones, it will happily play the .wav files I&#8217;ve got for the asteroids game.</p>
<p>But if I run <strong>speaker-test</strong>, a terminal application with this command line</p>
<pre>speaker-test -c2 -twav -l7 plughw:1,0</pre>
<p>I get</p>
<pre>speaker-test 1.2.4

Playback device is default
Stream parameters are 48000Hz, S16_LE, 2 channels
WAV file(s)
Setting of hwparams failed: Invalid argument</pre>
<p>By running this command:</p>
<pre><code class="language-c" data-line="">aplay -L
</code></pre>
<p>I got 71 lines of output but of these these below are the most important</p>
<pre>output
<strong>hw</strong>:CARD=<strong>Headphones</strong>,DEV=0
    bcm2835 Headphones, bcm2835 Headphones
</pre>
<p>and the speaker-test command using the device parameter &#8211;<strong>Dhw:Headphones</strong> now worked. I&#8217;ve highlighted the bits in the aplay output needed to identify the device.</p>
<p>The new command  is</p>
<pre>speaker-test -c2 -twav -l7 -Dhw:Headphones</pre>
<p>I can now hear a female voice saying <strong>front left</strong> then <strong>front right</strong> a few times in my headphones.</p>
<p>So my Pi&#8217;s sound device is working; I just have to figure why SDL_mixer isn&#8217;t always. I&#8217;ll keep looking.</p>
<p><strong>And the second problem</strong> which only occurs when the mixer is working, is when you play a lot of sounds. The <strong>PlayASound()</strong> function checks the result. On Windows it never had a problem but on Raspberry Pi, when you blow up a lot of asteroids say at one time, it plays a number of explosions then returns an error for each explosion after that. I think there&#8217;s only so many channels; that&#8217;s an easy fix; just ignore the error and return as if it succeeded.</p>The post <a href="https://learncgames.com/raspberry-pi-sound-issues-trying-to-fix-it/">Raspberry Pi Sound issues- trying to fix it</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3145</post-id>	</item>
		<item>
		<title>How to Configure Visual Studio Code for C/C++ development</title>
		<link>https://learncgames.com/how-to-configure-visual-studio-code-for-c-c-development/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-configure-visual-studio-code-for-c-c-development</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Mon, 05 Dec 2022 00:00:11 +0000</pubDate>
				<category><![CDATA[C]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Visual Studio Code]]></category>
		<category><![CDATA[compilation]]></category>
		<category><![CDATA[configuration]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3111</guid>

					<description><![CDATA[<p>When I first started with VS Code on Linux, I found the C/C++ configuration somewhat confusing.  I blundered through, wasted a bit of time and got there in the end. After a gap of a couple of years I did the same again recently on Raspberry Pi. It&#8217;s clearer in my mind now so I [&#8230;]</p>
The post <a href="https://learncgames.com/how-to-configure-visual-studio-code-for-c-c-development/">How to Configure Visual Studio Code for C/C++ development</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-3113" src="https://learncgames.com/wp-content/uploads/2022/12/vscode-extensions.png" alt="VS Code C/C++ extension" width="254" height="68" srcset="https://learncgames.com/wp-content/uploads/2022/12/vscode-extensions.png 254w, https://learncgames.com/wp-content/uploads/2022/12/vscode-extensions-250x68.png 250w" sizes="auto, (max-width: 254px) 100vw, 254px" />When I first started with VS Code on Linux, I found the C/C++ configuration somewhat confusing.  I blundered through, wasted a bit of time and got there in the end. After a gap of a couple of years I did the same again recently on Raspberry Pi. It&#8217;s clearer in my mind now so I thought I&#8217;d explain it here. This works for Ubuntu, Raspberry Pi OS and should for most other Linuxes. (<em>Not that I&#8217;ve tried them all&#8230;</em>)</p>
<p>We&#8217;ll start with you having already installed Clang (<em>or GCC</em>) and VS Code, and the C/C++ extension for VS Code (shown above). So make sure those are all done.</p>
<p>Start by defining a Folder for VS Code. VS code doesn&#8217;t use projects but it manages everything relative to the currently defined Folder.  It&#8217;ll ask you to open a folder initially. That&#8217;s where your source code etc will go. I created a folder called examples under my home folder and used that.</p>
<p>To compile anything C/C++ you also need two json files. These files are</p>
<ul>
<li>tasks.json</li>
<li>c_cpp_properties.json</li>
</ul>
<p>They are held in a hidden folder called .vscode in your current folder. Press F1 and you&#8217;ll see a popup menu. Type in C/C++ and you&#8217;ll see all the C/C++ items. Select <strong>C/C++: Edit Configurations (JSON).</strong> It&#8217;s highlighted below.</p>
<p><img loading="lazy" decoding="async" class="alignleft wp-image-3114 size-full" src="https://learncgames.com/wp-content/uploads/2022/12/cppconfigurations.png" alt="Vs Copde C++ menu" width="615" height="340" srcset="https://learncgames.com/wp-content/uploads/2022/12/cppconfigurations.png 615w, https://learncgames.com/wp-content/uploads/2022/12/cppconfigurations-300x166.png 300w" sizes="auto, (max-width: 615px) 100vw, 615px" /></p>
<p>Now if you click that, and look in the folder examples you&#8217;ll see nothing but if you know how to view hidden files using the files utility (as shown below). Then you&#8217;ll see the folder <strong>.vscode</strong>.  On Raspberry Pi the file explorer always shows hidden files.</p>
<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-3115" src="https://learncgames.com/wp-content/uploads/2022/12/showHiddenFiles.png" alt="Show hidden files in files utility" width="218" height="352" srcset="https://learncgames.com/wp-content/uploads/2022/12/showHiddenFiles.png 218w, https://learncgames.com/wp-content/uploads/2022/12/showHiddenFiles-186x300.png 186w" sizes="auto, (max-width: 218px) 100vw, 218px" /> Now look in that folder and you&#8217;ll see <strong>c_cpp_properties.json</strong>.</p>
<p>Next we want <strong>tasks.json</strong>. On the Terminal menu, click the bottom item which is <em>Configure Default Build Task</em></p>
<p>It&#8217;ll ask you to select the <strong>clang  build active task</strong> so click that and voila you now have <strong>tasks.json</strong> open in the editor.</p>
<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-3117" src="https://learncgames.com/wp-content/uploads/2022/12/configure-default-build-task.png" alt="Vs Code Configure Default Build Task" width="361" height="343" srcset="https://learncgames.com/wp-content/uploads/2022/12/configure-default-build-task.png 361w, https://learncgames.com/wp-content/uploads/2022/12/configure-default-build-task-300x285.png 300w" sizes="auto, (max-width: 361px) 100vw, 361px" /></p>
<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-3119" src="https://learncgames.com/wp-content/uploads/2022/12/build-active-file.png" alt="Build Active File" width="592" height="79" srcset="https://learncgames.com/wp-content/uploads/2022/12/build-active-file.png 592w, https://learncgames.com/wp-content/uploads/2022/12/build-active-file-300x40.png 300w" sizes="auto, (max-width: 592px) 100vw, 592px" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Now I&#8217;ve created the standard hello world file in the file hw.c.</p>
<pre><code class="language-c" data-line="">#include &lt;stdio.h&gt;

int main() {
  printf(&quot;Hello world\n&quot;);
  return 0;
}</code></pre>
<p>So just do <em>Terminal/Run Build Task</em> and it will have clang compile the currently opened file. If you get terminal failed to launch (exit code: -1) then it&#8217;s likely that your hello world source file was not the currently opened file in the editor. You can see which file is open because its tab is brightest.</p>
<p>Note that hw.c is brighter than tasks.json on the left. On the right, the open file is tasks.json and its tab is brighter.</p>
<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-3126" src="https://learncgames.com/wp-content/uploads/2022/12/open-file.png" alt="Open file in VS Code" width="330" height="201" srcset="https://learncgames.com/wp-content/uploads/2022/12/open-file.png 330w, https://learncgames.com/wp-content/uploads/2022/12/open-file-300x183.png 300w" sizes="auto, (max-width: 330px) 100vw, 330px" /></p>
<h3><img loading="lazy" decoding="async" class="alignleft size-full wp-image-3127" src="https://learncgames.com/wp-content/uploads/2022/12/open-tasks.json.png" alt="Tasks.json is open" width="526" height="185" srcset="https://learncgames.com/wp-content/uploads/2022/12/open-tasks.json.png 526w, https://learncgames.com/wp-content/uploads/2022/12/open-tasks.json-300x106.png 300w" sizes="auto, (max-width: 526px) 100vw, 526px" /></h3>
<h3></h3>
<h3></h3>
<h3></h3>
<h3></h3>
<h3></h3>
<h3>So what are the json files for?</h3>
<p>The c_cpp_properties.json lets you specify include file paths.  For instance if you have the SDL files installed, the include files are in <strong>/usr/include/SDL2</strong></p>
<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-3129" src="https://learncgames.com/wp-content/uploads/2022/12/sdl2-include-files.png" alt="SDL2 include files" width="551" height="247" srcset="https://learncgames.com/wp-content/uploads/2022/12/sdl2-include-files.png 551w, https://learncgames.com/wp-content/uploads/2022/12/sdl2-include-files-300x134.png 300w" sizes="auto, (max-width: 551px) 100vw, 551px" /></p>
<p>Note you can install SDL on linux by <a title="Link to how to install SDL on Linux" href="https://learncgames.com/tutorials/how-to-install-sdl-on-linux/" target="_blank" rel="noopener">following these instructions</a>.</p>
<p>The tasks.json file lets you specify which files are to be included and also linked.</p>
<p>Here I&#8217;ve just shown the args section from a <strong>tasks.json</strong> used to build SDL2 games.</p>
<pre><code class="language-json" data-line="">	&quot;args&quot;: [
		&quot;-g&quot;,
		&quot;${file}&quot;,
		&quot;${workspaceFolder}/hr_time.c&quot;,
		&quot;-o&quot;,
		&quot;${fileDirname}/${fileBasenameNoExtension}&quot;,
		&quot;-lSDL2&quot;,
		&quot;-lSDL2_image&quot;,
		&quot;-lSDL2_mixer&quot;,
		&quot;-lm&quot;
	],</code></pre>
<p>The -g option includes files. The ${file} is the current opened file and {workspaceFolder{} specifies the current folder where the file hr_time.c (used for timing). The -l is for linking files and links SDL2, SDL2_image and SDL2_mixer.  The last <strong>-lm</strong> links math(s) code; technically the -l{name} flag tells the linker to link against lib{name}. So -lm links against libm, the c math library.</p>The post <a href="https://learncgames.com/how-to-configure-visual-studio-code-for-c-c-development/">How to Configure Visual Studio Code for C/C++ development</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3111</post-id>	</item>
		<item>
		<title>A minor whinge about Linux</title>
		<link>https://learncgames.com/a-minor-whinge-about-linux/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-minor-whinge-about-linux</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Thu, 10 Mar 2022 00:00:17 +0000</pubDate>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[reboots]]></category>
		<category><![CDATA[update]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3032</guid>

					<description><![CDATA[<p>I&#8217;ve been a Windows developer since the late 1990s and I got into Linux about 2008. I&#8217;m still a Windows developer but now that .NET applications can run on Mac and Linux as well as Windows, it makes it easier to write software in C# that runs on Linux.  Using a Linux VPS is probably [&#8230;]</p>
The post <a href="https://learncgames.com/a-minor-whinge-about-linux/">A minor whinge about Linux</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-3033" src="https://learncgames.com/wp-content/uploads/2022/03/virtualmin-reboot-update.png" alt="Screenshot of Virtualmin update screen" width="570" height="253" srcset="https://learncgames.com/wp-content/uploads/2022/03/virtualmin-reboot-update.png 570w, https://learncgames.com/wp-content/uploads/2022/03/virtualmin-reboot-update-300x133.png 300w" sizes="auto, (max-width: 570px) 100vw, 570px" />I&#8217;ve been a Windows developer since the late 1990s and I got into Linux about 2008. I&#8217;m still a Windows developer but now that .NET applications can run on Mac and Linux as well as Windows, it makes it easier to write software in C# that runs on Linux.  Using a Linux VPS is probably the cheapest way to do that.</p>
<p>I still use Visual Studio on Windows for developing and just by changing the publish target can run it on Windows or Linux. If you manage a VPS as I do, you want to keep it up to date and that&#8217;s what my whinge is.</p>
<p>It used to be that Windows was a pain with having to reboot after installing software. These days that&#8217;s only when you&#8217;re doing a major update. <strong>But Linux?</strong> I&#8217;m finding that I have to reboot it after an update on average perhaps once a week. This week it happened twice! I grabbed a screenshot to show it.</p>
<p>The screenshot is of the bottom of the VirtualMin update page. I use Virtualmin for administering it because I prefer to spend my time programming. That blue <strong>Reboot Now</strong> button appeared because one of the packages that got updated required a reboot. I don&#8217;t think there&#8217;s anything that can be done except click it; the reboot has to happen and only seems to take a minute at most.  It&#8217;s just the irony that for years people complained about Windows reboots and now it&#8217;s actually Linux that is the major culprit!</p>The post <a href="https://learncgames.com/a-minor-whinge-about-linux/">A minor whinge about Linux</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3032</post-id>	</item>
		<item>
		<title>And with a bit of help I got it fixed</title>
		<link>https://learncgames.com/and-with-a-bit-of-help-i-got-it-fixed/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=and-with-a-bit-of-help-i-got-it-fixed</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Wed, 09 Mar 2022 00:00:27 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Nuget]]></category>
		<category><![CDATA[SkiaSharp]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3026</guid>

					<description><![CDATA[<p>Thanks to suggestions in the Reddit CSharp subreddit (you can view the entire thread here), I fixed the missing file issue and SkiaSharp is now happily outputting graphics on the VPS.  I&#8217;m referring to the More Programming Joys blog entry I posted yesterday. There were two things that were needed to fix it. Add a [&#8230;]</p>
The post <a href="https://learncgames.com/and-with-a-bit-of-help-i-got-it-fixed/">And with a bit of help I got it fixed</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:60,&quot;href&quot;:&quot;https:\/\/www.reddit.com\/r\/dotnet\/comments\/t8yg53\/c_application_with_skiasharp_on_ubuntu_2004_is&quot;,&quot;archived_href&quot;:&quot;&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:61,&quot;href&quot;:&quot;https:\/\/www.nuget.org\/packages\/SkiaSharp.NativeAssets.Linux\/2.88.0-preview.209&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260206113019\/https:\/\/www.nuget.org\/packages\/SkiaSharp.NativeAssets.Linux\/2.88.0-preview.209&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 12:35:54&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-10 00:39:56&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-13 02:24:16&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-16 18:55:21&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-21 16:38:48&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-26 04:32:18&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-02 12:31:42&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-06 00:39:01&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-10 00:34:09&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-14 00:37:02&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-18 00:39:38&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-22 00:32:31&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-26 00:55:13&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-30 00:39:23&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-02 20:46:48&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-06 04:38:57&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-09 12:30:18&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-12 20:19:59&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-16 04:12:58&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-19 12:06:56&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 12:06:56&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:62,&quot;href&quot;:&quot;https:\/\/nuget.org&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260204222129\/https:\/\/www.nuget.org\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:28:55&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-10 04:39:38&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-14 01:16:46&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-17 14:30:35&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-22 00:43:31&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-26 04:32:14&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-02 12:31:42&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-06 00:38:59&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-10 08:30:41&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-14 00:37:01&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-18 00:39:32&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-22 00:32:33&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-26 00:55:13&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-30 00:39:22&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-02 20:46:48&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-06 04:38:51&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-09 12:30:18&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-12 20:19:59&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-16 04:13:00&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-19 12:06:52&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 12:06:52&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;}]'></div>
<p><img loading="lazy" decoding="async" class="alignleft wp-image-3028 size-full" src="https://learncgames.com/wp-content/uploads/2022/03/visual-studio-target-runtime-dialog.png" alt="Visual Studio Publish Target runtime dialog" width="545" height="499" srcset="https://learncgames.com/wp-content/uploads/2022/03/visual-studio-target-runtime-dialog.png 545w, https://learncgames.com/wp-content/uploads/2022/03/visual-studio-target-runtime-dialog-300x275.png 300w" sizes="auto, (max-width: 545px) 100vw, 545px" />Thanks to suggestions in the Reddit CSharp subreddit (you can view the entire thread <a title="Link to Csharp subreddit on Reddit" href="https://www.reddit.com/r/dotnet/comments/t8yg53/c_application_with_skiasharp_on_ubuntu_2004_is/" target="_blank" rel="nofollow noopener">here</a>), I fixed the missing file issue and SkiaSharp is now happily outputting graphics on the VPS.  I&#8217;m referring to the <a title="Link to Blog entry on More Programming Joys" href="https://learncgames.com/more-programming-joys/" target="_blank" rel="noopener">More Programming Joys</a> blog entry I posted yesterday.</p>
<p>There were two things that were needed to fix it.</p>
<ol>
<li>Add a package to the solution. This was the <a title="Link to SkiaSharp.NativeAssets.Linux" href="https://www.nuget.org/packages/SkiaSharp.NativeAssets.Linux/2.88.0-preview.209" target="_blank" rel="nofollow noopener">SkiaSharp.NativeAssets.Linux</a> package and I used Nuget to add it to my Windows solution. If you haven&#8217;t used <a title="Link to Nuget.org" href="https://nuget.org" target="_blank" rel="noopener">Nuget</a>, it&#8217;s a great package manager and makes it very easy to add packages.</li>
<li>On the <em>Visual Studio Publish page</em>, I needed to change the Target Runtime to <strong>linux-x64</strong>. That&#8217;s the dialog above. When I clicked the Publish it put all the files including the library that was missing (libSkiaSharp.so) into the Target location and once uploaded it worked.</li>
</ol>The post <a href="https://learncgames.com/and-with-a-bit-of-help-i-got-it-fixed/">And with a bit of help I got it fixed</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3026</post-id>	</item>
		<item>
		<title>More Programming Joys</title>
		<link>https://learncgames.com/more-programming-joys/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=more-programming-joys</link>
					<comments>https://learncgames.com/more-programming-joys/#comments</comments>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Tue, 08 Mar 2022 00:00:48 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Serilog]]></category>
		<category><![CDATA[Skia]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=3021</guid>

					<description><![CDATA[<p>So I&#8217;ve been doing some .NET programming. First on Windows because I can debug it there then &#8220;Publish it&#8221; which puts all the files (compiled in release) needed, including any dlls into one folder and upload it to a VPS using WinSCP. I&#8217;ve also got a terminal session connected by Putty. I use Serilog for [&#8230;]</p>
The post <a href="https://learncgames.com/more-programming-joys/">More Programming Joys</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:63,&quot;href&quot;:&quot;https:\/\/serilog.net&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260103212351\/https:\/\/serilog.net\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:28:57&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-10 04:39:36&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-14 10:25:44&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-17 14:30:37&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-21 04:35:54&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-24 12:51:47&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-28 00:38:48&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-03 20:03:58&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-07 18:33:19&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-12 00:39:19&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-16 00:37:33&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-19 22:43:09&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-23 11:58:53&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-26 20:35:23&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-31 00:31:33&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-03 10:33:20&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-06 19:52:56&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-10 03:41:38&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-13 11:32:39&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-16 19:24:44&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-20 03:16:26&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-20 03:16:26&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:64,&quot;href&quot;:&quot;https:\/\/github.com\/serilog\/serilog&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20251216014112\/https:\/\/github.com\/serilog\/serilog&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:29:00&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-10 00:39:46&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-13 02:24:18&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-16 18:55:22&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-21 08:35:50&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-24 12:51:48&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-28 00:38:52&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-03 20:03:56&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-07 18:33:18&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-12 00:39:19&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-16 00:37:32&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-19 22:43:08&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-23 11:58:58&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-26 20:35:26&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-31 00:31:35&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-03 10:33:19&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-06 19:52:56&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-10 03:41:50&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-13 11:32:40&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-16 19:24:44&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-20 03:16:30&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-20 03:16:30&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:65,&quot;href&quot;:&quot;https:\/\/stackoverflow.com\/questions\/44428405\/i-am-using-net-core-with-c-sharp-on-linux-lib-system-drawing-is-missing&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20181104053240\/https:\/\/stackoverflow.com\/questions\/44428405\/i-am-using-net-core-with-c-sharp-on-linux-lib-system-drawing-is-missing&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:29:02&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-10 20:36:02&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-15 01:01:48&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-19 00:40:52&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-22 19:08:18&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-27 04:24:13&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-03 00:39:27&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-06 10:44:08&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-09 17:23:49&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-14 00:37:02&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-18 00:39:33&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-22 00:32:31&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-26 00:55:13&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-03-30 00:39:20&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-02 20:46:52&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-06 04:38:54&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-09 12:30:18&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-12 20:19:58&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-16 04:12:58&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-19 12:06:54&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 12:06:54&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:66,&quot;href&quot;:&quot;https:\/\/github.com\/mono\/SkiaSharp\/issues\/1341&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20250109034858\/https:\/\/github.com\/mono\/SkiaSharp\/issues\/1341&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:29:05&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-10 10:18:17&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-14 12:39:11&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-17 14:30:43&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-21 16:38:54&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-26 04:32:15&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-02 04:40:31&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-05 17:31:19&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-08 18:37:14&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-12 06:24:43&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-16 00:37:35&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-19 22:43:28&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-23 11:59:04&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-26 20:35:20&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-31 00:31:33&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-03 10:33:21&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-06 19:52:56&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-10 03:41:44&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-13 11:32:41&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-16 19:24:44&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-20 03:16:21&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-20 03:16:21&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;}]'></div>
<p><img loading="lazy" decoding="async" class="alignleft size-full wp-image-3023" src="https://learncgames.com/wp-content/uploads/2022/03/map.jpg" alt="Game Map" width="100" height="100" />So I&#8217;ve been doing some .NET programming. First on Windows because I can debug it there then &#8220;Publish it&#8221; which puts all the files (compiled in release) needed, including any dlls into one folder and upload it to a VPS using WinSCP. I&#8217;ve also got a terminal session connected by Putty. I use Serilog for logging and SkiaSharp for graphics.</p>
<p>First bug was a missing file but it was a stupid error on my part. I had the file in a path under the home folder and had used ~ in the file&#8217;s path. You can use ~ in Bash- it means your home folder, but not in a file path in an application. Putting in the full path fixed the bug. D&#8217;oh.</p>
<p>Because it&#8217;s .NET (6) that I&#8217;m using, you don&#8217;t get configuration stuff the same as you did with .NET Framework. I store some config information in a file and define the path with these lines of code which work on both Linux and Windows.</p>
<pre><code class="language-csharp" data-line=""> bool IsWindows =&gt; RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
 var appSettingsFilePath = IsWindows ? @&quot;c:\turfwar\twConfig.json&quot; : &quot;/home/user/turfwar/twConfig.json&quot;;</code></pre>
<p>I like <a title="Link to serilog website" href="https://serilog.net/" target="_blank" rel="noopener">Serilog</a> ( with project on <a title="Link to Serilog on GitHub" href="https://github.com/serilog/serilog" target="_blank" rel="nofollow noopener">Github</a> at ). Nice and simple logging but flexible enough. As this application is a command line app run whenever, it&#8217;s easier to view the logs afterwards.</p>
<h2>Why use SkiaSharp?</h2>
<p>I was quite happy to use System.Drawing but <a title="Link to StackOverflow question about .NET Core on Linux" href="https://stackoverflow.com/questions/44428405/i-am-using-net-core-with-c-sharp-on-linux-lib-system-drawing-is-missing" target="_blank" rel="nofollow noopener">according to this</a>, There are issues with libgdiplus. So I thought I&#8217;d try SkiaSharp as I&#8217;m doing stuff with Flutter and Skia is the library that underpins that. This is what it takes to create a 100 x100 grey coloured Bitmap in SkiaSharp, add yellow dots and save it to disk as a .jpg. That&#8217;s what you see up above.</p>
<pre><code class="language-csharp" data-line="">        internal void SaveBitMap(int id, string filename, Gang gang)
        {
            var info = new SKImageInfo(100, 100);
            using var surface = SKSurface.Create(info);
            SKCanvas myCanvas = surface.Canvas;

            // clear the canvas / fill with white
            myCanvas.DrawColor(new SKColor(0x99, 0x99, 0x99));

            // draw the dots, one for each block
            foreach (var block in Blocks)
            {
                if (block.Owner == id)
                {
                    myCanvas.DrawPoint(block.X*5/2, block.Y*5/2, SKColors.Yellow);
                }
            }

            // Now save to filename
            var mainCanvasImage = surface.Snapshot();
            var TempTIFbitmap1 = SKBitmap.Decode(mainCanvasImage.Encode());
            using (var image = SKImage.FromBitmap(TempTIFbitmap1))
            using (var data = image.Encode(SKEncodedImageFormat.Jpeg, 100))
            {
                // save the data to a stream
                using (var stream = File.OpenWrite(filename))
                {
                    data.SaveTo(stream);
                }
            }
        }</code></pre>
<p>It works fine on Windows but on Linux, (Ubuntu 20.04) I hit bug #2. &#8220;System.TypeInitializationException: The type initializer for &#8216;SkiaSharp.SKImageInfo&#8217; threw an exception.&#8221;. And that&#8217;s where I am at the moment.  <a title="Link to Bug discussion for SkiaSharp" href="https://github.com/mono/SkiaSharp/issues/1341" target="_blank" rel="nofollow noopener">This</a> is similar.  I&#8217;ll keep you informed.</p>The post <a href="https://learncgames.com/more-programming-joys/">More Programming Joys</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://learncgames.com/more-programming-joys/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3021</post-id>	</item>
		<item>
		<title>My PC is broke&#8230; plan b</title>
		<link>https://learncgames.com/my-pc-is-broke-plan-b/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=my-pc-is-broke-plan-b</link>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Mon, 08 Mar 2021 00:00:05 +0000</pubDate>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[Techniques]]></category>
		<category><![CDATA[Calamity]]></category>
		<guid isPermaLink="false">https://learncgames.com/?p=2841</guid>

					<description><![CDATA[<p>I repurposed my wife&#8217;s old Toshiba laptop a year ago, installing Ubuntu 20.04 LTS on it to replace Windows 10. Today my Windows PC broke. It appears that the cooler has given up after five and a half years faithful service. The warranty of course was only for five years&#8230; I just have to make [&#8230;]</p>
The post <a href="https://learncgames.com/my-pc-is-broke-plan-b/">My PC is broke… plan b</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></description>
										<content:encoded><![CDATA[<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:117,&quot;href&quot;:&quot;https:\/\/pixabay.com\/users\/freecliparts-812\/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=8642&quot;,&quot;archived_href&quot;:&quot;&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:118,&quot;href&quot;:&quot;https:\/\/pixabay.com\/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=8642&quot;,&quot;archived_href&quot;:&quot;http:\/\/web-wp.archive.org\/web\/20260205102120\/https:\/\/pixabay.com\/?utm_source=link-attribution&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-02-06 11:59:23&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-02-10 10:18:15&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-02-14 18:44:31&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-02-27 11:03:51&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-04 11:30:46&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-08 18:37:13&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-03-26 10:17:03&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-05 20:41:35&quot;,&quot;http_code&quot;:403},{&quot;date&quot;:&quot;2026-04-15 20:13:52&quot;,&quot;http_code&quot;:403}],&quot;broken&quot;:true,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-15 20:13:52&quot;,&quot;http_code&quot;:403},&quot;process&quot;:&quot;done&quot;}]'></div>
<figure id="attachment_2842" aria-describedby="caption-attachment-2842" style="width: 300px" class="wp-caption alignleft"><img loading="lazy" decoding="async" class="size-medium wp-image-2842" src="https://learncgames.com/wp-content/uploads/2021/03/penguin-8642_640-300x300.png" alt="Linux Tux" width="300" height="300" srcset="https://learncgames.com/wp-content/uploads/2021/03/penguin-8642_640-300x300.png 300w, https://learncgames.com/wp-content/uploads/2021/03/penguin-8642_640-150x150.png 150w, https://learncgames.com/wp-content/uploads/2021/03/penguin-8642_640-250x250.png 250w, https://learncgames.com/wp-content/uploads/2021/03/penguin-8642_640.png 640w" sizes="auto, (max-width: 300px) 100vw, 300px" /><figcaption id="caption-attachment-2842" class="wp-caption-text">Image by <a href="https://pixabay.com/users/freecliparts-812/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=8642">FreeCliparts</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=8642">Pixabay</a></figcaption></figure>
<p>I repurposed my wife&#8217;s old Toshiba laptop a year ago, installing Ubuntu 20.04 LTS on it to replace Windows 10. Today my Windows PC broke. It appears that the cooler has given up after five and a half years faithful service. The warranty of course was only for five years&#8230; I just have to make sure it is the cooler and not the PSU has gone and get it replaced.</p>
<p>I know it was overheating because I rebooted after 30 minutes and into the UEFI BIOS. There I watched the temperature climb at a rate of 1C every second. When it hit 75 C and the text turned red, I knew that it was overheating.</p>
<p>So I dug out the Toshiba and upgraded Ubuntu on it finally figuring out the password after 20 or so tries. Only 560 packages needed upgrading! That took a while and I&#8217;ve also been installing other software since. My VS Code was that old that it won&#8217;t actually update. When I did the Linux version of Asteroids I tested it on here.  It seems I have to download a recent version of VS Code which will let it upgrade with apt.</p>
<p>It shouldn&#8217;t but it never fails to surprise me how quick Linux is. This laptop has an I3 CPU and a hard disk and is about . It has 4 GB of RAM; I upgraded that a couple of years ago to try and speed up Windows. Even after upgrading Windows 8 to 10 and removing some of the Toshiba bloatware, it was never that quick. But now it flies.</p>
<p>Thankfully Chrome had the password to the site so I was able to login and write this from the laptop. I may have to do without my Windows PC for a week or two&#8230;</p>The post <a href="https://learncgames.com/my-pc-is-broke-plan-b/">My PC is broke… plan b</a> first appeared on <a href="https://learncgames.com">Learn C Games Programming Blog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2841</post-id>	</item>
	</channel>
</rss>
