<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Clarice Bouwer</title>
    <description>The latest articles on DEV Community by Clarice Bouwer (@cbillowes).</description>
    <link>https://dev.to/cbillowes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F75681%2Fd3f5ef39-9b43-4e6a-98d7-ecfcc20683ed.png</url>
      <title>DEV Community: Clarice Bouwer</title>
      <link>https://dev.to/cbillowes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cbillowes"/>
    <language>en</language>
    <item>
      <title>Owning the Chaos: A Simple Guide to Tackling Obscure Errors</title>
      <dc:creator>Clarice Bouwer</dc:creator>
      <pubDate>Thu, 12 Dec 2024 18:55:00 +0000</pubDate>
      <link>https://dev.to/cbillowes/owning-the-chaos-a-simple-guide-to-tackling-obscure-errors-3chd</link>
      <guid>https://dev.to/cbillowes/owning-the-chaos-a-simple-guide-to-tackling-obscure-errors-3chd</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AUTHOR'S NOTE&lt;/strong&gt;:&lt;br&gt;
When something is obscure it means that it is not clear or is difficult to understand.&lt;br&gt;
This implies that something is vague, hidden, or lacking in detail.&lt;br&gt;
Cryptic indicates that something is mysterious or puzzling.&lt;br&gt;
Some errors are both &lt;strong&gt;obscure&lt;/strong&gt; and &lt;strong&gt;cryptic&lt;/strong&gt; so feel free to use the terms interchangeably in this articles.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ping! A slack message. You wake up. Oh look, it's &lt;code&gt;#errors&lt;/code&gt;. "What's broken now?" you think to yourself. You go to the channel and see an automated message rendered on the screen. It reads something like &lt;code&gt;Error: Something disastrous happened&lt;/code&gt;. It's obscure and it makes you pull a perplexed face. You scroll up to see more errors from the night before. This forms a deepening sickening pit in your stomach. Some errors make sense. Others are just as baffling as the original.&lt;/p&gt;

&lt;p&gt;Adding to the challenge, you're juggling the complexity of multiple environments like development, feature spin-offs, staging and production. So, the errors that come in are from numerous contexts in the domain, applications, services and said environments.&lt;br&gt;
This impacts the decision on which errors to prioritize and respond to first.&lt;/p&gt;

&lt;p&gt;What a way to wake up—and all before breakfast 😞&lt;/p&gt;

&lt;p&gt;With no immediate response from others, you need to decide what to do. It's still early. Do you roll over and sleep some more? Wait for someone with more experience? Rely on the expert in that part of the domain? Just jump and figure it out?&lt;/p&gt;

&lt;p&gt;Well, it depends actually.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The severity of the errors. If they are blocking users, you need to act fast. If they are not, you have a bit more time.&lt;/li&gt;
&lt;li&gt;Familiarity with the domain, applications, services and infrastructure. You may need to ask a few questions.&lt;/li&gt;
&lt;li&gt;Experience with the tools and technologies.&lt;/li&gt;
&lt;li&gt;Confidence in your ability to resolve errors.&lt;/li&gt;
&lt;li&gt;Availability and bandwidth. If you are not mentally ready, spread too thin, burned out or have other commitments, you may need to ask for help.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is an extreme but common scenario where there are floods of errors coming in from various sources. Sometimes errors storm in like a tsunami or trickle in like a leaky tap. Either way, they need to be addressed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In moments like these, someone needs to seriously step up and &lt;strong&gt;take ownership&lt;/strong&gt;, ensuring these errors don’t fall through the cracks. Good team habits are critical to ensure the code is written in a maintainable and supportable way, that errors are resolved in a timely manner and that team member burn-out is avoided.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This dreaded scenario is no stranger to me. I've seen some pretty weird things pop up. Therefore, this topic is hot on my radar because I care deeply about the quality and integrity of systems. To me, the answer here is that you should care. Even if you don't know how to solve it.&lt;/p&gt;

&lt;p&gt;So, how do you tackle these challenges head-on? Let’s break it down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Triage
&lt;/h2&gt;

