<?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>Mike Lynch</title>
	<atom:link href="https://mikelynchgames.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://mikelynchgames.com/</link>
	<description>cøder • juggler • maker of things</description>
	<lastBuildDate>Tue, 23 Sep 2025 19:01:46 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2016/01/cropped-mikeInCirlceBlur.png?fit=32%2C32&#038;ssl=1</url>
	<title>Mike Lynch</title>
	<link>https://mikelynchgames.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">105600781</site>	<item>
		<title>A Pedagogical Framework for Teaching Effective LLM Use in Programming Education</title>
		<link>https://mikelynchgames.com/education-and-technology/a-pedagogical-framework-for-teaching-effective-llm-use-in-programming-education/</link>
					<comments>https://mikelynchgames.com/education-and-technology/a-pedagogical-framework-for-teaching-effective-llm-use-in-programming-education/#respond</comments>
		
		<dc:creator><![CDATA[Michael Lynch]]></dc:creator>
		<pubDate>Sat, 20 Sep 2025 05:48:00 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Education and Technology]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://mikelynchgames.com/?p=1925</guid>

					<description><![CDATA[<img data-tf-not-load="1" fetchpriority="high" loading="auto" decoding="auto" width="300" height="186" src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?fit=300%2C186&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?resize=300%2C186&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?resize=768%2C477&amp;ssl=1 768w" sizes="(max-width: 300px) 100vw, 300px" /><p><img data-tf-not-load="1" width="1024" height="636" src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?fit=1024%2C636&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="" decoding="async" fetchpriority="high" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?resize=300%2C186&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?resize=768%2C477&amp;ssl=1 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>The integration of Large Language Models (LLMs) into software development workflows has become inevitable, making it essential that computer science educators prepare students to use these tools effectively and responsibly. Recent research shows that LLMs are capable of solving the majority of assignments and exams previously used in CS1, and professional software engineers are increasingly [&#8230;]</p>
<p>The post <a href="https://mikelynchgames.com/education-and-technology/a-pedagogical-framework-for-teaching-effective-llm-use-in-programming-education/">A Pedagogical Framework for Teaching Effective LLM Use in Programming Education</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img data-tf-not-load="1" fetchpriority="high" loading="auto" decoding="auto" width="300" height="186" src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?fit=300%2C186&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?resize=300%2C186&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?resize=768%2C477&amp;ssl=1 768w" sizes="(max-width: 300px) 100vw, 300px" /><p><img loading="lazy" width="1024" height="636" src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?fit=1024%2C636&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?resize=300%2C186&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/09/CSEdLLMS.png?resize=768%2C477&amp;ssl=1 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p class="">The integration of Large Language Models (LLMs) into software development workflows has become inevitable, making it essential that computer science educators prepare students to use these tools effectively and responsibly. Recent research shows that LLMs are capable of solving the majority of assignments and exams previously used in CS1, and professional software engineers are increasingly using these tools, raising questions about whether we should be training students in their use.</p>



<p class="">Rather than viewing LLMs as threats to traditional programming education, we should embrace a structured pedagogical approach that develops students&#8217; ability to work productively with AI tools while maintaining their problem-solving skills and critical thinking abilities. </p>



<h2 class="wp-block-heading"><strong>A Three-Stage Developmental Framework</strong></h2>



<p class="">Based on emerging educational research, pedagogical best practices, and my own experience using AIs for software engineering, I propose a three-stage progression that reflects both cognitive development and increasing technical sophistication:</p>



<h3 class="wp-block-heading"><strong>Stage 1: AI as Consultant (Foundational Level)</strong></h3>



<p class=""><strong>Pedagogical Goals:</strong></p>



<ul class="wp-block-list">
<li class="">Develop effective question formulation skills</li>



<li class="">Build critical evaluation capabilities</li>



<li class="">Learn to iterate and refine queries</li>



<li class="">Understand LLM limitations and biases</li>
</ul>



<p class=""><strong>Learning Activities:</strong> Students interact with LLMs primarily through chat interfaces (ChatGPT, Claude, etc.) for research and problem-solving support. Research suggests that providing structured guidance, such as explicit instructions or prompting students to first attempt problems independently before refining solutions with LLM assistance, can reduce unproductive queries and enhance student engagement.</p>



<p class=""><strong>Essential Skills to Teach:</strong></p>



<ul class="wp-block-list">
<li class=""><strong>Problem Decomposition:</strong> Before querying the LLM, students must define their problem, attempt a solution, and identify specific roadblocks</li>



<li class=""><strong>Critical Evaluation:</strong> Implement the &#8220;5 whys&#8221; technique &#8211; repeatedly asking &#8220;why is this the best approach?&#8221; to validate AI responses</li>



<li class=""><strong>Source Validation:</strong> Cross-reference AI responses with official documentation and trusted sources</li>
</ul>



<p class=""><strong>Assessment Strategies:</strong></p>



<ul class="wp-block-list">
<li class="">Query portfolios showing progression from vague to specific questions</li>



<li class="">Reflection essays on when AI provided helpful vs. misleading information</li>



<li class="">Compare-and-contrast exercises between AI responses and authoritative sources</li>
</ul>



<h3 class="wp-block-heading"><strong>Stage 2: AI as Programming Partner (Intermediate Level)</strong></h3>



<p class=""><strong>Pedagogical Goals:</strong></p>



<ul class="wp-block-list">
<li class="">Understand code completion and suggestion systems</li>



<li class="">Develop prompt engineering skills for code generation</li>



<li class="">Learn to read, modify, and debug AI-generated code</li>



<li class="">Build habits of testing and verification</li>
</ul>



<p class=""><strong>Learning Activities:</strong> Students work with embedded IDE tools (GitHub Copilot, Continue, etc.) that provide real-time coding assistance. This approach allows students to focus on problem-solving and algorithms while relying on automatic code generation for implementation details.</p>



<p class=""><strong>Essential Skills to Teach:</strong></p>



<ul class="wp-block-list">
<li class=""><strong>Contextual Prompting:</strong> Writing meaningful comments and function signatures that guide AI completion</li>



<li class=""><strong>Code Review Skills:</strong> Systematically reading and understanding AI-generated code</li>



<li class=""><strong>Testing Mindset:</strong> Always creating test cases to verify AI-generated solutions</li>



<li class=""><strong>Incremental Development:</strong> Using AI for small, well-defined tasks rather than complete solutions</li>
</ul>



<p class=""><strong>Scaffolding Techniques:</strong> Research on &#8220;learner-LLM co-decomposition&#8221; suggests that interactive systems that scaffold learners&#8217; personalized construction of solution steps provide more effective learning than generic assistance. Implement:</p>



<ul class="wp-block-list">
<li class="">Structured templates for common programming patterns</li>



<li class="">Checkpoint reviews where students explain AI-generated code</li>



<li class="">Peer programming sessions combining human creativity with AI efficiency</li>
</ul>



<h3 class="wp-block-heading"><strong>Stage 3: AI as Development Team Member (Advanced Level)</strong></h3>



<p class=""><strong>Pedagogical Goals:</strong></p>



<ul class="wp-block-list">
<li class="">Manage complex, multi-step development tasks</li>



<li class="">Coordinate AI assistance within professional workflows</li>



<li class="">Apply software engineering best practices to AI-assisted development</li>



<li class="">Develop leadership and delegation skills</li>
</ul>



<p class=""><strong>Learning Activities:</strong> Students use advanced AI coding agents (Claude Artifacts, GitHub Copilot Workspace) to complete substantial projects while maintaining oversight and quality control.</p>



<p class=""><strong>Essential Skills to Teach:</strong></p>



<ul class="wp-block-list">
<li class=""><strong>Requirements Definition:</strong> Creating clear, testable specifications for AI systems</li>



<li class=""><strong>Code Review and Quality Assurance:</strong> Implementing systematic review processes</li>



<li class=""><strong>Documentation and Maintainability:</strong> Ensuring AI-generated code meets professional standards</li>



<li class=""><strong>Security Awareness:</strong> Analyzing and interpreting generated code for potential security vulnerabilities</li>



<li class=""><strong>Project Management:</strong> Breaking large tasks into manageable, AI-appropriate subtasks</li>
</ul>



<h2 class="wp-block-heading"><strong>Pedagogical Considerations Across All Stages</strong></h2>



<h3 class="wp-block-heading"><strong>Avoiding Over-Reliance</strong></h3>



<p class="">Studies have found that students who use LLMs for assignments performed better on those problems but worse on overall assessments, with excessive dependence impairing essential independent problem-solving skills. To prevent this:</p>



<ul class="wp-block-list">
<li class="">Require AI-free coding exercises and assessments</li>



<li class="">Implement &#8220;explain your reasoning&#8221; requirements for AI-assisted work</li>



<li class="">Create assignments that require creative problem-solving beyond AI capabilities</li>
</ul>



<h3 class="wp-block-heading"><strong>Scaffolding Learning Progression</strong></h3>



<p class="">LLMs can serve as scaffolding strategies throughout the problem-solving process, helping clarify goals, facilitate higher-level cognitive activity, and promote continuous improvement through guided reflection. Effective scaffolding includes:</p>



<ul class="wp-block-list">
<li class=""><strong>Structured Progression:</strong> Move from highly guided to increasingly independent use</li>



<li class=""><strong>Metacognitive Reflection:</strong> Regular discussions about when and why to use AI assistance</li>



<li class=""><strong>Error Analysis:</strong> Studying and learning from AI mistakes and limitations</li>
</ul>



<h3 class="wp-block-heading"><strong>Assessment Adaptation</strong></h3>



<p class="">Traditional assessment methods may need revision:</p>



<ul class="wp-block-list">
<li class=""><strong>Process-Focused Evaluation:</strong> Assess problem-solving approach, not just final code</li>



<li class=""><strong>Collaborative Assessment:</strong> Evaluate human-AI teamwork effectiveness</li>



<li class=""><strong>Transfer Testing:</strong> Ensure students can work independently when AI is unavailable</li>
</ul>



<h3 class="wp-block-heading"><strong>Ethical Considerations</strong></h3>



<p class="">Address challenges around academic integrity while upholding the goal of developing competent, ethical software professionals:</p>



<ul class="wp-block-list">
<li class="">Clear policies on appropriate AI use in different contexts</li>



<li class="">Discussion of professional ethics and AI tool limitations</li>



<li class="">Training in attribution and intellectual property considerations</li>
</ul>



<h2 class="wp-block-heading"><strong>Implementation Recommendations</strong></h2>



<ol class="wp-block-list">
<li class=""><strong>Start with Fundamentals:</strong> Ensure students have basic programming competency before introducing AI tools</li>



<li class=""><strong>Progressive Complexity:</strong> Move through stages systematically, not skipping developmental steps</li>



<li class=""><strong>Regular Calibration:</strong> Frequently assess whether students maintain independent problem-solving abilities</li>



<li class=""><strong>Professional Context:</strong> Connect each stage to real-world software development practices</li>



<li class=""><strong>Continuous Adaptation:</strong> As purpose-built educational AI systems become more sophisticated and aligned with learning science principles, adjust approaches accordingly</li>
</ol>



<p class="">This framework acknowledges that LLMs capable of generating accurate source code from natural-language prompts are likely to improve professional developer productivity while ensuring that students develop both the technical skills and critical thinking abilities necessary for effective human-AI collaboration in their careers.</p>



<p class="">By implementing this structured approach, CS educators can prepare students not just to use AI tools, but to use them thoughtfully, effectively, and ethically throughout their professional development.</p>


<!-- wp:themify-builder/canvas /--><p>The post <a href="https://mikelynchgames.com/education-and-technology/a-pedagogical-framework-for-teaching-effective-llm-use-in-programming-education/">A Pedagogical Framework for Teaching Effective LLM Use in Programming Education</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikelynchgames.com/education-and-technology/a-pedagogical-framework-for-teaching-effective-llm-use-in-programming-education/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1925</post-id>	</item>
		<item>
		<title>Game Based Economies</title>
		<link>https://mikelynchgames.com/education-and-technology/gamified-learning/game-based-economies/</link>
					<comments>https://mikelynchgames.com/education-and-technology/gamified-learning/game-based-economies/#respond</comments>
		
		<dc:creator><![CDATA[Michael Lynch]]></dc:creator>
		<pubDate>Fri, 06 Jun 2025 16:56:48 +0000</pubDate>
				<category><![CDATA[Education and Technology]]></category>
		<category><![CDATA[Gamified Learning]]></category>
		<category><![CDATA[GBL]]></category>
		<guid isPermaLink="false">https://mikelynchgames.com/?p=1895</guid>

					<description><![CDATA[<img loading="lazy" width="300" height="171" src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?fit=300%2C171&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="Building Game-based Economies" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=1160%2C665&amp;ssl=1 1160w" sizes="(max-width: 300px) 100vw, 300px" /><p><img loading="lazy" width="1024" height="585" src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?fit=1024%2C585&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="Building Game-based Economies" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=260%2C150&amp;ssl=1 260w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>Building an economy for game-based learning projects</p>
<p>The post <a href="https://mikelynchgames.com/education-and-technology/gamified-learning/game-based-economies/">Game Based Economies</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img loading="lazy" width="300" height="171" src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?fit=300%2C171&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="Building Game-based Economies" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=1160%2C665&amp;ssl=1 1160w" sizes="(max-width: 300px) 100vw, 300px" /><p><img loading="lazy" width="1024" height="585" src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?fit=1024%2C585&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="Building Game-based Economies" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/06/gbeconomies.png?resize=260%2C150&amp;ssl=1 260w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<h2 class="wp-block-heading">Introduction to Game-Based Economies</h2>



<p class="">Game-based economies are increasingly being integrated into various projects as a tool to drive user engagement and motivate desired user behaviors. These systems, largely centered around gamification, aim to encourage users to achieve specific outcomes through structured incentives. While this approach has found robust applications in sectors learning, it&#8217;s essential to contemplate whether it&#8217;s the right choice for your project, as it carries both advantages and potential pitfalls. </p>



<p class="">In the context of learning, gamification serves as a powerful motivator. It can significantly enhance user engagement by appealing to innate desires for achievement and recognition. However, it&#8217;s crucial to remember that with great power comes great responsibility. Gamification isn&#8217;t a universal solution and can sometimes lead users to prioritize the game-like aspects over the actual learning objectives. This distraction can manifest when users focus excessively on earning points or rewards, potentially undermining the primary goal of fostering genuine understanding or skill development.</p>



<p class="">Particularly in educational settings, this approach works best when learners are inherently inclined to engage with the material, we call this internally motivated. For adult learners, this can be beneficial as they are typically more conscious of gamification strategies and align these external motivations with their internal goals. They acknowledge the gamified elements as tools to enhance their learning journey, rather than the end goal.</p>



<p class="">However, the dynamic shifts with younger users, who may not yet possess the internal drive to engage deeply with the content. In such cases, gamification can lead to surface-level engagement, where the focus shifts from meaningful learning to merely gaming the system—achieving the rewards without achieving the actual learning outcomes. </p>



<p class="">I can&#8217;t stress enough how perilous this can be for a learning application. Consider the scenario where you&#8217;ve poured your heart and soul into crafting an exceptional educational product. You launch it with high hopes and initially see fantastic levels of user engagement. Your community seems to be thriving, and your mission to foster learning and growth feels within reach—except, here’s the catch. If your users end up simply mastering the art of exploiting the point system instead of truly learning, then all that effort amounts to little more than squandering both their time and your resources. In a free-to-use model, you’ll witness users frittering away precious hours, while you’re left to bear the financial burden. In a subscription-based model, it may seem like a financial success, but picture the disappointed parents who have entrusted you with their children’s education, only to find that their investment is yielding hollow results. You owe it to them—and yourself—to ensure that this tool empowers genuine learning, not just savvy navigation of a game.</p>



<p class="">Ultimately, while a game-based economy can be a valuable tool to increase activity and engagement, it should be carefully implemented with a clear focus on genuine objectives rather than on the mechanics of the game itself. Balancing gamified elements with the core mission of your platform is crucial to ensure that these strategies facilitate rather than distract from the intended outcomes.</p>



<h2 class="wp-block-heading">Taxonomy of a game-based economy</h2>



<p class="">Let&#8217;s begin with an overview of the elements found in game-based systems.</p>



<h3 class="wp-block-heading">Game-based currency</h3>



<p class="">Game-based currency serves as the central pillar of gamified systems, transforming user engagement into quantifiable rewards that drive interaction and motivation. These currencies, whether they take the form of points, badges, or virtual tokens, act as tools to incentivize users to participate in activities that align with the platform’s goals. By offering tangible metrics for achievement, game-based currencies tap into the intrinsic desire for accomplishment and recognition, encouraging users to engage more deeply and frequently. This digital economy not only enhances the user experience by providing a sense of progression and purpose but also fosters a dynamic community that thrives on active participation and shared success. As we explore the different types of game-based currency, it&#8217;s essential to understand how these tools can be tailored to fit the unique needs and objectives of any interactive platform.</p>



<h4 class="wp-block-heading">1.&nbsp;<strong>Reputation Points:</strong></h4>



<ul class="wp-block-list">
<li class=""><strong>Earning Points:</strong> Users can earn points by asking good questions, providing helpful answers, upvoting, receiving upvotes, and other community engagement.</li>



<li class=""><strong>Spending Points:</strong> Allow users to spend points on certain privileges or community features, such as promoting questions, highlighting posts, or unlocking certain content.</li>
</ul>



<h4 class="wp-block-heading">2.&nbsp;<strong>Badges and Achievements:</strong></h4>



<ul class="wp-block-list">
<li class=""><strong>Diverse Badges:</strong> Create badges for different activities, such as answering the first question, receiving a certain number of upvotes, or contributing for several consecutive days.</li>



<li class=""><strong>Tiered Achievements:</strong> Offer levels within badges for continued achievement, creating a tiered system that encourages long-term engagement.</li>
</ul>



<h4 class="wp-block-heading">3.&nbsp;<strong>Virtual Currency:</strong></h4>



<ul class="wp-block-list">
<li class=""><strong>Introduction of a Currency System:</strong> Implement a system where points translate into a virtual currency that can be used for various site features, such as unlocking premium content, customizing the user profile, or accessing advanced tools.</li>



<li class=""><strong>Purchases and Investments:</strong> Allow users to use currency to invest in other users&#8217; questions or projects, with potential returns based on the popularity or impact of those projects.</li>
</ul>



<h4 class="wp-block-heading">4. <strong>Leaderboard Rankings:</strong></h4>



<ul class="wp-block-list">
<li class=""><strong>Global and Topic-Based Leaderboards:</strong> Display rankings globally and within specific topics to encourage competition and specialization.</li>



<li class=""><strong>Weekly/Monthly Challenges:</strong> Introduce time-based challenges or events that reward top participants with bonuses or unique badges.</li>
</ul>



<h3 class="wp-block-heading">Mechanics to earn the currency</h3>



<p class="">The mechanics of earning currency in a game-based economy are integral to fostering active user engagement and driving desired behaviors. These systems can encompass a variety of methods, such as completing tasks or challenges, participating in activities that align with platform goals, or achieving specific milestones. For instance, users might earn points by contributing valuable content, answering questions, or consistently engaging with the community. Additionally, rewarding collaborative efforts, like team-based projects or peer mentoring, can further encourage interaction and a sense of community. However, it’s crucial that the earning mechanisms remain closely tied to meaningful actions that support the platform&#8217;s overarching mission. This alignment ensures that users are motivated not only to collect currency but to contribute positively to the overall ecosystem.</p>



<p class="">Here are some examples of mechanicts in games:</p>



<h4 class="wp-block-heading">1. <strong>Quests and Missions:</strong></h4>



<ul class="wp-block-list">
<li class=""><strong>Daily/Weekly Quests:</strong> Provide short-term objectives to guide user activity, such as answering a set number of questions in a day or participating in moderation activities.</li>



<li class=""><strong>Long-Term Missions:</strong> Develop broader goals that involve sustained interaction over time, rewarding users upon completion with significant rewards.</li>
</ul>



<h4 class="wp-block-heading">2. <strong>Community Events:</strong></h4>



<ul class="wp-block-list">
<li class=""><strong>Hackathons or Competitions:</strong> Organize events where users collaborate or compete on solving problems or building projects, with points and prizes as rewards.</li>



<li class=""><strong>Themed Weekends:</strong> Host special events related to current events in tech, encouraging discussions or creative content related to recent innovations.</li>
</ul>


<!-- wp:themify-builder/canvas /-->


<h3 class="wp-block-heading">Spending &amp; Using the currency</h3>



<p class="">Spending and using currency in a game-based system is where user engagement transforms into tangible benefits, often serving as a powerful motivator for continued participation. By accumulating currency, users can unlock a variety of rewards and features, such as exclusive content, advanced tools, or customization options that enhance their personal experience. Additionally, currency can be used to amplify a user&#8217;s influence and visibility, allowing them to promote their contributions or elevate their status within the community. This exchange not only provides immediate gratification but also fosters a deeper connection to the platform&#8217;s ecosystem, as users invest earned currency back into the community. By offering meaningful opportunities for spending currency, platforms can maintain engagement levels and ensure that users continually feel invested in their growth and the community’s success.</p>



<h3 class="wp-block-heading">1.&nbsp;<strong>Transactional Use:</strong></h3>



<ul class="wp-block-list">
<li class=""><strong>Purchasing:</strong> Users can exchange currency for goods or services within the platform, such as merchandise, access to premium content, or digital products.</li>



<li class=""><strong>Trading or Bartering:</strong> Some platforms allow users to trade or sell items/services using currency, promoting user interaction. Or simply trade the currency, give gifts, etc.</li>
</ul>



<h3 class="wp-block-heading">2.&nbsp;<strong>Access and Privileges:</strong></h3>



<ul class="wp-block-list">
<li class=""><strong>Unlocking Features:</strong> Points may be used to unlock site functionalities such as advanced search, insights tools, or content creation features.</li>



<li class=""><strong>Gaining Privileges:</strong> Users can &#8220;purchase&#8221; roles or access to areas (like private forums or beta features) that enhance their community standing or user experience.</li>
</ul>



<h3 class="wp-block-heading">3.&nbsp;<strong>Customization and Personalization:</strong></h3>



<ul class="wp-block-list">
<li class=""><strong>Avatar and Profile Enhancements:</strong> Currency can be used for cosmetic upgrades such as custom avatars, badges, themes, or profile enhancements.</li>



<li class=""><strong>Personal Space Customization:</strong> Some platforms allow users to customize personal spaces or dashboards for a unique user experience.</li>
</ul>



<h3 class="wp-block-heading">4.&nbsp;<strong>Influence and Visibility:</strong></h3>



<ul class="wp-block-list">
<li class=""><strong>Content Promotion:</strong> Users might spend points to promote their questions, answers, or posts, increasing visibility.</li>



<li class=""><strong>Voting Power:</strong> Enhance the weight of a user’s vote, allowing them to have more influence in polls or decision-making processes.</li>
</ul>



<h3 class="wp-block-heading">5.&nbsp;<strong>Community Engagement and Rewards:</strong></h3>



<ul class="wp-block-list">
<li class=""><strong>Gifting:</strong> Users can gift points or items to others as a form of recognition or reward for contributions.</li>



<li class=""><strong>Event Participation:</strong> Use points for entry into special events, contests, or exclusive experiences.</li>
</ul>



<h3 class="wp-block-heading">6.&nbsp;<strong>Investment and Growth:</strong></h3>



<ul class="wp-block-list">
<li class=""><strong>Project Investment:</strong> Users could invest points in community projects or ideas, potentially sharing in the success if the project does well.</li>



<li class=""><strong>Skill or Knowledge Purchases:</strong> Some systems allow investment in learning resources or mentorship opportunities to aid skill development.</li>
</ul>



<h3 class="wp-block-heading">7.&nbsp;<strong>Conversion and Real-world Applications:</strong></h3>



<ul class="wp-block-list">
<li class=""><strong>Converting to Real-world Benefits:</strong> Allow users to convert in-game currency into real-world benefits, like gift cards or charitable donations.</li>



<li class=""><strong>Marketplace Use:</strong> Enable purchases in a marketplace, where points could potentially be used for goods or services provided by partner organizations.</li>
</ul>



<h3 class="wp-block-heading">8.&nbsp;<strong>Savings and Interest:</strong></h3>



<ul class="wp-block-list">
<li class=""><strong>Staking or Saving:</strong> Encourage users to save points, possibly earning interest or rewards over time for not spending immediately.</li>
</ul>



<p class="">Conclusion</p>



<p class="">So here we are, standing at the threshold of transforming user engagement into a thriving, dynamic community. The journey ahead promises not only to reshape how interactions occur but also to redefine success on your platform. Game-based economies offer a blend of challenge and innovation, requiring thoughtful integration and a clear vision. The upcoming series will dive deeper into the specific elements—like points, badges, and virtual currencies—that form the backbone of these systems, showing how each component can be meticulously crafted to support individual project goals. As you embark on this adventure of implementation, remember that while the mechanics may be intricate, the reward is a vibrant ecosystem teeming with motivated and active participants. So gear up for the journey—a game-based economy may just be the catalyst that creates the next great learning platform.<br></p>
<p>The post <a href="https://mikelynchgames.com/education-and-technology/gamified-learning/game-based-economies/">Game Based Economies</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikelynchgames.com/education-and-technology/gamified-learning/game-based-economies/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1895</post-id>	</item>
		<item>
		<title>DotFiles: New Computer Setup Automation</title>
		<link>https://mikelynchgames.com/software-development/dotfiles-new-computer-setup-automation/</link>
					<comments>https://mikelynchgames.com/software-development/dotfiles-new-computer-setup-automation/#respond</comments>
		
		<dc:creator><![CDATA[Michael Lynch]]></dc:creator>
		<pubDate>Wed, 12 Mar 2025 06:52:00 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://mikelynchgames.com/?p=1872</guid>

					<description><![CDATA[<img loading="lazy" width="300" height="159" src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?fit=300%2C159&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="Script output" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?w=1172&amp;ssl=1 1172w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?resize=300%2C159&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?resize=1024%2C543&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?resize=768%2C408&amp;ssl=1 768w" sizes="(max-width: 300px) 100vw, 300px" /><p><img loading="lazy" width="1172" height="622" src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?fit=1172%2C622&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="Script output" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?w=1172&amp;ssl=1 1172w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?resize=300%2C159&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?resize=1024%2C543&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?resize=768%2C408&amp;ssl=1 768w" sizes="(max-width: 1172px) 100vw, 1172px" /></p>
<p>Introduction Every time I get a new Mac, I update my process for setting up a new mac, and then I let it languish as time passes, until, I get a new computer. My previous post was kept up to date-ish as time went on, but this post is a revision to that one, where [&#8230;]</p>
<p>The post <a href="https://mikelynchgames.com/software-development/dotfiles-new-computer-setup-automation/">DotFiles: New Computer Setup Automation</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img loading="lazy" width="300" height="159" src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?fit=300%2C159&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="Script output" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?w=1172&amp;ssl=1 1172w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?resize=300%2C159&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?resize=1024%2C543&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?resize=768%2C408&amp;ssl=1 768w" sizes="(max-width: 300px) 100vw, 300px" /><p><img loading="lazy" width="1172" height="622" src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?fit=1172%2C622&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="Script output" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?w=1172&amp;ssl=1 1172w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?resize=300%2C159&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?resize=1024%2C543&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-1.png?resize=768%2C408&amp;ssl=1 768w" sizes="(max-width: 1172px) 100vw, 1172px" /></p>
<h2 class="wp-block-heading">Introduction</h2>



<p class="">Every time I get a new Mac, I update my process for setting up a new mac, and then I let it languish as time passes, until, I get a new computer. My <a href="https://mikelynchgames.com/software-development/setting-up-a-new-mac-for-development/">previous post</a> was kept up to date-ish as time went on, but this post is a revision to that one, where instead of focusing on individual commands that I have to remember, focusing on setting up a script that will just set everything up, and then go away.</p>



<p class="">This was started with my dotfiles updates. As I have multiple computers, my goal was to have all of them have a terminal that was similar enough, that it would not be difficult to move between them. However, I realize that it&#8217;s not just shell aliases and shell prompts that need to be kept aligned for this to keep working. </p>



<p class="">For one thing, I move between Windows, MacOS X, and Ubuntu (Linux) often. On windows, I use WSL, so I use mostly Ubuntu, and then I have several computers that run linux at home, that also use Ubuntu. So between the multiple OSes and the various different purposes, I found that I don&#8217;t have a one size fits all script that handles them, until now!</p>



<p class="">(I&#8217;m kidding, if you were hoping that I had a one size fits all script that set up Windows/Ubuntu/OSX for multiple different purposes, I think that would be amazing, but unlikely something I would put much effort into building, as the other issue with the dotfiles and the setups for development is; it&#8217;s always changing. </p>



<p class="">I used to use <code>bash</code>, now I use <code>zsh</code>, at one point I had a lot of python setup scripts, and now I use <code>uv</code>. There are always changes and updates. However I have not given up entirely on this goal. I&#8217;m still maintaining dotFiles. I still plan to upate them once every 2-3 years <img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='72'%20height='72'%20viewBox=%270%200%2072%2072%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" width="72" height="72" data-tf-src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="tf_svg_lazy wp-smiley" style="height: 1em; max-height: 1em;" /><noscript><img data-tf-not-load src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></noscript></p>



<p class="">Here is the original post.</p>



<h2 class="wp-block-heading">Setting Up a New Mac for Development</h2>



<p class="">In gitHub I have a repo called, appropriately, &#8220;dotFiles&#8221;. This is a great place to start if you are also trying to set up a mac for development, just <a href="https://github.com/search?q=dotfiles&amp;type=repositories">search gitHub</a> for dotFiles, and you will find many, many people who have already tried to help you set up your Mac, just like I&#8217;m doing now. There are many flavors of dotFiles, some that are just the shell configurations, and some that attempt to add software and are os specific. Mine are a combination of both, the configuration files are good for multiple zsh shells.</p>



<h3 class="wp-block-heading">Step 1: Pulling the Repo</h3>



<p class="">The first thing is to pull the dotFiles repository from git. It&#8217;s important to decide where to do that from. Some dotFiles (as mine) are designed to be pulled into your home directory. That is not a great place to have a git repository in general, one reason for this is that you will have ~/Documents, ~/Downloads, and other various folders hanging off of that home folder, so it&#8217;s not ideal to have that be a gitHub repository. I have experimented with two approaches:</p>



<ul class="wp-block-list">
<li class=""><strong>SymLink</strong>: The first is to pull the repository to another folder (say ~/dev/dotFiles), and then symlink the folders to your home directory. This approach benifits from being able to keep the dotFiles in sync with your repository, so changes can continue to be made, and pushed back to the repo, or pulled from another machine. The con of this system is symLinks mean you can&#8217;t make a change for any one computer, as it&#8217;s in the repo (of course you can create a branch, and manage it that way.)</li>



<li class=""><strong>Shallow Pull</strong>: The second way was to do a shallow pull. In this way you can actually pull it right into your home directory, and then break the connection to your repo. The good is that it&#8217;s independent from the repo, so changes can be made, the bad is that you can&#8217;t make changes and push it up.</li>
</ul>



<p class="">So those are the options I&#8217;ve tried, there may be others. </p>



<p class="">In the end, I ended up going with the Shallow Pull Option, but I do still think the symlink might be the way to go.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
 cd ~
 git clone --depth=1 git@github.com:nycynik/dotFiles.git .dotfiles
 rm -rf ./.dotfiles/.git
</pre></div>

<!-- wp:themify-builder/canvas /-->


<p class="">After pulling the dotfiles, you then remove the .git directory, severing the link to the original repository, and since you have only pulled the most recent files (no history) that is all you need to complete the shallow copy.</p>



<p class="">As you can see this is being run from the home directory, again, if you opt for the symlink version, you would place it elsewhere, and then symlink the <code>.dotfiles</code> folder to your home.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
cd &lt;somewhere dev files are saved&gt;
git clone git@github.com:nycynik/dotFiles.git 
ln -s dotFiles/.dotfiles ~/.dotFiles
</pre></div>


<h3 class="wp-block-heading">Step 2: Run the installation script</h3>



<p class="">As I said, this dotfiles is not just a configuration, but also a setup script. so the next step is to run the script and have it work the magic setup. Here we go!</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
cd ~
source .dotfiles/setup.sh
</pre></div>


<p class="">The script will then as you a few questions, and begin installing all the things. </p>



<figure class="wp-block-image size-large"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='543'%20viewBox=%270%200%201024%20543%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" data-recalc-dims="1" decoding="async" width="1024" height="543" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image.png?resize=1024%2C543&#038;ssl=1" alt="Script output showing OS Selection" class="tf_svg_lazy wp-image-1875" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image.png?resize=1024%2C543&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image.png?resize=300%2C159&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image.png?resize=768%2C408&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image.png?w=1172&amp;ssl=1 1172w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img data-recalc-dims="1" decoding="async" width="1024" height="543" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image.png?resize=1024%2C543&#038;ssl=1" alt="Script output showing OS Selection" class="wp-image-1875" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image.png?resize=1024%2C543&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image.png?resize=300%2C159&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image.png?resize=768%2C408&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image.png?w=1172&amp;ssl=1 1172w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></figure>



<p class="">The script first detects the OS, it can be wrong, so you also can choose which OS you are running. Next it collects some basic information it uses during the configuration. I would love to expand that at some point to include which development tools you wanted to use. </p>



<p class="">Finally, the script runs and sets up the environment. It still has some bash configuration in it, but it&#8217;s mostly focused on zsh configuration. </p>



<p class="">It may still be interactive, as some of the setup steps require authentication, but mostly it should run smoothly, and when finished you will see a set of ToDos that you may want to do.</p>



<figure class="wp-block-image size-large"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='486'%20viewBox=%270%200%201024%20486%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" data-recalc-dims="1" decoding="async" width="1024" height="486" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-2.png?resize=1024%2C486&#038;ssl=1" alt="Script final output showing Post Installation Tasks." class="tf_svg_lazy wp-image-1879" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-2.png?resize=1024%2C486&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-2.png?resize=300%2C142&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-2.png?resize=768%2C364&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-2.png?resize=1536%2C728&amp;ssl=1 1536w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-2.png?w=1881&amp;ssl=1 1881w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img data-recalc-dims="1" decoding="async" width="1024" height="486" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-2.png?resize=1024%2C486&#038;ssl=1" alt="Script final output showing Post Installation Tasks." class="wp-image-1879" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-2.png?resize=1024%2C486&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-2.png?resize=300%2C142&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-2.png?resize=768%2C364&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-2.png?resize=1536%2C728&amp;ssl=1 1536w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/03/image-2.png?w=1881&amp;ssl=1 1881w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></figure>



<p class="">There is also a brew log that should be reviewed as it&#8217;s often the case that brew has some nifty suggestions of it&#8217;s own. The log is at <code>${HOME}/.dotfiles/brew_log.log</code>, this is often the same as <code>~/.dotfiles/brew_log.log</code>.</p>



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



<p class="">So, in the end this script worked on all three of my setups, WSL, Linux, and OSX. I don&#8217;t have much of a setup for actual Windows. There would be a lot of additional work to get that to work. I think the main thing it would have to do is setup WSL <img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='72'%20height='72'%20viewBox=%270%200%2072%2072%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" width="72" height="72" data-tf-src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="tf_svg_lazy wp-smiley" style="height: 1em; max-height: 1em;" /><noscript><img data-tf-not-load src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></noscript></p>



<p class="">This script and the combined configuration files are all available in the same <a href="https://github.com/nycynik/dotFiles">git repo</a>. </p>



<p class=""></p>
<p>The post <a href="https://mikelynchgames.com/software-development/dotfiles-new-computer-setup-automation/">DotFiles: New Computer Setup Automation</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikelynchgames.com/software-development/dotfiles-new-computer-setup-automation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1872</post-id>	</item>
		<item>
		<title>Moving Swiftly, to Dart</title>
		<link>https://mikelynchgames.com/software-development/moving-swiftly-to-dart/</link>
					<comments>https://mikelynchgames.com/software-development/moving-swiftly-to-dart/#respond</comments>
		
		<dc:creator><![CDATA[Michael Lynch]]></dc:creator>
		<pubDate>Wed, 29 Jan 2025 20:03:00 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://mikelynchgames.com/?p=1820</guid>

					<description><![CDATA[<img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='300'%20viewBox=%270%200%20300%20300%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="300" height="300" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?fit=300%2C300&amp;ssl=1" class="tf_svg_lazy webfeedsFeaturedVisual wp-post-image" alt="ios to dart image" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=768%2C768&amp;ssl=1 768w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="300" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?fit=300%2C300&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="ios to dart image" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=768%2C768&amp;ssl=1 768w" sizes="(max-width: 300px) 100vw, 300px" /></noscript><p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='1024'%20viewBox=%270%200%201024%201024%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="1024" height="1024" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?fit=1024%2C1024&amp;ssl=1" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="ios to dart image" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=768%2C768&amp;ssl=1 768w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img width="1024" height="1024" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?fit=1024%2C1024&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="ios to dart image" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=768%2C768&amp;ssl=1 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></p>
<p>When you’ve spent years immersed in building sleek and responsive apps on iOS using Swift and Objective-C, the opportunity to delve into new territories like Dart and Flutter presents itself as an exciting adventure. I recently embarked on a journey to learn to build apps with Flutter, and this is my initial experience. I will [&#8230;]</p>
<p>The post <a href="https://mikelynchgames.com/software-development/moving-swiftly-to-dart/">Moving Swiftly, to Dart</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='300'%20viewBox=%270%200%20300%20300%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="300" height="300" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?fit=300%2C300&amp;ssl=1" class="tf_svg_lazy webfeedsFeaturedVisual wp-post-image" alt="ios to dart image" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=768%2C768&amp;ssl=1 768w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="300" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?fit=300%2C300&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="ios to dart image" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=768%2C768&amp;ssl=1 768w" sizes="(max-width: 300px) 100vw, 300px" /></noscript><p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='1024'%20viewBox=%270%200%201024%201024%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="1024" height="1024" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?fit=1024%2C1024&amp;ssl=1" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="ios to dart image" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=768%2C768&amp;ssl=1 768w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img width="1024" height="1024" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?fit=1024%2C1024&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="ios to dart image" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/iostodart.png?resize=768%2C768&amp;ssl=1 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></p><!-- wp:themify-builder/canvas /-->


<p class="">When you’ve spent years immersed in building sleek and responsive apps on iOS using Swift and Objective-C, the opportunity to delve into new territories like Dart and Flutter presents itself as an exciting adventure. I recently embarked on a journey to learn to build apps with Flutter, and this is my initial experience. I will say, that I&#8217;m primarily still focused on iOS app development, but I am always interested in being able to offer Android Apps in addition to the iOS apps. And that is typically difficult to do, having to manage two individual apps can be quite time-consuming. Every update in one requires an update in the other, and you also have to keep on top of both OS revisions, tool revisions, etc. It&#8217;s quite a lot to expect a single engineer to manage Android and iOS development well. So the idea of using  a cross-platform tool is very exciting. </p>



<h3 class="wp-block-heading">The Entryway: Dart and Flutter</h3>



<p class="">The Dart language reminded me of Kotlin, or Java. Dart&#8217;s syntax is clear and concise, and though it deviates from Swift, I found it readable and pleasant. Dart can be executed using a Dart virutal machine and Just-In-Time compilation and/or it can be compiled to native code. Offering both makes development easier, and production build run fast. I really enjoyed Dart.</p>



<p class="">Flutter is like a robust, externally sourced framework that transforms UI building. It reminds me a bit of Apache Flask. Here is a random example of flask and flutter for a login screen, just to show how they are similar. I suppose all UI frameworks are similar, and I also saw similarities with UI building in iOS (but lacking the awesome tooling of XCode)</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-syntaxhighlighter-code "><pre class="brush: xml; gutter: false; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:Application xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot; 
               xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot; 
               xmlns:mx=&quot;library://ns.adobe.com/flex/mx&quot; 
               minWidth=&quot;955&quot; minHeight=&quot;600&quot;&gt;
    
    &lt;s:VGroup horizontalAlign=&quot;center&quot; verticalAlign=&quot;middle&quot; width=&quot;100%&quot; height=&quot;100%&quot;&gt;
        &lt;s:Label text=&quot;Login&quot; fontSize=&quot;24&quot; marginBottom=&quot;20&quot;/&gt;
        &lt;s:Form width=&quot;300&quot;&gt;
            &lt;s:FormItem label=&quot;Username:&quot;&gt;
                &lt;s:TextInput id=&quot;usernameInput&quot;/&gt;
            &lt;/s:FormItem&gt;
            &lt;s:FormItem label=&quot;Password:&quot;&gt;
                &lt;s:TextInput id=&quot;passwordInput&quot; displayAsPassword=&quot;true&quot;/&gt;
            &lt;/s:FormItem&gt;
            &lt;s:Button label=&quot;Login&quot; click=&quot;login()&quot;/&gt;
        &lt;/s:Form&gt;
    &lt;/s:VGroup&gt;
    
    &lt;fx:Script&gt;
        &lt;!&#x5B;CDATA&#x5B;
            private function login():void {
                // Handle login logic here
                var username:String = usernameInput.text;
                var password:String = passwordInput.text;
                trace(&quot;Username: &quot; + username + &quot;, Password: &quot; + password);
            }
        ]]&gt;
    &lt;/fx:Script&gt;

&lt;/s:Application&gt;
</pre></div></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"><div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; gutter: false; title: ; notranslate">
import &#039;package:flutter/material.dart&#039;;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: &#039;Flutter Login&#039;,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: LoginScreen(),
    );
  }
}

class LoginScreen extends StatelessWidget {
  final TextEditingController _usernameController = TextEditingController();
  final TextEditingController _passwordController = TextEditingController();

  void _login(BuildContext context) {
    final username = _usernameController.text;
    final password = _passwordController.text;
    print(&#039;Username: $username, Password: $password&#039;);
    // Handle login logic here
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(&#039;Login&#039;),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: &lt;Widget&gt;&#x5B;
            TextField(
              controller: _usernameController,
              decoration: InputDecoration(labelText: &#039;Username&#039;),
            ),
            TextField(
              controller: _passwordController,
              decoration: InputDecoration(labelText: &#039;Password&#039;),
              obscureText: true,
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () =&gt; _login(context),
              child: Text(&#039;Login&#039;),
            ),
          ],
        ),
      ),
    );
  }
}
</pre></div></div>
</div>



<h3 class="wp-block-heading">Widgets: Flutter&#8217;s Building Blocks</h3>



<p class="">In Flutter, everything is a widget—a bit like UIView, but with greater range and composability. Stateless and Stateful widgets are Flutter&#8217;s equivalents to plain old structuring and dynamic, event-driven view controllers. Understanding widget trees becomes pivotal, much like mastering UIView hierarchies in iOS.</p>



<p class="">The example above shows quite a few widgets. But it really gets interesting when you are building an app, and deciding which widgets you want to use for what. There are many choices and best practices to learn as you go.</p>



<h3 class="wp-block-heading">Cocoapods? Meet Pubspec.yaml</h3>



<p class="">One impending question was, where&#8217;s my Podfile? In Flutter, <code><a href="https://dart.dev/tools/pub/pubspec" target="_blank" rel="noreferrer noopener nofollow">pubspec.yaml</a></code> steps in. This Flutter file manages your project&#8217;s packages—akin but not quite a direct replacement to CocoaPods in the iOS ecosystem. After adding dependencies here, running ‘<code>flutter pub get</code>’ will fetch the necessary packages. Here is an excerpt of the pubspec from the app. As you can see it has dependencies, but also defines the app, including assets and fonts.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: yaml; title: ; notranslate">
name: fc_mobile
description: &quot;Client  Mobile app mostly focused on reading content.&quot;
# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: &#039;none&#039; # Remove this line if you wish to publish to pub.dev

# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version: 1.0.0+1

environment:
  sdk: ^3.5.3

# Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions
# consider running `flutter pub upgrade --major-versions`. Alternatively,
# dependencies can be manually updated by changing the version numbers below to
# the latest version available on pub.dev. To see which dependencies have newer
# versions available, run `flutter pub outdated`.
dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^1.0.8

  # adding Firebase libs
  firebase_core: ^3.4.0
  firebase_auth: ^5.2.0
  # cloud_functions: ^4.1.0
  cloud_firestore: ^5.4.0
  firebase_storage: ^12.2.0
  firebase_ui_auth: ^1.16.0
  google_fonts: ^6.2.1

  # intl
  flutter_localizations:
    sdk: flutter
  easy_localization: ^3.0.0
  
  # cached images
  cached_network_image: ^3.3.0
</pre></div>


<h3 class="wp-block-heading">Making the UI iOS-Like</h3>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p class="">Creating an iOS-like UI in Flutter is undoubtedly possible. Flutter’s <a href="https://docs.flutter.dev/ui/widgets/cupertino" target="_blank" rel="noreferrer noopener nofollow">Cupertino library</a> translates familiar native iOS aesthetics, from navigation bars to icons, into the widget ecosystem. However, it’s not plug-and-play. Attention to design patters and some fine-tuning, like adjusting fonts and icons, goes a long way in capturing that sleek iOS feel.</p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-medium"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='294'%20viewBox=%270%200%20300%20294%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" data-recalc-dims="1" decoding="async" width="300" height="294" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/CupertinoFormSection.png?resize=300%2C294&#038;ssl=1" alt="" class="tf_svg_lazy wp-image-1823" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/CupertinoFormSection.png?resize=300%2C294&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/CupertinoFormSection.png?w=738&amp;ssl=1 738w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img data-recalc-dims="1" decoding="async" width="300" height="294" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/CupertinoFormSection.png?resize=300%2C294&#038;ssl=1" alt="" class="wp-image-1823" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/CupertinoFormSection.png?resize=300%2C294&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2025/01/CupertinoFormSection.png?w=738&amp;ssl=1 738w" sizes="(max-width: 300px) 100vw, 300px" /></noscript></figure>
</div>
</div>



<h3 class="wp-block-heading">Building for iOS</h3>



<p class="">When it’s time to build for iOS, Flutter’s integration with Xcode simplifies the process. Running ‘<code>flutter run</code>’ felt parallel to the smooth process within Xcode—after getting provisioning profiles and certificates in order, of course. The Flutter DevTools also provide a user-friendly route for debugging, offering instruments that are intuitive even for seasoned iOS developers.</p>



<h3 class="wp-block-heading">The Ecosystem and Community</h3>



<p class="">Whenever I hit roadblocks, the Flutter and Dart community emerged as an invaluable resource. Thanks to detailed documentation and a large community, finding solutions and exploring examples felt very collaborative. Platforms like GitHub are teeming with open-source plugins to augment your apps. For instance, <a href="https://stackoverflow.com/questions/tagged/flutter" target="_blank" rel="noreferrer noopener nofollow">StackOverflow</a> has quite a few answers at the ready.</p>



<h3 class="wp-block-heading">Wrapping Up</h3>



<p class="">My Flutter project was both an enlightening and challenging experience. It&#8217;s a powerful toolkit that offers cross-platform capabilities—isolating from platform constraints. The transition wasn’t without hitches, but Flutter’s structured support system smooths the learning curve significantly.</p>



<p class="">For any iOS dev contemplating venturing into the cross-platform world, Flutter seems like a dream come true. Not without issues of it&#8217;s own, and of course game development is it&#8217;s own mixture of tradeoffs, but for many business like applications, Flutter seems fantastic.</p>
<p>The post <a href="https://mikelynchgames.com/software-development/moving-swiftly-to-dart/">Moving Swiftly, to Dart</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikelynchgames.com/software-development/moving-swiftly-to-dart/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1820</post-id>	</item>
		<item>
		<title>Using X11 with WSL2</title>
		<link>https://mikelynchgames.com/software-development/using-x11-with-wsl2/</link>
					<comments>https://mikelynchgames.com/software-development/using-x11-with-wsl2/#respond</comments>
		
		<dc:creator><![CDATA[Michael Lynch]]></dc:creator>
		<pubDate>Wed, 23 Oct 2024 20:12:17 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://mikelynchgames.com/?p=1750</guid>

					<description><![CDATA[<img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='142'%20viewBox=%270%200%20300%20142%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="300" height="142" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?fit=300%2C142&amp;ssl=1" class="tf_svg_lazy webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?w=890&amp;ssl=1 890w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=300%2C142&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=768%2C362&amp;ssl=1 768w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="142" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?fit=300%2C142&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?w=890&amp;ssl=1 890w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=300%2C142&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=768%2C362&amp;ssl=1 768w" sizes="(max-width: 300px) 100vw, 300px" /></noscript><p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='890'%20height='420'%20viewBox=%270%200%20890%20420%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="890" height="420" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?fit=890%2C420&amp;ssl=1" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?w=890&amp;ssl=1 890w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=300%2C142&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=768%2C362&amp;ssl=1 768w" data-tf-sizes="(max-width: 890px) 100vw, 890px" /><noscript><img width="890" height="420" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?fit=890%2C420&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?w=890&amp;ssl=1 890w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=300%2C142&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=768%2C362&amp;ssl=1 768w" sizes="(max-width: 890px) 100vw, 890px" /></noscript></p>
<p>Recently I was building a project on a windows machine that required Cypress e2e testing. I use Windows Subsystem for Linux (WSL2) for most of my development work. I needed to be able to run X11 so that linux could run the browser on Windows OS. To accomplish this, I set up XLaunch, however there [&#8230;]</p>
<p>The post <a href="https://mikelynchgames.com/software-development/using-x11-with-wsl2/">Using X11 with WSL2</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='142'%20viewBox=%270%200%20300%20142%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="300" height="142" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?fit=300%2C142&amp;ssl=1" class="tf_svg_lazy webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?w=890&amp;ssl=1 890w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=300%2C142&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=768%2C362&amp;ssl=1 768w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="142" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?fit=300%2C142&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?w=890&amp;ssl=1 890w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=300%2C142&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=768%2C362&amp;ssl=1 768w" sizes="(max-width: 300px) 100vw, 300px" /></noscript><p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='890'%20height='420'%20viewBox=%270%200%20890%20420%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="890" height="420" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?fit=890%2C420&amp;ssl=1" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?w=890&amp;ssl=1 890w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=300%2C142&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=768%2C362&amp;ssl=1 768w" data-tf-sizes="(max-width: 890px) 100vw, 890px" /><noscript><img width="890" height="420" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?fit=890%2C420&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?w=890&amp;ssl=1 890w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=300%2C142&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=768%2C362&amp;ssl=1 768w" sizes="(max-width: 890px) 100vw, 890px" /></noscript></p>
<p class="">Recently I was building a project on a windows machine that required Cypress e2e testing. I use Windows Subsystem for Linux (WSL2) for most of my development work. I needed to be able to run X11 so that linux could run the browser on Windows OS. To accomplish this, I set up XLaunch, however there is a gotcha. The easist way to get that to work is to skip Authentication. This is never a great idea, even if this computer was not a laptop and never left the building. Thanks to <a href="https://stackoverflow.com/users/15463132/sfmontyo">sfmontyo</a>, I was able to get the setup working with authentication.</p>



<h2 class="wp-block-heading">Install XLaunch</h2>



<p class="">Step one is installing Xming, this is a set of tools that allow you to have a X Windows Server running in Windows. Hop over to their <a href="http://www.straightrunning.com/XmingNotes/" target="_blank" rel="noreferrer noopener nofollow">official site </a>and begin by downloading the installer. Once you download the installer, simply run it and follow the wizard. Once installed you are ready for the next step.</p>



<h2 class="wp-block-heading"> Configure X Authentication</h2>


<!-- wp:themify-builder/canvas /-->


<p class="">Assuming that your WSL2 operating system is Ubuntu, the following steps will work for you, you may need to adapt them if you have another OS installed. </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
sudo apt install -y xauth coreutils gawk gnome-terminal 
xauth list # this should be an empty list
magiccookie=$(echo &#039;{some-pass-phrase}&#039;|tr -d &#039;\n\r&#039;|md5sum|gawk &#039;{print $1}&#039;)
xauth add host.docker.internal:0 . $magiccookie
cp ~/.Xauthority /mnt/c/Users/{WindowsUserName}

</pre></div>


<p class="">Be sure to replace your username in the last line, and you should also change the some-pass-phrase. Considering the level of security intended here, you really only need to recall this password for the moment of this installation. After you are done here, you won&#8217;t need it again, and if you find the password some how changes, or does not work, you can follow the same steps to recreate the authentication. With that in mind, I recommend some long random string. </p>



<p class="">With that done, you have now set up authentication, and are ready to set up the terminal.</p>



<h2 class="wp-block-heading">Setup X11 for your shell</h2>



<p class="">you need to export the shell, the best option for hostname is to use docker, as show here:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
export DISPLAY=host.docker.internal:0

</pre></div>


<p class="">DISPLAY is what X11 uses as the place to send content. Since WSL runs under docker, that hostname is the same as the local Windows OS, and so this should work regardless of your IP changes and networking setup. To make this persistent, you will need to add this to your shell of choice. If using bash, you can add it to your `~/.bash.rc`, if you are using a different shell, add it as is normal for that shell.</p>



<h2 class="wp-block-heading">Setup XLaunch</h2>



<p class="">The last step is to run XLaunch on windows startup, using the authentication that was copied over in step 1. To being, open your startup folder. To do this, you can click windows, and then type run. The run dialog will show, and you can type <code>shell:startup</code> to open the folder in the explorer. </p>



<figure class="wp-block-image size-full"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='574'%20height='343'%20viewBox=%270%200%20574%20343%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" data-recalc-dims="1" decoding="async" width="574" height="343" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image.png?resize=574%2C343&#038;ssl=1" alt="Screen showing shell:startup in the run dialog." class="tf_svg_lazy wp-image-1751" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image.png?w=574&amp;ssl=1 574w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image.png?resize=300%2C179&amp;ssl=1 300w" data-tf-sizes="(max-width: 574px) 100vw, 574px" /><noscript><img data-recalc-dims="1" decoding="async" width="574" height="343" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image.png?resize=574%2C343&#038;ssl=1" alt="Screen showing shell:startup in the run dialog." class="wp-image-1751" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image.png?w=574&amp;ssl=1 574w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image.png?resize=300%2C179&amp;ssl=1 300w" sizes="(max-width: 574px) 100vw, 574px" /></noscript></figure>



<p class="">This window will open, where you need to create an alias to your VcXsv with Xauthority. You can drag and drop XLaunch from the applications folder into the window that is now open, and if you do so while holding the right click, you can have it create a shortcut.</p>



<p class="">Edit the Target, and add the command line arguments that you need to use X Authority, here is the single line that you need:</p>



<p class="">&#8220;C:\Program Files\VcXsrv\vcxsrv.exe&#8221; -multiwindow -clipboard -wgl -auth &#8220;C:\users\{youruser}\.Xauthority&#8221;</p>



<figure class="wp-block-image size-full"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='639'%20height='890'%20viewBox=%270%200%20639%20890%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" data-recalc-dims="1" decoding="async" width="639" height="890" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-1.png?resize=639%2C890&#038;ssl=1" alt="Windows dialog to set up shortcut" class="tf_svg_lazy wp-image-1752" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-1.png?w=639&amp;ssl=1 639w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-1.png?resize=215%2C300&amp;ssl=1 215w" data-tf-sizes="(max-width: 639px) 100vw, 639px" /><noscript><img data-recalc-dims="1" decoding="async" width="639" height="890" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-1.png?resize=639%2C890&#038;ssl=1" alt="Windows dialog to set up shortcut" class="wp-image-1752" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-1.png?w=639&amp;ssl=1 639w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-1.png?resize=215%2C300&amp;ssl=1 215w" sizes="(max-width: 639px) 100vw, 639px" /></noscript></figure>



<h2 class="wp-block-heading">Try it out</h2>



<p class="">Next you will need to run an X application on the host, and you should see it running in windows. Some of the XApplications that are often installed are xclock and xeyes, these were widget type applications that have stood the test of time. </p>



<figure class="wp-block-image size-medium"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='142'%20viewBox=%270%200%20300%20142%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" data-recalc-dims="1" decoding="async" width="300" height="142" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=300%2C142&#038;ssl=1" alt="running x applications" class="tf_svg_lazy wp-image-1753" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=300%2C142&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=768%2C362&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?w=890&amp;ssl=1 890w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img data-recalc-dims="1" decoding="async" width="300" height="142" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=300%2C142&#038;ssl=1" alt="running x applications" class="wp-image-1753" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=300%2C142&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?resize=768%2C362&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/10/image-2.png?w=890&amp;ssl=1 890w" sizes="(max-width: 300px) 100vw, 300px" /></noscript></figure>



<p class="">Assuming that is working for you, Congratulations! You have x11 set up with Authentication! Go you! </p>



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



<ul class="wp-block-list">
<li class="">https://support.microsoft.com/en-us/windows/configure-startup-applications-in-windows-115a420a-0bff-4a6f-90e0-1934c844e473 </li>



<li class="">https://stackoverflow.com/questions/66768148/how-to-setup-vcxsrv-for-use-with-wsl2</li>
</ul>



<p class=""></p>
<p>The post <a href="https://mikelynchgames.com/software-development/using-x11-with-wsl2/">Using X11 with WSL2</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikelynchgames.com/software-development/using-x11-with-wsl2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1750</post-id>	</item>
		<item>
		<title>Building Mobile Apps with Jenkins and macOS</title>
		<link>https://mikelynchgames.com/software-development/building-mobile-apps-with-jenkins-and-macos/</link>
					<comments>https://mikelynchgames.com/software-development/building-mobile-apps-with-jenkins-and-macos/#respond</comments>
		
		<dc:creator><![CDATA[Michael Lynch]]></dc:creator>
		<pubDate>Thu, 26 Sep 2024 22:30:00 +0000</pubDate>
				<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://mikelynchgames.com/?p=1726</guid>

					<description><![CDATA[<img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='150'%20viewBox=%270%200%20300%20150%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="300" height="150" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?fit=300%2C150&amp;ssl=1" class="tf_svg_lazy webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?w=2048&amp;ssl=1 2048w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=300%2C150&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1024%2C512&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=768%2C384&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1536%2C768&amp;ssl=1 1536w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="150" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?fit=300%2C150&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?w=2048&amp;ssl=1 2048w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=300%2C150&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1024%2C512&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=768%2C384&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1536%2C768&amp;ssl=1 1536w" sizes="(max-width: 300px) 100vw, 300px" /></noscript><p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='2048'%20height='1024'%20viewBox=%270%200%202048%201024%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="2048" height="1024" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?fit=2048%2C1024&amp;ssl=1" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?w=2048&amp;ssl=1 2048w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=300%2C150&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1024%2C512&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=768%2C384&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1536%2C768&amp;ssl=1 1536w" data-tf-sizes="(max-width: 2048px) 100vw, 2048px" /><noscript><img width="2048" height="1024" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?fit=2048%2C1024&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?w=2048&amp;ssl=1 2048w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=300%2C150&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1024%2C512&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=768%2C384&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1536%2C768&amp;ssl=1 1536w" sizes="(max-width: 2048px) 100vw, 2048px" /></noscript></p>
<p>If you&#8217;re a mobile app developer, you&#8217;ve likely heard of Jenkins—a powerful automation tool that helps streamline your build process. It’s widely used for continuous integration (CI) and continuous delivery (CD) in all sorts of development environments. But if you’re building iOS apps, Jenkins alone won’t be enough. Since Apple requires macOS to compile iOS [&#8230;]</p>
<p>The post <a href="https://mikelynchgames.com/software-development/building-mobile-apps-with-jenkins-and-macos/">Building Mobile Apps with Jenkins and macOS</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='150'%20viewBox=%270%200%20300%20150%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="300" height="150" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?fit=300%2C150&amp;ssl=1" class="tf_svg_lazy webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?w=2048&amp;ssl=1 2048w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=300%2C150&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1024%2C512&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=768%2C384&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1536%2C768&amp;ssl=1 1536w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="150" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?fit=300%2C150&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?w=2048&amp;ssl=1 2048w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=300%2C150&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1024%2C512&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=768%2C384&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1536%2C768&amp;ssl=1 1536w" sizes="(max-width: 300px) 100vw, 300px" /></noscript><p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='2048'%20height='1024'%20viewBox=%270%200%202048%201024%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="2048" height="1024" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?fit=2048%2C1024&amp;ssl=1" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?w=2048&amp;ssl=1 2048w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=300%2C150&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1024%2C512&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=768%2C384&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1536%2C768&amp;ssl=1 1536w" data-tf-sizes="(max-width: 2048px) 100vw, 2048px" /><noscript><img width="2048" height="1024" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?fit=2048%2C1024&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?w=2048&amp;ssl=1 2048w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=300%2C150&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1024%2C512&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=768%2C384&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/09/JenkinsMacOS.png?resize=1536%2C768&amp;ssl=1 1536w" sizes="(max-width: 2048px) 100vw, 2048px" /></noscript></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="">If you&#8217;re a mobile app developer, you&#8217;ve likely heard of Jenkins—a powerful automation tool that helps streamline your build process. It’s widely used for continuous integration (CI) and continuous delivery (CD) in all sorts of development environments. But if you’re building iOS apps, Jenkins alone won’t be enough. Since Apple requires macOS to compile iOS apps, you need a Mac in the equation.</p>



<p class="">In this post, I’ll guide you through setting up Jenkins to use a macOS machine as an agent for building iPhone apps. This post assumes you already have Jenkins running on your local network, and you can build your app on the Mac you&#8217;ll be using. We’ll skip SSH setup and focus on using Jenkins&#8217; inbound agent instead. Let’s dive in!</p>



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



<h2 class="wp-block-heading">How to Set Up Jenkins Agent on macOS</h2>



<h3 class="wp-block-heading">Step 1: Create the Jenkins User on Your Mac</h3>



<p class="">The first thing we need is a dedicated user account for Jenkins on your Mac. This keeps things organized and avoids permission issues down the road. Here’s how to create the user:</p>



<ol class="wp-block-list">
<li class="">Open the terminal on your Mac.</li>



<li class="">Run the following command to create a user named <code>jenkins</code>:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
sudo sysadminctl -addUser jenkins -fullName &quot;Jenkins User&quot; -password &lt;a password for jenkins&gt;
sudo dscl . -change /Users/&lt;username&gt; NFSHomeDirectory &lt;old-path&gt; &lt;new-path&gt;
sudo su jenkins
# set your shell
chsh -s /usr/bin/zsh
# setup keychain
mkdir -p /Users/jenkins/Library/Keychains
security create-keychain -p &lt;password&gt; /Users/jenkins/Library/Keychains/Login.keychain.db
security set-keychain-settings -t 3600 -l ${HOME}/Library/Keychains/login.keychain
</pre></div>


<ol start="3" class="wp-block-list">
<li class="">Give the new user permission to use all the tools required to build your app. Add the necessary setup to this user’s <code>.zshrc</code> file <code>~/.zshrc</code>. There is a whole lot of configuration for the tools you might need for development. (You might check out my other post on setting up a mac for development, much of this file is from that.</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

# if not already set up on your machine, add basic paths.
# export PATH=&quot;/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH&quot;

# brew
export PATH=/opt/homebrew/bin:/opt/homebrew/sbin:$PATH

# nvm
export NVM_DIR=&quot;$HOME/.nvm&quot;
&#x5B; -s &quot;/opt/homebrew/opt/nvm/nvm.sh&quot; ] &amp;&amp; \. &quot;/opt/homebrew/opt/nvm/nvm.sh&quot;  # This loads nvm
&#x5B; -s &quot;/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm&quot; ] &amp;&amp; \. &quot;/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm&quot;  # This
 loads nvm bash_completion

# Pyenv
export PYENV_ROOT=&quot;$HOME/.pyenv&quot;
export PATH=&quot;$PYENV_ROOT/bin:$PATH&quot;
if command -v pyenv 1&gt;/dev/null 2&gt;&amp;1; then
   eval &quot;$(pyenv init -)&quot;
fi

# python virtualenv
if which pyenv-virtualenv-init &gt; /dev/null; then
  eval &quot;$(pyenv virtualenv-init -)&quot;;
</pre></div>


<ol start="4" class="wp-block-list">
<li class="">Don’t forget to set up the login keychain for Jenkins to access code-signing certificates. To do that, log in as the Jenkins user and open Keychain Access. Make sure it can unlock the login keychain automatically, or If you prefer to not check that box, you can log in each time you connect to the job by adding this to your build process:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
security -v unlock-keychain -p &quot;$KEYCHAIN_PASSWORD&quot; 
</pre></div>


<h3 class="wp-block-heading">Step 2: Download the Jenkins Agent Jarfile</h3>



<p class="">Now that we have our user, we’ll configure the Jenkins agent on this Mac. We do that by downloading a small <code>.jar</code> file that connects the Mac to the Jenkins server.</p>



<ol class="wp-block-list">
<li class="">Go to your Jenkins web interface and navigate to <strong>Manage Jenkins</strong> > <strong>Manage Nodes and Clouds</strong>.</li>



<li class="">Create a new node, name it something like <code>Mac-Agent</code>, and assign it the <code>mac-dev</code> label.</li>



<li class="">Once the node is created, you’ll be given a command to run on the Mac, including a URL to the agent <code>.jar</code> file.</li>



<li class="">Download the jarfile to your Mac, ideally in a folder like <code>/Users/jenkins/agent/</code>. Run:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
   mkdir -p /Users/jenkins/agent
   cd /Users/jenkins/agent
   wget http://&lt;jenkins-server&gt;:8080/jnlpJars/agent.jar
</pre></div>


<h3 class="wp-block-heading">Step 2b: Have the agent run all the time as a service.</h3>



<p class="">To have this run all the time, you can create a launchd plist and set the service to run always.</p>



<ol class="wp-block-list">
<li class="">Create a <code>plist</code> file to configure the agent as a service:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
sudo nano /Library/LaunchDaemons/org.jenkins.agent.plist
</pre></div>


<p class="">Add the following content to the <code>plist</code> file:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
&lt;plist version=&quot;1.0&quot;&gt;
&lt;dict&gt;
    &lt;key&gt;Label&lt;/key&gt;
    &lt;string&gt;org.jenkins.agent&lt;/string&gt;
    &lt;key&gt;ProgramArguments&lt;/key&gt;
    &lt;array&gt;
        &lt;string&gt;/usr/bin/java&lt;/string&gt;
        &lt;string&gt;-jar&lt;/string&gt;
        &lt;string&gt;/Users/jenkins/agent/agent.jar&lt;/string&gt;
        &lt;string&gt;-jnlpUrl&lt;/string&gt;
        &lt;string&gt;http://your-jenkins-server/computer/MacAgent/slave-agent.jnlp&lt;/string&gt;
        &lt;string&gt;-secret&lt;/string&gt;
        &lt;string&gt;@${secret key file}&lt;/string&gt;
        &lt;string&gt;-workDir&lt;/string&gt;
        &lt;string&gt;/Users/jenkins/agent&lt;/string&gt;
    &lt;/array&gt;
    &lt;key&gt;RunAtLoad&lt;/key&gt;
    &lt;true/&gt;
    &lt;key&gt;KeepAlive&lt;/key&gt;
    &lt;true/&gt;
&lt;/dict&gt;
&lt;/plist&gt;
</pre></div>


<p class="">Adjust the paths to match your setup and fill in the <code>jnlpUrl</code> and <code>secret</code> values. Save the file and you can have the mac run it when it starts.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
sudo launchctl load /Library/LaunchDaemons/org.jenkins.agent.plist
</pre></div>


<h3 class="wp-block-heading">Step 3: Configure the Agent to Run as a macOS Node</h3>



<p class="">You’ve got the agent file in place, so now we’ll register the Mac as a Jenkins node.</p>



<ol class="wp-block-list">
<li class="">Head back to your Jenkins server, and under the <strong>Nodes</strong> configuration for <code>Mac-Agent</code>, you’ll see a unique secret for that node. You’ll need this secret to run the agent.</li>



<li class="">Start the agent on your Mac with the following command:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
 java -jar /Users/jenkins/agent/agent.jar -jnlpUrl http://&lt;jenkins-server&gt;:8080/computer/Mac-Agent/slave-agent.jnlp -secret &lt;secret&gt; -workDir &quot;/Users/jenkins/agent&quot;
</pre></div>


<ol start="3" class="wp-block-list">
<li class="">You should now see the Mac connected as an agent in the Jenkins UI. <em>Congratulations, you now have a mac agent that can build your mobile apps!</em></li>
</ol>



<h3 class="wp-block-heading">Step 4: Set the Node Label for macOS Builds</h3>



<p class="">To ensure your builds run on this macOS agent, we need to assign it a label. I suggest using something like <code>mac-dev</code> to easily identify this agent for macOS development.</p>



<ol class="wp-block-list">
<li class="">In Jenkins, go to <strong>Manage Jenkins</strong> > <strong>Manage Nodes and Clouds</strong>.</li>



<li class="">Edit the <code>Mac-Agent</code> node and assign it the label <code>mac-dev</code>.</li>
</ol>



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



<h2 class="wp-block-heading">Building a Test Project</h2>



<p class="">Let’s verify everything is working by creating a test project that runs a simple macOS command on our Jenkins agent.</p>



<ol class="wp-block-list">
<li class="">Create a new job in Jenkins by navigating to <strong>New Item</strong>.</li>



<li class="">Name the project something like <code>Mac Test Project</code> and set it to be a Freestyle project.</li>



<li class="">Under <strong>Restrict where this project can be run</strong>, add the label <code>mac-dev</code> to ensure it runs on the Mac agent.</li>



<li class="">In the <strong>Build</strong> section, add an <strong>Execute Shell</strong> step with a basic macOS command like:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
security unlock-keychain -p PASSWORD ${HOME}/Library/Keychains/login.keychain

echo &quot;Hello from macOS&quot;
</pre></div>


<ol start="5" class="wp-block-list">
<li class="">Save the project and run the build.</li>
</ol>



<p class="">If everything is set up correctly, you’ll see the output from the Mac in your Jenkins console log, proving the agent is connected and working properly.</p>



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



<h2 class="wp-block-heading">Final Thoughts</h2>



<p class="">While you can easily build iOS apps in the cloud for a fee, there’s something satisfying about running your builds on your own hardware, especially if you’re building your own apps like I do. With this Jenkins setup, you have full control over the build environment, which is invaluable for mobile development. As you maintain your own build toolchain as you build the app, it also maintains your build env. Wonderful!</p>



<p class="">If you’re just getting started, don’t be discouraged by the complexity of CI systems like Jenkins. Once it’s set up, it’ll save you time and effort in the long run, giving you more freedom to focus on what matters—building your game or app!</p>



<p class="">Happy coding!</p>



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



<p class="">References</p>



<ul class="wp-block-list">
<li class=""><a href="https://stackoverflow.com/questions/42627269/jenkins-using-git-askpass-to-set-credentials">https://stackoverflow.com/questions/42627269/jenkins-using-git-askpass-to-set-credentials</a></li>



<li class=""><a href="https://stackoverflow.com/users/882754/tanguy-g">https://stackoverflow.com/users/882754/tanguy-g</a> : <a href="https://stackoverflow.com/questions/41680511/jenkins-where-is-the-login-keychain-file-in-users-name-library-keychains-fol ">https://stackoverflow.com/questions/41680511/jenkins-where-is-the-login-keychain-file-in-users-name-library-keychains-fol </a></li>
</ul>


<!-- wp:themify-builder/canvas /--><p>The post <a href="https://mikelynchgames.com/software-development/building-mobile-apps-with-jenkins-and-macos/">Building Mobile Apps with Jenkins and macOS</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikelynchgames.com/software-development/building-mobile-apps-with-jenkins-and-macos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1726</post-id>	</item>
		<item>
		<title>Getting Started with Local Kubernetes: Developing Microservices with MicroK8s</title>
		<link>https://mikelynchgames.com/software-development/getting-started-with-local-kubernetes-developing-microservices-with-microk8s/</link>
					<comments>https://mikelynchgames.com/software-development/getting-started-with-local-kubernetes-developing-microservices-with-microk8s/#respond</comments>
		
		<dc:creator><![CDATA[Michael Lynch]]></dc:creator>
		<pubDate>Fri, 30 Aug 2024 18:00:00 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[kubernetes]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[terraform]]></category>
		<guid isPermaLink="false">https://mikelynchgames.com/?p=1685</guid>

					<description><![CDATA[<img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='299'%20height='171'%20viewBox=%270%200%20299%20171%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="300" height="171" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?fit=300%2C171&amp;ssl=1" class="tf_svg_lazy webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=1160%2C665&amp;ssl=1 1160w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="171" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?fit=300%2C171&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=1160%2C665&amp;ssl=1 1160w" sizes="(max-width: 300px) 100vw, 300px" /></noscript><p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='585'%20viewBox=%270%200%201024%20585%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="1024" height="585" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?fit=1024%2C585&amp;ssl=1" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=260%2C150&amp;ssl=1 260w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img width="1024" height="585" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?fit=1024%2C585&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=260%2C150&amp;ssl=1 260w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></p>
<p>Overview In the world of modern software development, microservices architecture has become increasingly popular for its scalability and maintainability. As developers, we often need to run and test these microservices locally before deploying them to a cloud-based Kubernetes cluster. Let&#8217;s get started setting up a local Kubernetes environment using MicroK8s, a lightweight, single-package Kubernetes distribution, [&#8230;]</p>
<p>The post <a href="https://mikelynchgames.com/software-development/getting-started-with-local-kubernetes-developing-microservices-with-microk8s/">Getting Started with Local Kubernetes: Developing Microservices with MicroK8s</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='299'%20height='171'%20viewBox=%270%200%20299%20171%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="300" height="171" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?fit=300%2C171&amp;ssl=1" class="tf_svg_lazy webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=1160%2C665&amp;ssl=1 1160w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="171" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?fit=300%2C171&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=1160%2C665&amp;ssl=1 1160w" sizes="(max-width: 300px) 100vw, 300px" /></noscript><p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='585'%20viewBox=%270%200%201024%20585%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="1024" height="585" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?fit=1024%2C585&amp;ssl=1" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=260%2C150&amp;ssl=1 260w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img width="1024" height="585" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?fit=1024%2C585&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/08/Kube.png?resize=260%2C150&amp;ssl=1 260w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></p>
<h2 class="wp-block-heading"><strong>Overview</strong></h2>



<p class="">In the world of modern software development, microservices architecture has become increasingly popular for its scalability and maintainability. As developers, we often need to run and test these microservices locally before deploying them to a cloud-based Kubernetes cluster. Let&#8217;s get started setting up a local Kubernetes environment using <a href="https://microk8s.io/" target="_blank" rel="noreferrer noopener nofollow">MicroK8s</a>, a lightweight, single-package Kubernetes distribution, perfect for local development. We&#8217;ll also cover a basic setup with Terraform to help you seamlessly transition to cloud deployment.</p>



<h2 class="wp-block-heading"><strong>Why MicroK8s?</strong></h2>



<p class="">MicroK8s is an easy-to-install, low-ops Kubernetes distribution that runs on your local machine. It provides a great way to develop and test microservices locally before pushing them to a production environment. Some benefits of using MicroK8s include:</p>



<ul class="wp-block-list">
<li class=""><strong>Simplicity:</strong> Installation is straightforward, and you can have a fully functional Kubernetes cluster running in minutes.</li>



<li class=""><strong>Lightweight:</strong> It consumes fewer resources than full-blown Kubernetes setups, making it ideal for local development.</li>



<li class=""><strong>Modular:</strong> You can enable and disable Kubernetes features like DNS, storage, and more with simple commands.</li>



<li class=""><strong>Consistency:</strong> The setup mimics a cloud-based Kubernetes environment, ensuring that your local testing closely resembles the production environment.</li>
</ul>



<h3 class="wp-block-heading"><strong>Step 1: Installing MicroK8s</strong></h3>



<p class="">To get started, you&#8217;ll need to install MicroK8s on your development machine. Follow these steps:</p>



<ol class="wp-block-list">
<li class=""><strong>Install MicroK8s:</strong><br>MicroK8s can be installed using a snap package, which is supported on most Linux distributions.</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
   sudo snap install microk8s --classic
</pre></div>


<p class="">This command will install MicroK8s with all necessary dependencies. If you&#8217;re not developing on a Linux machine, you can find instructions for the installation in on the <a href="https://microk8s.io/docs/install-alternatives" target="_blank" rel="noreferrer noopener nofollow">official site</a>. </p>



<ol start="2" class="wp-block-list">
<li class=""><strong>Add Your User to the MicroK8s Group:</strong><br>To avoid needing <code>sudo</code> for every command, add your user to the <code>microk8s</code> group.</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
   sudo usermod -aG microk8s $USER
   sudo chown -f -R $USER ~/.kube
</pre></div>


<p class="">Log out and log back in to apply the changes.</p>



<ol start="3" class="wp-block-list">
<li class=""><strong>Enable Essential Add-ons:</strong><br>MicroK8s comes with several add-ons that are disabled by default. Enable the ones you need with the following commands:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
   microk8s enable dns dashboard storage
</pre></div>


<ul class="wp-block-list">
<li class=""><code>dns</code>: Provides DNS resolution within your cluster.</li>



<li class=""><code>dashboard</code>: A web-based UI for Kubernetes.</li>



<li class=""><code>storage</code>: A local storage solution for persistent volumes.</li>
</ul>



<ol class="wp-block-list">
<li class=""><strong>Verify Your Installation:</strong><br>Check the status of your MicroK8s installation to ensure everything is running smoothly.</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
   microk8s status --wait-ready
</pre></div>


<p class="">You should see that the Kubernetes services are active and ready.</p>



<h3 class="wp-block-heading"><strong>Step 2: Configuring kubectl for MicroK8s</strong></h3>



<p class="">To interact with your Kubernetes cluster, you&#8217;ll use <code>kubectl</code>. MicroK8s comes with its own version of <code>kubectl</code>, but you can alias it to avoid conflicts with other Kubernetes installations.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
alias kubectl=&#039;microk8s kubectl&#039;
</pre></div>


<p class="">This alias ensures that all <code>kubectl</code> commands target your MicroK8s cluster.</p>



<h3 class="wp-block-heading"><strong>Step 3: Setting Up Terraform for Local Deployment</strong></h3>



<p class="">Terraform is a powerful tool for provisioning infrastructure as code. We can use it to deploy resources to your local MicroK8s cluster and later transition to a cloud provider like AWS, GCP, or Azure.</p>



<ol class="wp-block-list">
<li class=""><strong>Install Terraform:</strong><br>If you haven&#8217;t already, download and install Terraform from the <a href="https://www.terraform.io/downloads">official website</a>.</li>



<li class=""><strong>Create a Terraform Configuration:</strong><br>Start by defining a basic Terraform configuration that will create Kubernetes resources locally. Here&#8217;s an example <code>main.tf</code>:</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
   provider &quot;kubernetes&quot; {
     config_path = &quot;~/.kube/config&quot;
   }

   resource &quot;kubernetes_namespace&quot; &quot;example&quot; {
     metadata {
       name = &quot;example-namespace&quot;
     }
   }

   resource &quot;kubernetes_deployment&quot; &quot;nginx&quot; {
     metadata {
       name      = &quot;nginx-deployment&quot;
       namespace = kubernetes_namespace.example.metadata&#x5B;0].name
     }

     spec {
       replicas = 2

       selector {
         match_labels = {
           app = &quot;nginx&quot;
         }
       }

       template {
         metadata {
           labels = {
             app = &quot;nginx&quot;
           }
         }

         spec {
           container {
             image = &quot;nginx:latest&quot;
             name  = &quot;nginx&quot;
           }
         }
       }
     }
   }
</pre></div>


<p class="">This configuration defines a Kubernetes namespace and a simple Nginx deployment within that namespace.</p>



<ol start="3" class="wp-block-list">
<li class=""><strong>Initialize and Apply Terraform:</strong><br>Initialize Terraform to download the necessary providers and then apply the configuration.</li>
</ol>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
   terraform init
   terraform apply
</pre></div>


<p class="">Terraform will deploy the resources to your local MicroK8s cluster.</p>



<h3 class="wp-block-heading"><strong>Step 4: Transitioning to Cloud Deployment</strong></h3>



<p class="">Once you&#8217;ve developed and tested your microservices locally, you can easily transition to deploying them on a cloud-based Kubernetes cluster. The main changes involve updating your Terraform provider configuration to point to your cloud provider&#8217;s Kubernetes service and ensuring your cloud infrastructure is set up accordingly.</p>



<p class="">For example, if you were to deploy to Google Kubernetes Engine (GKE), you would modify the provider block in your Terraform configuration:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
provider &quot;kubernetes&quot; {
  host                   = &quot;&lt;GKE API Server Endpoint&gt;&quot;
  token                  = &quot;&lt;Your GCP Access Token&gt;&quot;
  cluster_ca_certificate = file(&quot;&lt;Path to CA Certificate&gt;&quot;)
}
</pre></div>


<p class="">This allows you to use the same Terraform scripts to manage both your local and cloud deployments, providing a smooth and consistent development workflow.</p>



<h1 class="wp-block-heading"><strong>Happy Coding</strong></h1>



<p class="">Running Kubernetes locally with MicroK8s is a great way to develop and test your microservices before deploying them to a production environment. By combining MicroK8s with Terraform, you can maintain a consistent infrastructure-as-code approach across both local and cloud environments, ensuring a seamless transition from development to production.</p>



<p class="">Just one more note, this type of architecture is not for everyone. If you are creating a single service, or starting a new project, I highly recommend you begin with something simple to deploy such as <a href="https://firebase.google.com/" target="_blank" rel="noreferrer noopener nofollow">Google Firebase</a>. </p>



<p class=""></p>


<!-- wp:themify-builder/canvas /--><p>The post <a href="https://mikelynchgames.com/software-development/getting-started-with-local-kubernetes-developing-microservices-with-microk8s/">Getting Started with Local Kubernetes: Developing Microservices with MicroK8s</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikelynchgames.com/software-development/getting-started-with-local-kubernetes-developing-microservices-with-microk8s/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1685</post-id>	</item>
		<item>
		<title>Local Chatting with Ollama</title>
		<link>https://mikelynchgames.com/ai/local-chatting-with-ollama/</link>
					<comments>https://mikelynchgames.com/ai/local-chatting-with-ollama/#respond</comments>
		
		<dc:creator><![CDATA[Michael Lynch]]></dc:creator>
		<pubDate>Tue, 02 Jul 2024 15:23:39 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<guid isPermaLink="false">https://mikelynchgames.com/?p=1622</guid>

					<description><![CDATA[<img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='299'%20height='171'%20viewBox=%270%200%20299%20171%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="300" height="171" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?fit=300%2C171&amp;ssl=1" class="tf_svg_lazy webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?w=1792&amp;ssl=1 1792w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1024%2C585&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1536%2C878&amp;ssl=1 1536w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1160%2C665&amp;ssl=1 1160w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="171" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?fit=300%2C171&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?w=1792&amp;ssl=1 1792w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1024%2C585&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1536%2C878&amp;ssl=1 1536w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1160%2C665&amp;ssl=1 1160w" sizes="(max-width: 300px) 100vw, 300px" /></noscript><p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1792'%20height='1024'%20viewBox=%270%200%201792%201024%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="1792" height="1024" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?fit=1792%2C1024&amp;ssl=1" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?w=1792&amp;ssl=1 1792w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1024%2C585&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1536%2C878&amp;ssl=1 1536w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=260%2C150&amp;ssl=1 260w" data-tf-sizes="(max-width: 1792px) 100vw, 1792px" /><noscript><img width="1792" height="1024" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?fit=1792%2C1024&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?w=1792&amp;ssl=1 1792w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1024%2C585&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1536%2C878&amp;ssl=1 1536w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=260%2C150&amp;ssl=1 260w" sizes="(max-width: 1792px) 100vw, 1792px" /></noscript></p>
<p>Ollama is an open-source AI model that provides a sophisticated AI chatbot. Running it locally means you don&#8217;t need to pay any additional API fees and it&#8217;s great if you want to do local development. Following these simple instructions enables you to set it up a local free-to-use AI to chat with. This is based [&#8230;]</p>
<p>The post <a href="https://mikelynchgames.com/ai/local-chatting-with-ollama/">Local Chatting with Ollama</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='299'%20height='171'%20viewBox=%270%200%20299%20171%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="300" height="171" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?fit=300%2C171&amp;ssl=1" class="tf_svg_lazy webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?w=1792&amp;ssl=1 1792w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1024%2C585&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1536%2C878&amp;ssl=1 1536w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1160%2C665&amp;ssl=1 1160w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="171" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?fit=300%2C171&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?w=1792&amp;ssl=1 1792w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1024%2C585&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1536%2C878&amp;ssl=1 1536w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1160%2C665&amp;ssl=1 1160w" sizes="(max-width: 300px) 100vw, 300px" /></noscript><p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1792'%20height='1024'%20viewBox=%270%200%201792%201024%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="1792" height="1024" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?fit=1792%2C1024&amp;ssl=1" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?w=1792&amp;ssl=1 1792w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1024%2C585&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1536%2C878&amp;ssl=1 1536w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=260%2C150&amp;ssl=1 260w" data-tf-sizes="(max-width: 1792px) 100vw, 1792px" /><noscript><img width="1792" height="1024" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?fit=1792%2C1024&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?w=1792&amp;ssl=1 1792w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=300%2C171&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1024%2C585&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=768%2C439&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=1536%2C878&amp;ssl=1 1536w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-6.png?resize=260%2C150&amp;ssl=1 260w" sizes="(max-width: 1792px) 100vw, 1792px" /></noscript></p>
<p class="">Ollama is an open-source AI model that provides a sophisticated AI chatbot. Running it locally means you don&#8217;t need to pay any additional API fees and it&#8217;s great if you want to do local development. Following these simple instructions enables you to set it up a local free-to-use AI to chat with. This is based on the instructions found on the <a href="https://github.com/open-webui/open-webui" target="_blank" rel="noreferrer noopener nofollow">Open WebUI GitHub Page</a>. </p>



<h2 class="wp-block-heading">Installing Software</h2>



<h3 class="wp-block-heading">Docker</h3>



<p class="">If you are not an engineer, you may not have <a href="https://www.docker.com/products/docker-desktop/" target="_blank" rel="noreferrer noopener nofollow">Docker</a> installed. Docker is not the only Virtual Container software you can run, but it is the most popular currently and it&#8217;s free for individual use. Head over to their site to download and install docker, it&#8217;s quite simple. The tool we are using is &#8216;Docker-Desktop&#8217; and if you are using Windows or Mac the installation is currently very similar. After you download the appropriate installer, you just run it and follow along with the wizard.</p>



<p class="">Now that you have docker installed, you will really not need to interact much more with it for the rest of this installation, just having it there and running is all you need. Depending on your setup, you might need to restart your machine.</p>



<p class="">To verify that it is working as expected, you need to open a terminal window. Once open to verify docker is installed, you may type <code>docker --version</code> (results are shown in the image below.</p>



<figure class="wp-block-image size-full"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='882'%20height='88'%20viewBox=%270%200%20882%2088%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" data-recalc-dims="1" decoding="async" width="882" height="88" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image.png?resize=882%2C88&#038;ssl=1" alt="Image showing prompt results after typing `docker --version`" class="tf_svg_lazy wp-image-1627" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image.png?w=882&amp;ssl=1 882w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image.png?resize=300%2C30&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image.png?resize=768%2C77&amp;ssl=1 768w" data-tf-sizes="(max-width: 882px) 100vw, 882px" /><noscript><img data-recalc-dims="1" decoding="async" width="882" height="88" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image.png?resize=882%2C88&#038;ssl=1" alt="Image showing prompt results after typing `docker --version`" class="wp-image-1627" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image.png?w=882&amp;ssl=1 882w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image.png?resize=300%2C30&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image.png?resize=768%2C77&amp;ssl=1 768w" sizes="(max-width: 882px) 100vw, 882px" /></noscript></figure>



<h3 class="wp-block-heading">Ollama</h3>



<p class="">As I mentioned this is a very short tutorial!  The next step after installing docker is to run Ollama and WebUI. </p>



<pre class="wp-block-preformatted">docker run -d -p 3000:8080 --gpus=all -v ollama:/root/.ollama -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:ollama<br></pre>


<!-- wp:themify-builder/canvas /-->


<p class=""></p>



<p class="">After running the command above for the first time, docker will download and install all the required software and run a local container hosting the WebUI application that will allow you to access your local version of Ollama. You can verify that it is working, by looking at the &#8216;Containers&#8217; tab in the Docker UI, shown in the image below.</p>



<figure class="wp-block-image size-large"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='299'%20viewBox=%270%200%201024%20299%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" data-recalc-dims="1" decoding="async" width="1024" height="299" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-3.png?resize=1024%2C299&#038;ssl=1" alt="Docker Container UI running and showing open-webui running, along with the ports that it is using." class="tf_svg_lazy wp-image-1630" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-3.png?resize=1024%2C299&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-3.png?resize=300%2C88&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-3.png?resize=768%2C224&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-3.png?resize=1536%2C449&amp;ssl=1 1536w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-3.png?w=1899&amp;ssl=1 1899w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img data-recalc-dims="1" decoding="async" width="1024" height="299" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-3.png?resize=1024%2C299&#038;ssl=1" alt="Docker Container UI running and showing open-webui running, along with the ports that it is using." class="wp-image-1630" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-3.png?resize=1024%2C299&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-3.png?resize=300%2C88&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-3.png?resize=768%2C224&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-3.png?resize=1536%2C449&amp;ssl=1 1536w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-3.png?w=1899&amp;ssl=1 1899w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></figure>



<h2 class="wp-block-heading">Chatting With AI Locally</h2>



<p class="">Once the previous command completes your local Chat AI is ready to talk to you!  To begin, open the Web UI by clicking this link.</p>



<p class=""></p>



<p class="">NOTE: If you restart your computer, you will need to run that command again to restart the WebUI.</p>



<p class=""><a href="http://localhost:3000/" target="_blank" rel="noreferrer noopener">http://localhost:3000</a></p>



<p class="">The first time you open this site, it will ask you to log in. Create and account and login. Then you will be able to chat.</p>



<figure class="wp-block-image size-large"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='666'%20viewBox=%270%200%201024%20666%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" data-recalc-dims="1" decoding="async" width="1024" height="666" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-5.png?resize=1024%2C666&#038;ssl=1" alt="llama3 latest model running in local WebUI container." class="tf_svg_lazy wp-image-1632" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-5.png?resize=1024%2C666&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-5.png?resize=300%2C195&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-5.png?resize=768%2C500&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-5.png?resize=1536%2C1000&amp;ssl=1 1536w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-5.png?w=1953&amp;ssl=1 1953w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img data-recalc-dims="1" decoding="async" width="1024" height="666" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-5.png?resize=1024%2C666&#038;ssl=1" alt="llama3 latest model running in local WebUI container." class="wp-image-1632" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-5.png?resize=1024%2C666&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-5.png?resize=300%2C195&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-5.png?resize=768%2C500&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-5.png?resize=1536%2C1000&amp;ssl=1 1536w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2024/07/image-5.png?w=1953&amp;ssl=1 1953w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></figure>



<h2 class="wp-block-heading">More Models</h2>



<p class="">If you are interested, there are more models that you can install through the WebUI interface. If you code for example, you may want to install an AI that is trained specifically for coding, such as <code>codellama</code>. Installing new models is quite easy, visit the link below.</p>



<p class=""><a href="http://localhost:3000/workspace/models" target="_blank" rel="noreferrer noopener">http://localhost:3000/workspace/models</a> </p>



<h2 class="wp-block-heading">Happy Chatting!</h2>



<p class="">Getting started with AI has never been easier, I hope you enjoy your new AI friend.</p>



<p class="">If you get stuck, or just want to copy/paste easier, here is a <a href="https://github.com/nycynik/OpenWebUIRun/tree/main">GitHub Repository</a> with the example above. </p>



<p class=""></p>



<p class=""></p>



<p class=""></p>
<p>The post <a href="https://mikelynchgames.com/ai/local-chatting-with-ollama/">Local Chatting with Ollama</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikelynchgames.com/ai/local-chatting-with-ollama/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1622</post-id>	</item>
		<item>
		<title>Simple Image Generation Script</title>
		<link>https://mikelynchgames.com/game-development/simple-image-generation-script/</link>
					<comments>https://mikelynchgames.com/game-development/simple-image-generation-script/#respond</comments>
		
		<dc:creator><![CDATA[Michael Lynch]]></dc:creator>
		<pubDate>Fri, 08 Dec 2023 03:27:00 +0000</pubDate>
				<category><![CDATA[Game Development]]></category>
		<guid isPermaLink="false">https://mikelynchgames.com/?p=1392</guid>

					<description><![CDATA[<img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='172'%20viewBox=%270%200%20300%20172%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="300" height="172" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?fit=300%2C172&amp;ssl=1" class="tf_svg_lazy webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?w=1069&amp;ssl=1 1069w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=300%2C172&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1024%2C585&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=768%2C440&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=50%2C29&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=100%2C57&amp;ssl=1 100w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1160%2C665&amp;ssl=1 1160w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=260%2C150&amp;ssl=1 260w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="172" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?fit=300%2C172&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?w=1069&amp;ssl=1 1069w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=300%2C172&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1024%2C585&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=768%2C440&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=50%2C29&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=100%2C57&amp;ssl=1 100w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1160%2C665&amp;ssl=1 1160w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=260%2C150&amp;ssl=1 260w" sizes="(max-width: 300px) 100vw, 300px" /></noscript><p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1069'%20height='613'%20viewBox=%270%200%201069%20613%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="1069" height="613" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?fit=1069%2C613&amp;ssl=1" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?w=1069&amp;ssl=1 1069w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=300%2C172&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1024%2C587&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=768%2C440&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=50%2C29&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=100%2C57&amp;ssl=1 100w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1160%2C665&amp;ssl=1 1160w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=260%2C150&amp;ssl=1 260w" data-tf-sizes="(max-width: 1069px) 100vw, 1069px" /><noscript><img width="1069" height="613" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?fit=1069%2C613&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?w=1069&amp;ssl=1 1069w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=300%2C172&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1024%2C587&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=768%2C440&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=50%2C29&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=100%2C57&amp;ssl=1 100w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1160%2C665&amp;ssl=1 1160w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=260%2C150&amp;ssl=1 260w" sizes="(max-width: 1069px) 100vw, 1069px" /></noscript></p>
<p>When developing games, you often need to create tools that go with the games to speed development. This can be complicated tools such as level editors or simple tools such as image generation scripts. I was recently working on a project where I needed many game tiles for each letter of the alphabet, and although [&#8230;]</p>
<p>The post <a href="https://mikelynchgames.com/game-development/simple-image-generation-script/">Simple Image Generation Script</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='172'%20viewBox=%270%200%20300%20172%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="300" height="172" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?fit=300%2C172&amp;ssl=1" class="tf_svg_lazy webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?w=1069&amp;ssl=1 1069w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=300%2C172&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1024%2C585&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=768%2C440&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=50%2C29&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=100%2C57&amp;ssl=1 100w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1160%2C665&amp;ssl=1 1160w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=260%2C150&amp;ssl=1 260w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="172" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?fit=300%2C172&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?w=1069&amp;ssl=1 1069w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=300%2C172&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1024%2C585&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=768%2C440&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=50%2C29&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=100%2C57&amp;ssl=1 100w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1160%2C665&amp;ssl=1 1160w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=260%2C150&amp;ssl=1 260w" sizes="(max-width: 300px) 100vw, 300px" /></noscript><p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1069'%20height='613'%20viewBox=%270%200%201069%20613%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="1069" height="613" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?fit=1069%2C613&amp;ssl=1" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?w=1069&amp;ssl=1 1069w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=300%2C172&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1024%2C587&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=768%2C440&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=50%2C29&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=100%2C57&amp;ssl=1 100w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1160%2C665&amp;ssl=1 1160w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=260%2C150&amp;ssl=1 260w" data-tf-sizes="(max-width: 1069px) 100vw, 1069px" /><noscript><img width="1069" height="613" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?fit=1069%2C613&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?w=1069&amp;ssl=1 1069w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=300%2C172&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1024%2C587&amp;ssl=1 1024w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=768%2C440&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=50%2C29&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=100%2C57&amp;ssl=1 100w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=360%2C205&amp;ssl=1 360w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=561%2C321&amp;ssl=1 561w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=1160%2C665&amp;ssl=1 1160w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/image.png?resize=260%2C150&amp;ssl=1 260w" sizes="(max-width: 1069px) 100vw, 1069px" /></noscript></p><!-- wp:themify-builder/canvas /-->


<p>When developing games, you often need to create tools that go with the games to speed development. This can be complicated tools such as level editors or simple tools such as image generation scripts. I was recently working on a project where I needed many game tiles for each letter of the alphabet, and although this is pretty simple to do using a professional tool such as PhotoShop, I decided to write a script to do it. </p>



<h2 class="wp-block-heading">Python Script</h2>



<p>The script is written in Python and can be found in GitHub, <a href="https://github.com/nycynik/AlphaTileGenerator/tree/main" target="_blank" rel="noreferrer noopener">here</a>. </p>



<p>This is a simple tool that opens a base image and then using the script writes a single letter centered on the image. This was quick to build and can be modified if the project calls for it. For example, maybe the font needed to change, or we needed new colors or new tiles. Any of these options could be done and regenerated in seconds. </p>



<p>The script uses the Pillow Library, a very powerful image manipulation library that can do all sorts of interesting things with images. In this case it&#8217;s simply being used to draw the text on the images. </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
def draw_text_on_image(image, text, output): 
    draw = ImageDraw.Draw(image)

    font = ImageFont.truetype(&quot;font/AlumniSansCollegiateOne-Regular.ttf&quot;, 225)
    text_color = (200, 128, 128) 
    text_color_back = (40, 10, 10) 
    width, height = image.size

    box = draw.textbbox((1,1), text=text, stroke_width=1, font=font)

    text_width = box&#x5B;2] - box&#x5B;0]
    text_height = box&#x5B;3] - box&#x5B;1]

    # text_width, text_height = draw.textsize(text, font)
    x = (width - text_width) / 2
    y = (height - text_height) / 2

    draw.text((x+5, y), text, stroke_width=1, fill=text_color_back, font=font)
    draw.text((x-5, y-10), text, stroke_width=0, fill=text_color, font=font)

    image.save(output)   
</pre></div>


<p>The script first sets the settings for the text that will be written, this is the font, and the text color, and then sets the second text color to black (in this case we are doing the letter with an offset backing letter to make the letter stand out a bit more. </p>



<p>Then we calculate the center of the image and move it back half of the height and width so that the text will be centered on the image.</p>



<p>We then drew the letter twice, once in black, and once in the chosen color. As you can see it&#8217;s a simple 10-pixel offset, but to keep it centered, we move the top text left, and the back text right. </p>



<p>Final Image output:</p>



<figure class="wp-block-image size-medium"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='290'%20viewBox=%270%200%20300%20290%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" data-recalc-dims="1" decoding="async" width="300" height="290" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/A.png?resize=300%2C290&#038;ssl=1" alt="The final output tile" class="tf_svg_lazy wp-image-1394" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/A.png?resize=300%2C290&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/A.png?resize=50%2C48&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/A.png?resize=100%2C97&amp;ssl=1 100w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/A.png?w=397&amp;ssl=1 397w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img data-recalc-dims="1" decoding="async" width="300" height="290" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/A.png?resize=300%2C290&#038;ssl=1" alt="The final output tile" class="wp-image-1394" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/A.png?resize=300%2C290&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/A.png?resize=50%2C48&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/A.png?resize=100%2C97&amp;ssl=1 100w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/10/A.png?w=397&amp;ssl=1 397w" sizes="(max-width: 300px) 100vw, 300px" /></noscript></figure>
<p>The post <a href="https://mikelynchgames.com/game-development/simple-image-generation-script/">Simple Image Generation Script</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikelynchgames.com/game-development/simple-image-generation-script/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1392</post-id>	</item>
		<item>
		<title>An AI Classification Proposal</title>
		<link>https://mikelynchgames.com/ai/an-ai-classification-proposal/</link>
					<comments>https://mikelynchgames.com/ai/an-ai-classification-proposal/#respond</comments>
		
		<dc:creator><![CDATA[Michael Lynch]]></dc:creator>
		<pubDate>Wed, 22 Nov 2023 02:42:51 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<guid isPermaLink="false">https://mikelynchgames.com/?p=1412</guid>

					<description><![CDATA[<img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='299'%20height='197'%20viewBox=%270%200%20299%20197%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="300" height="197" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?fit=300%2C197&amp;ssl=1" class="tf_svg_lazy webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?w=1000&amp;ssl=1 1000w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=300%2C197&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=768%2C505&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=50%2C33&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=100%2C66&amp;ssl=1 100w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="197" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?fit=300%2C197&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?w=1000&amp;ssl=1 1000w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=300%2C197&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=768%2C505&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=50%2C33&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=100%2C66&amp;ssl=1 100w" sizes="(max-width: 300px) 100vw, 300px" /></noscript><p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1000'%20height='658'%20viewBox=%270%200%201000%20658%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="1000" height="658" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?fit=1000%2C658&amp;ssl=1" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?w=1000&amp;ssl=1 1000w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=300%2C197&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=768%2C505&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=50%2C33&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=100%2C66&amp;ssl=1 100w" data-tf-sizes="(max-width: 1000px) 100vw, 1000px" /><noscript><img width="1000" height="658" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?fit=1000%2C658&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?w=1000&amp;ssl=1 1000w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=300%2C197&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=768%2C505&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=50%2C33&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=100%2C66&amp;ssl=1 100w" sizes="(max-width: 1000px) 100vw, 1000px" /></noscript></p>
<p>This is a proposal for a classification of AIs that would apply well to any AI application or device designed to offer a service to users. There are several examples after the proposed classification. Classification The Classification includes six levels: Each classification Level is described below. Examples Doorbell Let&#8217;s apply this to a doorbell. Thermostat [&#8230;]</p>
<p>The post <a href="https://mikelynchgames.com/ai/an-ai-classification-proposal/">An AI Classification Proposal</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='299'%20height='197'%20viewBox=%270%200%20299%20197%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="300" height="197" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?fit=300%2C197&amp;ssl=1" class="tf_svg_lazy webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?w=1000&amp;ssl=1 1000w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=300%2C197&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=768%2C505&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=50%2C33&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=100%2C66&amp;ssl=1 100w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="197" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?fit=300%2C197&amp;ssl=1" class="webfeedsFeaturedVisual wp-post-image" alt="" style="display: block; margin-bottom: 5px; clear:both;max-width: 100%;" link_thumbnail="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?w=1000&amp;ssl=1 1000w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=300%2C197&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=768%2C505&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=50%2C33&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=100%2C66&amp;ssl=1 100w" sizes="(max-width: 300px) 100vw, 300px" /></noscript><p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1000'%20height='658'%20viewBox=%270%200%201000%20658%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" width="1000" height="658" data-tf-src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?fit=1000%2C658&amp;ssl=1" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?w=1000&amp;ssl=1 1000w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=300%2C197&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=768%2C505&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=50%2C33&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=100%2C66&amp;ssl=1 100w" data-tf-sizes="(max-width: 1000px) 100vw, 1000px" /><noscript><img width="1000" height="658" data-tf-not-load src="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?fit=1000%2C658&amp;ssl=1" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?w=1000&amp;ssl=1 1000w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=300%2C197&amp;ssl=1 300w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=768%2C505&amp;ssl=1 768w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=50%2C33&amp;ssl=1 50w, https://i0.wp.com/mikelynchgames.com/wp-content/uploads/2023/11/Untitled-2.png?resize=100%2C66&amp;ssl=1 100w" sizes="(max-width: 1000px) 100vw, 1000px" /></noscript></p><!-- wp:themify-builder/canvas /-->


<p class="">This is a proposal for a classification of AIs that would apply well to any AI application or device designed to offer a service to users. There are several examples after the proposed classification.</p>



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



<p class="">The Classification includes six levels:</p>



<ol class="wp-block-list">
<li class="">Interface Control</li>



<li class="">Basic Data Interaction</li>



<li class="">Contextual Understanding</li>



<li class="">Autonomous Learning</li>



<li class="">Advanced Adaptation</li>



<li class="">Continuous Learning</li>
</ol>



<p class="">Each classification Level is described below.</p>



<ol class="wp-block-list">
<li class="">Level 1 <strong>Interface Control</strong>
<ul class="wp-block-list">
<li class="">Non-AI Interface At this level, the AI system primarily functions as a non-intelligent interface that requires explicit human input to control and perform specific tasks. It lacks the ability to learn or adapt independently.</li>
</ul>
</li>



<li class="">Level 2 <strong>Basic Data Interaction</strong>
<ul class="wp-block-list">
<li class="">At this level, the AI system can interact with and analyze a limited set of data inputs. It can perform tasks or provide insights based on predefined rules or algorithms, but still depends on human input to guide its decision-making process.</li>
</ul>
</li>



<li class="">Level 3 <strong>Contextual Understanding</strong>
<ul class="wp-block-list">
<li class="">At this level, the AI system can comprehend and interpret data in a more contextual manner by leveraging natural language processing or image recognition. It is capable of processing unstructured data and extracting relevant information, reducing the amount of human input required for understanding complex data.</li>
</ul>
</li>



<li class="">Level 4 <strong>Autonomous Learning</strong>
<ul class="wp-block-list">
<li class="">At this level, the AI system possesses the ability to learn and improve its performance by using algorithms and techniques like machine learning. It can adapt its behavior based on previous interactions, reducing the need for constant human intervention and decision-making.</li>
</ul>
</li>



<li class="">Level 5 <strong>Advanced Adaptation</strong> 
<ul class="wp-block-list">
<li class="">At this level, the AI system can self-adapt and optimize its performance based on continuous interactions with users and additional data inputs. It utilizes advanced techniques like deep learning to improve its decision-making capabilities without relying heavily on human input.</li>
</ul>
</li>



<li class="">Level 6 <strong>Continuous Learning and Adaptation</strong> 
<ul class="wp-block-list">
<li class="">At this final level, the AI system becomes self-sufficient and capable of continuous learning and adaptation. It harnesses its ability to read and understand data, make predictions, and autonomously improve its performance over time. At this stage, the AI interface no longer requires human input but continues to read data from various sources to enhance its knowledge and decision-making abilities.</li>
</ul>
</li>
</ol>



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



<h3 class="wp-block-heading">Doorbell</h3>



<p class="">Let&#8217;s apply this to a doorbell.</p>



<ol class="wp-block-list">
<li class="">Interface Control (Non-AI Interface): A traditional doorbell that requires the user to manually press a button to produce a sound. The doorbell has no AI capabilities and solely serves as an interface controlled by human input.</li>



<li class="">Basic Data Interaction: A doorbell equipped with a motion sensor that triggers the sound when it detects movement. The AI system can analyze basic data (motion) to produce a response but still relies on predefined rules and simple data inputs.</li>



<li class="">Contextual Understanding: A doorbell equipped with a camera and a facial recognition system. When a person approaches the door, the AI system uses the camera to recognize familiar faces and plays customized sounds or notifications based on the recognized individual.</li>



<li class="">Autonomous Learning: A doorbell AI system that utilizes data from the camera and audio inputs to learn the patterns and preferences of the residents. Over time, it adapts and learns to differentiate between familiar faces, delivery people, or potential threats, and adjusts its response accordingly.</li>



<li class="">Advanced Adaptation: A doorbell AI system that employs advanced machine learning algorithms and audio processing. It can recognize and differentiate between specific sounds, such as the sound of a delivery truck or a barking dog, and adjusts its notifications or responses based on these learned sound patterns.</li>



<li class="">Continuous Learning: A doorbell AI system that continuously analyzes data from the camera, audio inputs, and other sources. It can learn and adapt its behavior to various scenarios, such as predicting the likelihood of a visitor being a regular guest or a new acquaintance, without requiring explicit human input or customization.</li>
</ol>



<h3 class="wp-block-heading">Thermostat</h3>



<p class="">A second example, considering a thermostat.</p>



<ol class="wp-block-list">
<li class="">Interface Control (Non-AI Interface): A basic thermostat that requires users to manually adjust the temperature settings by pressing physical buttons or turning a dial.</li>



<li class="">Basic Data Interaction: A thermostat equipped with sensors that detect the current temperature and humidity levels in a room. The AI system can use this data to maintain the desired temperature as configured by the user but requires manual input to set the preferences.</li>



<li class="">Contextual Understanding: A thermostat that integrates with weather forecasts and considers factors like outdoor temperature and user occupancy patterns to adjust the temperature automatically. It can analyze contextual data to optimize the indoor environment, reducing the need for explicit human input.</li>



<li class="">Autonomous Learning: A thermostat AI system that learns from user preferences, adjusting the temperature based on patterns, time of day, and user behavior. Over time, it adapts and optimizes temperature settings to provide a comfortable environment without constant manual input.</li>



<li class="">Advanced Adaptation: A thermostat AI system that employs advanced machine learning algorithms to analyze historical data, user feedback, and energy usage patterns. It can predict and adapt temperature settings based on occupancy patterns, weather changes, and personal preferences, optimizing energy efficiency and comfort.</li>



<li class="">Continuous Learning: A thermostat AI system that constantly learns from user interactions, external factors like weather patterns, and energy usage. It can autonomously adjust temperature settings, anticipate user needs, and adapt based on various inputs without requiring regular input from the user.</li>
</ol>



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



<p class="">I believe that this classification could help guide people who are trying to understand the capabilities of a &#8216;smart&#8217; device or of an AI system. Having the classification would help speed up our understanding of what the systems are designed to be capable of. </p>
<p>The post <a href="https://mikelynchgames.com/ai/an-ai-classification-proposal/">An AI Classification Proposal</a> appeared first on <a href="https://mikelynchgames.com">Mike Lynch</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikelynchgames.com/ai/an-ai-classification-proposal/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1412</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced (Page is feed) 

Served from: mikelynchgames.com @ 2026-04-19 14:04:28 by W3 Total Cache
-->