<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Yin-Chi Chan</title><link>https://yinchi.dev/</link><description>Recent content on Yin-Chi Chan</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Fri, 15 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://yinchi.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Top Spin (revisited)</title><link>https://yinchi.dev/posts/top-spin/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://yinchi.dev/posts/top-spin/</guid><description>&lt;p&gt;&lt;img src="top_spin.png" alt="top spin"&gt;&lt;/p&gt;
&lt;p&gt;In a (much) earlier &lt;a href="https://yinchi.dev/posts/flip-puzzle/"&gt;post&lt;/a&gt; of mine, I discussed a puzzle called &lt;em&gt;Top
Spin&lt;/em&gt; (once made by Binary Arts), in which 20 beads were placed on an oval track with a turntable
that could flip the four beads that occupy it. I showed that it was possible to reverse the order
of the beads, from &lt;code&gt;[1, 2, 3, ..., 19, 20]&lt;/code&gt; to &lt;code&gt;[20, 19, ..., 2, 1]&lt;/code&gt;, even if the beads were
placed on a straight track instead of an oval one.&lt;/p&gt;</description></item><item><title>More Thoughts on CodeCrafters</title><link>https://yinchi.dev/posts/more-thoughts-on-codecrafters/</link><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><guid>https://yinchi.dev/posts/more-thoughts-on-codecrafters/</guid><description>&lt;p&gt;In my &lt;a href="https://yinchi.dev/posts/thoughts-on-codecrafters/"&gt;previous post&lt;/a&gt;, I shared some of my thoughts on
the CodeCrafters website and the coding challenges it offers. In particular, I had completed the
&lt;a href="https://app.codecrafters.io/courses/http-server/overview" target="_blank" rel="noopener"&gt;HTTP server&lt;/a&gt; challenge in Rust and
&lt;a href="https://app.codecrafters.io/courses/claude-code/overview" target="_blank" rel="noopener"&gt;Claude Code&lt;/a&gt; challenge beta (notably,
the number of available stages, and the feature set of the &amp;ldquo;completed&amp;rdquo; code, are quite limited)
in Python and was working on the
&lt;a href="https://app.codecrafters.io/courses/interpreter/overview" target="_blank" rel="noopener"&gt;Interpreter&lt;/a&gt; challenge in Rust. I have
since completed the Interpreter challenge, and decided to share some more thoughts on the
experience.&lt;/p&gt;</description></item><item><title>Thoughts on CodeCrafters</title><link>https://yinchi.dev/posts/thoughts-on-codecrafters/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><guid>https://yinchi.dev/posts/thoughts-on-codecrafters/</guid><description>&lt;p&gt;&lt;a href="https://app.codecrafters.io/catalog" target="_blank" rel="noopener"&gt;CodeCrafters&lt;/a&gt; is a site where one can complete a number of
programming challenges. Challenges include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build your own HTTP server&lt;/li&gt;
&lt;li&gt;Build your own Interpreter&lt;/li&gt;
&lt;li&gt;Build your own Shell&lt;/li&gt;
&lt;li&gt;Build your own Claude Code (still in beta)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each challenge is broken into a number of steps, with an extensive test suite triggered by the
command &lt;code&gt;codecrafters submit&lt;/code&gt; which:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pushes your submission to a Git repo on the CodeCrafters server&lt;/li&gt;
&lt;li&gt;Runs the tests for the given step&lt;/li&gt;
&lt;li&gt;Reports results back to the user in the terminal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Supposedly, this is made possible by Git&amp;rsquo;s &lt;code&gt;post-receive&lt;/code&gt; hook, which runs the test suite and
reports the results back to the user via Git&amp;rsquo;s side-channel communication capabilities (as well
as updating the user status in Codecrafter&amp;rsquo;s database if the step was cleared sucessfully).&lt;/p&gt;</description></item><item><title>A flip puzzle</title><link>https://yinchi.dev/posts/flip-puzzle/</link><pubDate>Wed, 09 Jul 2025 00:00:00 +0000</pubDate><guid>https://yinchi.dev/posts/flip-puzzle/</guid><description>&lt;p&gt;&lt;em&gt;Top Spin&lt;/em&gt; was a puzzle in which 20 beads were placed on an oval track with a turntable, such
that any four consecutive beads could be flipped. Naturally, I wondered whether it was possible
to reverse the order of the beads, from &lt;code&gt;[0, 1, ..., 19]&lt;/code&gt; to &lt;code&gt;[19, 18, ..., 0]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;As it turns out, this is possible even if the beads are placed on a straight track instead of an
oval one.&lt;/p&gt;</description></item><item><title>Automating my publications page</title><link>https://yinchi.dev/posts/automating-my-publications-page/</link><pubDate>Sat, 19 Apr 2025 00:00:00 +0000</pubDate><guid>https://yinchi.dev/posts/automating-my-publications-page/</guid><description>&lt;div class="alert warning"&gt;
&lt;span&gt;&lt;i data-feather="alert-triangle"&gt;&lt;/i&gt;&lt;/span&gt;
&lt;span&gt;&lt;strong&gt;&lt;p&gt;This post refers to a previous version of my personal website, which was built using &lt;a href="https://www.mkdocs.org/" target="_blank" rel="noopener"&gt;MkDocs&lt;/a&gt;. The current version of my website is built using &lt;a href="https://gohugo.io/" target="_blank" rel="noopener"&gt;Hugo&lt;/a&gt;, and the content of this post may not be relevant to the current version.&lt;/p&gt;
&lt;p&gt;A referenced Python package below, &lt;a href="https://pypi.org/project/mkdocs-bibtex/" target="_blank" rel="noopener"&gt;mkdocs-bibtex&lt;/a&gt;, is no longer maintained. In my new Hugo-based website, this package is not necessary — the Taho theme for Hugo providing a built-in solution for displaying publications from a YAML file, which is generated using &lt;a href="https://pybtex.org/" target="_blank" rel="noopener"&gt;pybtex&lt;/a&gt; directly (mkdocs-bibtex used pybtex as a dependency).&lt;/p&gt;</description></item><item><title>About Me</title><link>https://yinchi.dev/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://yinchi.dev/about/</guid><description>&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;I was born in Hong Kong and moved to Canada for several years as a child, before returning to
Canada to study a BMath at the University of Waterloo. I then completed a Masters and PhD at the
City University of Hong Kong. In Dec 2021, I moved to the UK to work as a research associate at
the Institute for Manufacturing, University of Cambridge. I&amp;rsquo;m currently based in the Toronto area,
seeking industry roles in data science, simulation, or backend/data-focused software engineering.&lt;/p&gt;</description></item><item><title>Projects</title><link>https://yinchi.dev/projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://yinchi.dev/projects/</guid><description>&lt;h2 id="command-line-llm-chatbot-demo"&gt;Command-line LLM chatbot demo&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/yinchi/openai_demo" target="_blank" rel="noopener"&gt;https://github.com/yinchi/openai_demo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This simple chatbot uses the OpenAI &lt;a href="https://developers.openai.com/api/reference/python/resources/chat/subresources/completions" target="_blank" rel="noopener"&gt;Chat Completions API&lt;/a&gt;
to generate responses to user input. Responses are interpreted as Markdown and rendered in the
terminal using the &lt;a href="https://github.com/Textualize/rich" target="_blank" rel="noopener"&gt;rich&lt;/a&gt; Python library. Available tools
include file read/write, Python code execution, and web search via the
&lt;a href="https://brave.com/search/api/" target="_blank" rel="noopener"&gt;Brave Search API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The chatbot was tested locally using a &lt;a href="https://vllm.ai" target="_blank" rel="noopener"&gt;vLLM&lt;/a&gt; instance running the
&lt;a href="https://huggingface.co/google/gemma-4-26B-A4B-it" target="_blank" rel="noopener"&gt;&lt;code&gt;google/gemma-4-26B-A4B-it&lt;/code&gt;&lt;/a&gt; model. A
&lt;code&gt;gemma.sh&lt;/code&gt; script is included in the repo to simplify the process of launching the vLLM
instance with the correct parameters.&lt;/p&gt;</description></item><item><title>Publications</title><link>https://yinchi.dev/publications/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://yinchi.dev/publications/</guid><description/></item></channel></rss>