&lt;p&gt;Understanding the domain, the applications &amp;amp; services and parts of the infrastructure is important. If you are a new hire or new to that domain, chances are that you'd know less that the seasoned engineers.&lt;br&gt;
As you may be ramping up, don't hesitate to speak up and ask questions. You are not expected to know everything because, in reality, no-one does. Even seasoned engineers don't know everything—experience doesn’t make you omniscient.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read&lt;/strong&gt; through the errors in the channel carefully.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Identify&lt;/strong&gt; the critical environments (example production vs staging), the applications, services &amp;amp; jobs that are affected and how often the errors are occurring.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Triage&lt;/strong&gt; by spotting common or related errors. Can you identify patterns, are errors originating from the same source? Is there a trend in timing or frequency? Which errors are blocking or affecting the users and how?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mark&lt;/strong&gt; them by the level of urgency based on the impact you have determined. Do this to the best of your abilities:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;🚨: Critical (affects core functionality or many users)&lt;/li&gt;
&lt;li&gt;⚠️: High (significant, but not blocking)&lt;/li&gt;
&lt;li&gt;🟡: Medium (minor but recurring issues)&lt;/li&gt;
&lt;li&gt;🔵: Low (cosmetic or non-urgent)&lt;/li&gt;
&lt;li&gt;⁉️: Unknown (you are not sure)&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Communicate&lt;/strong&gt; by starting a thread for each error:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Share a summary of your findings to help others understand the context.&lt;/li&gt;
&lt;li&gt;Give a brief summary of the error, if you know what it is.&lt;/li&gt;
&lt;li&gt;Provide links to articles, resources, wikis, code where applicable.&lt;/li&gt;
&lt;li&gt;Suggest an acceptable turn around time for the error to be resolved depending on what you have learned and the urgency of the error.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Focus&lt;/strong&gt; on the highest-priority error that you can address and resolve it before moving to the next.&lt;/li&gt;
&lt;li&gt;If you can't handle the error, &lt;strong&gt;allocate&lt;/strong&gt; or &lt;strong&gt;escalate&lt;/strong&gt; it but be the nagging kid in the toy store or that parent who's always probing about the homework.
Follow up to ensure progress—it’s better to be persistent than to let issues fall through the cracks.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Investigate
&lt;/h2&gt;

&lt;p&gt;When you are in a good position to get your hands dirty, use an emoji 🕵️ (like the detective one) to &lt;strong&gt;indicate&lt;/strong&gt; that you have started. &lt;strong&gt;Document&lt;/strong&gt; what you uncover. Add it to the thread. The more information you add, the better the outcome and aid for future dilemmas. If you are stuck, &lt;strong&gt;ask for help&lt;/strong&gt;! Again, it's okay to not know everything.&lt;/p&gt;

&lt;p&gt;By following these steps, you can systematically unravel even the most obscure errors and contribute to a more resilient system.&lt;/p&gt;

&lt;p&gt;I'm going to outline what I typically do. These are not in a particular order and they are often revisited multiple times.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These steps relate to me currently using GCP (Google Cloud Platform), GKE (Google Kubernetes Engine), Error Reporting and the Logging modules.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Error Messages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Look for the error code, message, data identifier, raw stack trace and anything else that stands out.&lt;/li&gt;
&lt;li&gt;Examine the samples.&lt;/li&gt;
&lt;li&gt;See the occurrences, when they started, when the latest occurrence was.&lt;/li&gt;
&lt;li&gt;See the pods that were affected.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Logs
&lt;/h3&gt;

&lt;p&gt;Logs are a goldmine of real-time system information, whether the error is clear or obscure. There can be a lot of noise so filter out the nonsense.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filter the logs by the pod name.&lt;/li&gt;
&lt;li&gt;Filter the logs by log type - examples include verbose, info, warn, error - (sometimes I am unlucky with this) but it's a good starting point to choose warning or error and above over the default.&lt;/li&gt;
&lt;li&gt;Hone in on a specific date and time range.&lt;/li&gt;
&lt;li&gt;Search on specific keywords.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Search
&lt;/h3&gt;

&lt;p&gt;Once you've mined the logs for clues, your next step is to search for broader context or existing solutions. Search through the rich history in your text communications channel like Slack, your wiki, emails, and the internet like Stack Overflow, GitHub issues, ask AI, etc. for the error message or stack trace. Give as much context and information as possible.&lt;/p&gt;

&lt;p&gt;If you are really stuck, reach out on forums or other communities like on Slack or Discord.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reproduce
&lt;/h3&gt;

&lt;p&gt;Try to reproduce the error with the information you have gathered.&lt;br&gt;
Do this in a lower environment, if possible (locally, development, staging, etc). This is often the fastest way to identify or confirm the root cause. It also protects the affected environment from further damage by not causing more chaos like with data corruption, downtime, warped analytics or user impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code
&lt;/h3&gt;

&lt;p&gt;Go to the code and see if you can identify the source of the error.&lt;br&gt;
Recreate the conditions or data that triggered the error to understand its context. Analyze the section for logical errors, typos, edge cases, or potential misconfigurations.&lt;/p&gt;

&lt;p&gt;If you don't have the stack trace or the error is not in the logs, you may need to add more logging to the code to get more information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Document
&lt;/h3&gt;

&lt;p&gt;Document your findings in the thread.&lt;br&gt;
This is important for the next person who may experience something similar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Include the root cause analysis, if you identified it.&lt;/li&gt;
&lt;li&gt;Include the steps you took to investigate the error.&lt;/li&gt;
&lt;li&gt;Include information that you found useful and what you found to be irrelevant.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resolve or Escalate
&lt;/h2&gt;

&lt;p&gt;Now it is time to either fix the error or give it to someone else who can–hopefully–fix it. The baton may be passed to another team member, but ensure clear handover and follow-up to maintain accountability.&lt;br&gt;
Just ensure that the ownership is clear and that the error is not forgotten.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resolve the Error
&lt;/h3&gt;

&lt;p&gt;Whoo-hoo! You found the root cause, or a potential issue (sometimes multiples), and you know how to fix it, sometimes sort-of. Great job!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Apply the fix in the appropriate place to the best of your ability.&lt;/li&gt;
&lt;li&gt;Ensure you have added some sort of test (or more) to confirm the error has been fixed as to mitigate it from breaking again in the future.&lt;/li&gt;
&lt;li&gt;Test it thoroughly with the same steps you took to reproduce the error.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;systems thinking&lt;/strong&gt; to mitigate regression to other flows, users, applications, services and/or jobs. (Maximum effort!)&lt;/li&gt;
&lt;li&gt;Get this fix tested by your colleagues or peers.&lt;/li&gt;
&lt;li&gt;Deploy the fix to the environment where the error occurred.&lt;/li&gt;
&lt;li&gt;Mark the error as resolved in GCP so that if the error occurs again, it will be a new error and you will be alerted.&lt;/li&gt;
&lt;li&gt;Use an emoji ✅ in Slack to acknowledge that you have resolved the error and remove the other emojis.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Escalate the Error
&lt;/h3&gt;

&lt;p&gt;So you got unlucky this time round and you can't resolve the error. It's okay. Mark the error in Slack as escalated using the emoji ⬆️, remove other emojis and allocate the error to someone else.&lt;/p&gt;

&lt;p&gt;Try to be included in the investigation process by pairing with the person who picks it up, assuming you have capacity. Be a sponge to learn as much as you can from this experience and how the person tries to resolve the error. Your presence is beneficial because of your investigation and findings, the learning opportunity and the potential to contribute to the resolution. Ensure the issue is thoroughly documented and shared, fostering transparency and team learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips
&lt;/h2&gt;

&lt;p&gt;By following these tips, you can build a resilient system and a strong, collaborative team.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Be brave&lt;/strong&gt;: Don't be afraid to pick up errors. It's a great learning opportunity and you are not solely responsible for it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dig deep&lt;/strong&gt;: Search for and identify the root cause of the problem. Don't just fix the symptoms. Look at the data, code, logs, and the environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduce the noise&lt;/strong&gt;: Identify and reduce the noise in the system, such as overly verbose health checks or misclassified log levels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create visibility&lt;/strong&gt;: A good mental model of your systems, data and code is beneficial to solving for errors so create tangible mind maps or documentation for the whole team to benefit from. &lt;a href="https://miro.com/" rel="noopener noreferrer"&gt;Miro&lt;/a&gt; and &lt;a href="https://docusaurus.io/" rel="noopener noreferrer"&gt;Docusaurus&lt;/a&gt; are excellent tools for this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work together&lt;/strong&gt;: Foster a culture of collaboration and sharing. You don't have to be the sole gatekeeper of errors. Create a round-robin system where everyone gets a chance to pick up errors. Hold regular error triage meetings or pair programming sessions to share insights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritize&lt;/strong&gt;: Allocate specific blocks of time to address errors while reserving uninterrupted time for your regular tasks. Prioritize errors based on urgency and impact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process&lt;/strong&gt;: Formulate a process that works for you and your team. It's important to have a process that is flexible and can be adapted as you learn more about the errors that are occurring.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Strong team habits are the foundation for addressing errors promptly and writing maintainable, supportable code.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take ownership to strengthen your systems, support your team, and grow as a professional.&lt;/li&gt;
&lt;li&gt;Write code that reports errors meaningfully, making debugging easier.&lt;/li&gt;
&lt;li&gt;Communicate transparently with peers and leaders to secure the support you need and emphasize the impact of errors.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Embrace errors as opportunities to learn, grow, and build a stronger, more resilient system—and a more capable you. So, put your curiosity gloves on, flick fear on the ear and grab those errors no matter how obscure.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>continuouslearning</category>
      <category>triageerrors</category>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>How to Reframe your Inner Imposter</title>
      <dc:creator>Clarice Bouwer</dc:creator>
      <pubDate>Sun, 10 Nov 2024 17:02:55 +0000</pubDate>
      <link>https://dev.to/cbillowes/how-to-reframe-your-inner-imposter-4h0l</link>
      <guid>https://dev.to/cbillowes/how-to-reframe-your-inner-imposter-4h0l</guid>
      <description>&lt;p&gt;Struggling with imposter syndrome? Find out mind-blowing tricks to flipping your self-doubt into unstoppable confidence!&lt;/p&gt;

&lt;p&gt;This article delves into transforming imposter syndrome from a debilitating obstacle into a powerful motivator for personal growth. It suggests reframing feelings of self-doubt as natural signs of stretching one's abilities rather than indicators of inadequacy. By embracing vulnerability and recognizing that even successful individuals experience similar doubts, one can shift their mindset to view challenges as opportunities for learning. I offer practical strategies, such as positive self-talk and focusing on progress over perfection, to help readers turn their inner critic into a catalyst for confidence and development.&lt;/p&gt;

&lt;p&gt;Read more about it at curiousprogrammer.dev - &lt;a href="https://curiousprogrammer.dev/blog/how-to-reframe-your-inner-imposter/" rel="noopener noreferrer"&gt;How to reframe your inner imposter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>comfortzone</category>
      <category>personaldevelopment</category>
      <category>mindset</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Dynamically execute Tailwind CSS on multiple files with multiple outputs</title>
      <dc:creator>Clarice Bouwer</dc:creator>
      <pubDate>Sun, 09 Jun 2024 16:00:50 +0000</pubDate>
      <link>https://dev.to/cbillowes/dynamically-execute-tailwind-css-on-multiple-files-with-multiple-outputs-38f2</link>
      <guid>https://dev.to/cbillowes/dynamically-execute-tailwind-css-on-multiple-files-with-multiple-outputs-38f2</guid>
      <description>&lt;p&gt;Finds all CSS files in a given director, iterates through them and executes tailwindcss CLI using the Tailwind config and outputs each file to a &lt;code&gt;dist/&lt;/code&gt; dir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;find . -name \"*.css\" -exec npx tailwindcss -c tailwind.config.js -i {} -o dist/{} \\;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>How to update outdated npm packages</title>
      <dc:creator>Clarice Bouwer</dc:creator>
      <pubDate>Mon, 20 May 2024 12:59:46 +0000</pubDate>
      <link>https://dev.to/cbillowes/how-to-update-outdated-npm-packages-1ig7</link>
      <guid>https://dev.to/cbillowes/how-to-update-outdated-npm-packages-1ig7</guid>
      <description>&lt;p&gt;Keeping your npm packages up-to-date is crucial for maintaining the security and performance of your projects. In this guide, I'll walk you through the steps to identify and update outdated npm packages. &lt;/p&gt;

&lt;p&gt;The &lt;code&gt;npm outdated&lt;/code&gt; command checks the registry for outdated installed packages. It shows direct dependencies by default, but with the &lt;code&gt;--all&lt;/code&gt; flag, it includes all outdated meta-dependencies. Key output fields include &lt;code&gt;wanted&lt;/code&gt; (maximum version satisfying semver in &lt;code&gt;package.json&lt;/code&gt;), &lt;code&gt;latest&lt;/code&gt; (latest version in the registry), &lt;code&gt;location&lt;/code&gt;, and &lt;code&gt;depended by&lt;/code&gt;. Red indicates a newer version matches semver requirements, and yellow indicates a newer version above semver requirements. Various flags like &lt;code&gt;--json&lt;/code&gt;, &lt;code&gt;--long&lt;/code&gt;, and &lt;code&gt;--global&lt;/code&gt; modify the output format and scope.&lt;/p&gt;

&lt;p&gt;For more details, visit &lt;a href="https://docs.npmjs.com/cli/v10/commands/npm-outdated" rel="noopener noreferrer"&gt;npm outdated documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Note that by default &lt;code&gt;npm update&lt;/code&gt; will not update the &lt;code&gt;semver&lt;/code&gt; values of direct dependencies in your project package.json. If you want to also update values in &lt;code&gt;package.json&lt;/code&gt; you can run: &lt;code&gt;npm update --save&lt;/code&gt; (or add the &lt;code&gt;save=true&lt;/code&gt; option to a &lt;a href="https://docs.npmjs.com/cli/v10/configuring-npm/npmrc" rel="noopener noreferrer"&gt;configuration file&lt;/a&gt; to make that the default behavior).&lt;/p&gt;

&lt;p&gt;For more details, visit &lt;a href="https://docs.npmjs.com/cli/v10/commands/npm-update" rel="noopener noreferrer"&gt;npm update documentation&lt;/a&gt;&lt;/p&gt;

</description>
      <category>npm</category>
      <category>node</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to write formatted EDN to a file in Clojure</title>
      <dc:creator>Clarice Bouwer</dc:creator>
      <pubDate>Thu, 29 Feb 2024 07:40:12 +0000</pubDate>
      <link>https://dev.to/cbillowes/how-to-write-formatted-edn-to-a-file-in-clojure-4g9i</link>
      <guid>https://dev.to/cbillowes/how-to-write-formatted-edn-to-a-file-in-clojure-4g9i</guid>
      <description>&lt;p&gt;You could be generating a config file, constructing a data file or downloading/extracting data from a data source. Sometimes, it needs to be human readable to make sense of it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;spit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"file.txt"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;with-out-str&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;clojure.pprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;with-open&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;clojure.java.io/writer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"file.edn"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;.write&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;with-out-str&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;clojure.pprint/pprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>clojure</category>
    </item>
    <item>
      <title>How to get the nREPL port for a running REPL</title>
      <dc:creator>Clarice Bouwer</dc:creator>
      <pubDate>Thu, 26 Oct 2023 04:47:44 +0000</pubDate>
      <link>https://dev.to/cbillowes/how-to-get-the-nrepl-port-for-a-running-repl-44dm</link>
      <guid>https://dev.to/cbillowes/how-to-get-the-nrepl-port-for-a-running-repl-44dm</guid>
      <description>&lt;p&gt;I want to connect to a running REPL on my local machine outside of Visual Studio Code. The terminal output is cleared or truncated depending on the terminal.&lt;/p&gt;

&lt;p&gt;There are two methods I know of.&lt;/p&gt;

&lt;p&gt;Grep the processes for the name of the project that is running on the JVM. This will give a process ID. Eg. 71141&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ps aux | grep name-of-the-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grep the network-related information such as open connections, open socket ports with the process ID from above.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;netstat -vanp tcp | grep 71141
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find the loopback IP with the associate port. Eg. 63361&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;127.0.0.1.63361
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use that port in Visual Studio Code.&lt;/p&gt;

&lt;p&gt;To find the port from the Clojure REPL: &lt;code&gt;(slurp ".nrepl-port")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;See: &lt;a href="https://stackoverflow.com/questions/77364142/how-do-i-get-the-nrepl-port-for-a-running-repl" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/77364142/how-do-i-get-the-nrepl-port-for-a-running-repl&lt;/a&gt;&lt;/p&gt;

</description>
      <category>clojure</category>
    </item>
    <item>
      <title>How to read all bytes from a resource file in Clojure</title>
      <dc:creator>Clarice Bouwer</dc:creator>
      <pubDate>Wed, 16 Aug 2023 00:17:21 +0000</pubDate>
      <link>https://dev.to/cbillowes/how-to-read-all-bytes-from-a-resource-file-in-clojure-539b</link>
      <guid>https://dev.to/cbillowes/how-to-read-all-bytes-from-a-resource-file-in-clojure-539b</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"images/something.jpg"&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="n"&gt;io/resource&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="n"&gt;io/file&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="n"&gt;.toPath&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="n"&gt;java.nio.file.Files/readAllBytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is important to note that the resource is located in your &lt;code&gt;resources&lt;/code&gt; directory so use a path relative to your application or components root directory.&lt;/p&gt;

</description>
      <category>clojure</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to configure python environs for Visual Studio Code</title>
      <dc:creator>Clarice Bouwer</dc:creator>
      <pubDate>Sat, 29 Jul 2023 12:00:19 +0000</pubDate>
      <link>https://dev.to/cbillowes/how-to-configure-python-environs-for-visual-studio-code-52ph</link>
      <guid>https://dev.to/cbillowes/how-to-configure-python-environs-for-visual-studio-code-52ph</guid>
      <description>&lt;p&gt;If you need to store environment variables for Python that does not automatically get detected by VS Code then &lt;a href="https://stackoverflow.com/questions/53653083/how-to-correctly-set-pythonpath-for-visual-studio-code" rel="noopener noreferrer"&gt;this answer&lt;/a&gt; should hopefully help you.&lt;/p&gt;

&lt;p&gt;I am doing a Data Science bootcamp and need to store a specific path for one of my challenges. &lt;/p&gt;

&lt;p&gt;Exporting &lt;code&gt;PYTHONPATH&lt;/code&gt; in &lt;code&gt;~/.zshrc&lt;/code&gt; works perfectly when I run the notebook directly from Juypter, however the environment variable is not detected through VS Code.&lt;/p&gt;

&lt;p&gt;I created a global file in my home directory from the &lt;code&gt;pwd&lt;/code&gt; (present working directory) that I wanted to store in my path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"export PYTHONPATH=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$PYTHONPATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.python-env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I opened the JSON User Settings in VS Code and added the &lt;code&gt;python.envFile&lt;/code&gt; setting which points directly to &lt;code&gt;~/.python-env&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"python.envFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~/.python-env"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>python</category>
      <category>datascience</category>
      <category>bash</category>
    </item>
    <item>
      <title>Python Data Science Cheat Sheets (a WIP project)</title>
      <dc:creator>Clarice Bouwer</dc:creator>
      <pubDate>Fri, 14 Jul 2023 03:48:39 +0000</pubDate>
      <link>https://dev.to/cbillowes/python-data-science-cheat-sheets-a-wip-project-2119</link>
      <guid>https://dev.to/cbillowes/python-data-science-cheat-sheets-a-wip-project-2119</guid>
      <description>&lt;p&gt;I am doing a Data Science bootcamp through &lt;a href="https://www.lewagon.com/" rel="noopener noreferrer"&gt;Le Wagon&lt;/a&gt;. I have found static cheat sheets that I have turned into interactive versions using Jupyter Notebooks so that I can better understand the packages available for use.&lt;/p&gt;

&lt;p&gt;I might be re-inventing the wheel but this approach is helping me reinforce the knowledge and properly explore the packages. &lt;/p&gt;

&lt;p&gt;If you are interested, &lt;a href="https://github.com/cbillowes/cheat-sheets/" rel="noopener noreferrer"&gt;check it out&lt;/a&gt;, star it, fork it, clone it, contribute to it, share it.&lt;/p&gt;

&lt;p&gt;It's a work in progress project. From one package starting with &lt;code&gt;numpy&lt;/code&gt;, I am hoping to grow it into numerous packages that make sense.&lt;/p&gt;

&lt;p&gt;If you have any thoughts, suggestions or words of encouragement 😉, please let me know.&lt;/p&gt;

&lt;p&gt;Made with ❤️ for Data Science 🔬 🧮 and Python 🐍&lt;/p&gt;

</description>
      <category>python</category>
      <category>datascience</category>
      <category>jupyter</category>
      <category>cheatsheet</category>
    </item>
    <item>
      <title>How to create a string from values joining with commas and an and.</title>
      <dc:creator>Clarice Bouwer</dc:creator>
      <pubDate>Mon, 03 Jul 2023 09:49:08 +0000</pubDate>
      <link>https://dev.to/cbillowes/how-to-create-a-string-from-values-joining-with-commas-and-an-and-4igh</link>
      <guid>https://dev.to/cbillowes/how-to-create-a-string-from-values-joining-with-commas-and-an-and-4igh</guid>
      <description>&lt;p&gt;I have a vector of errors that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="no"&gt;:error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Name is required"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;:error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Last name is required"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;:error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Date of birth is in the wrong format"&lt;/span&gt;&lt;span class="p"&gt;}])&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;:error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;remove&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;string/blank?&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;string/join&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;", "&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;string/replace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="s"&gt;", ([^,]+)$"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;" and $1"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above form will output the following result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="s"&gt;"Name is required, Last name is required and Date of birth is in the wrong format"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It uses a threaded macro to map through all &lt;code&gt;:error&lt;/code&gt; keywords, removing blanks (and nils), joining by comma and then replacing the last comma with an and to read nicely.&lt;/p&gt;

&lt;p&gt;This gives me a comma-separated list &lt;/p&gt;

</description>
      <category>clojure</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to import with absolute paths in Gatsby</title>
      <dc:creator>Clarice Bouwer</dc:creator>
      <pubDate>Fri, 30 Jun 2023 02:34:04 +0000</pubDate>
      <link>https://dev.to/cbillowes/how-to-import-with-absolute-paths-in-gatsby-3l6</link>
      <guid>https://dev.to/cbillowes/how-to-import-with-absolute-paths-in-gatsby-3l6</guid>
      <description>&lt;p&gt;gatsby-node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onCreateWebpackConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;actions&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setWebpackConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;templates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/templates&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;./project/src/path/to/some/file/of/yours.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Layout&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;as opposed to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Layout&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../../../components/Layout.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See &lt;a href="https://github.com/gatsbyjs/gatsby/issues/11025#issuecomment-453813693" rel="noopener noreferrer"&gt;GitHub solution&lt;/a&gt; as original source and reference.&lt;/p&gt;

</description>
      <category>gatsby</category>
      <category>javascript</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to get distinct values in a grid</title>
      <dc:creator>Clarice Bouwer</dc:creator>
      <pubDate>Thu, 29 Jun 2023 19:20:02 +0000</pubDate>
      <link>https://dev.to/cbillowes/how-to-get-distinct-values-in-a-grid-8m5</link>
      <guid>https://dev.to/cbillowes/how-to-get-distinct-values-in-a-grid-8m5</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_distinct_values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code will get a distinct list where values are not equal to zero. I used this code in a Sudoku solver algorithm.&lt;/p&gt;

</description>
      <category>python</category>
    </item>
  </channel>
</rss>
