[{"content":" Repo link: https://github.com/emacs-eask/cli\nIn 2023, I wrote an article about the Elisp Language Server. It was one of several experimental projects exploring Elisp as an execution environment. While developing Eask, I serendipitously discovered it was an intriguing program that could effortlessly wrap Emacs into a runtime.\nWhy do I say that? Let\u0026rsquo;s take a look:\n🔰 Running Elisp Programs Typically, executing Elisp doesn\u0026rsquo;t allow you to run a code file directly like you can with Python or Node.js:\npython hello.py Or Node.js:\nnode hello.js to run a code snippet directly.\nThis isn\u0026rsquo;t difficult for Elisp, it just requires a few extra flags:\nemacs -batch -l hello.el ❓ The Question If direct execution is possible, why do we need Eask?\nIn reality, Eask functions similarly to Python\u0026rsquo;s pip and Node.js\u0026rsquo;s npm, all bearing the critical responsibility of package management. The key difference lies in Emacs\u0026rsquo;s shared environment, which prevents it from having a dedicated node_modules directory like npm. This means any changes to an individual project will affect your entire Emacs setup.\nThis might not be an issue for users who don\u0026rsquo;t use Emacs, but it makes package management extremely cumbersome. This is where Emacs\u0026rsquo; importance comes into play, addressing these pain points:\nNo project dependencies, only shared dependencies Inability to download and manage packages Dependency pollution issues Version compatibility problems within Emacs 📝 Example Next, let\u0026rsquo;s see how cumbersome Elisp becomes when managing packages.\nemacs --batch --quick --eval \u0026#34; (require \u0026#39;package) (setq package-archives \u0026#39;((\\“melpa\\” . \\“https://melpa.org/packages/\\”) (\\“gnu\\” . \\“https://elpa.gnu.org/packages/\\”))) (package-initialize) (unless (package-installed-p \u0026#39;async) (package-refresh-contents) (package-install \u0026#39;async)) \u0026#34; This looks terrible—and we haven\u0026rsquo;t even started writing our program yet! Plus, every time we run this program, we have to check package installations and such, which is incredibly tedious. Using Eask makes things much simpler:\neask install -g async This means we can use the async package in any project without needing to check or reinstall it each time.\nThen we can just focus on writing the code we need, without worrying about other unnecessary issues!\neask load -g hello-async.el The text of hello-async.el:\n(require \u0026#39;async) (async-start (lambda () (message “Hello!”)) #\u0026#39;ignore) ⚜️ Closing Thoughts Honestly, this article isn\u0026rsquo;t meant to promote Emacs or Eask. It simply highlights how Elisp can handle everyday tasks like a regular programming language. I\u0026rsquo;ve already leveraged this workflow to automate routine CI/CD tasks:\njcs090218/setup-emacs-windows emacs-eask/packaging Typically, Python handles CI/CD tasks for these kinds of projects, but doing it with Elisp is genuinely amusing. 😅 For someone like me who\u0026rsquo;s already accustomed to writing Elisp, it\u0026rsquo;s practically a dream come true! 🥳\n","permalink":"https://www.jcs-profile.com/posts/editor/elisp-runtime/","summary":"\u003cblockquote\u003e\n\u003cp\u003eRepo link: \u003ca href=\"https://github.com/emacs-eask/cli\"\u003ehttps://github.com/emacs-eask/cli\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eIn 2023, I wrote an article about the \u003ca href=\"../elisp-ls/\"\u003eElisp Language Server\u003c/a\u003e. It was one of several experimental projects exploring \u003ca href=\"https://en.wikipedia.org/wiki/Emacs_Lisp\"\u003eElisp\u003c/a\u003e as an execution environment. While developing \u003ca href=\"https://github.com/emacs-eask/cli\"\u003eEask\u003c/a\u003e, I serendipitously discovered it was an intriguing program that could effortlessly wrap \u003ca href=\"https://www.gnu.org/software/emacs/\"\u003eEmacs\u003c/a\u003e into a runtime.\u003c/p\u003e\n\u003cp\u003eWhy do I say that? Let\u0026rsquo;s take a look:\u003c/p\u003e\n\u003ch2 id=\"-running-elisp-programs\"\u003e🔰 Running Elisp Programs\u003c/h2\u003e\n\u003cp\u003eTypically, executing \u003ca href=\"https://en.wikipedia.org/wiki/Emacs_Lisp\"\u003eElisp\u003c/a\u003e doesn\u0026rsquo;t allow you to run a code file directly like you can with \u003ca href=\"https://www.python.org/\"\u003ePython\u003c/a\u003e or \u003ca href=\"https://nodejs.org/en\"\u003eNode.js\u003c/a\u003e:\u003c/p\u003e","title":"Treat Emacs as an Elisp Runtime using Eask"},{"content":"Here I\u0026rsquo;d like to document my thoughts on TDD. This article isn\u0026rsquo;t intended to explain TDD in detail—it\u0026rsquo;s not a tutorial.\n🌐 Online Explanation Let\u0026rsquo;s first look at the online explanation:\nTDD Simply put, it means writing tests first, then implementing the code. This is actually quite challenging for many programmers. The main reason is that it feels overly tedious, making the development process less smooth.\nI actually agree with this. When I first encountered it, I thought, “This is ridiculous!” Then I looked at others\u0026rsquo; perspectives on TDD:\nIt seems quite a few people genuinely find TDD inherently unfriendly. 🤔\n⚖️ Proper TDD Let me first reiterate the explanation of TDD:\nTest-driven development (TDD) is a way of writing code that involves writing an automated unit-level test case that fails, then writing just enough code to make the test pass, then refactoring both the test code and the production code, then repeating with another new test case.\nI believe proper TDD is beneficial. What does that mean? Modern (2025) practices have become overly formulaic, distorting the original intent of TDD. The original purpose of TDD should be simpler:\nTest your code before writing production code.\nI believe TDD should be broadly defined—writing tests before code constitutes TDD, without mandating you write test code! Why do I say this? Because after writing tons of code, I\u0026rsquo;ve found this broad approach to TDD to be incredibly, incredibly effective! 😲\n❓ Why Does TDD Work? Alright. TDD doesn\u0026rsquo;t work all the time. But I believe it\u0026rsquo;s highly effective when programmers are unfamiliar with their environment and programming language.Ultimately, all programming languages are just syntactic sugar over assembly language. If the authors choose, they can alter those semantics at any time (setting aside compatibility, politics, ethics, etc.). So memorizing their syntax is pointless. The best approach is to test based on the current environment and then develop based on the existing situation—that\u0026rsquo;s the right way to go!\n💬 Conclusion I\u0026rsquo;d venture to guess that modern TDD differs from past TDD in both broad and narrow terms, leading many to perceive it as overly tedious. In reality, TDD is a highly effective development process. However, as people have overly embraced modern TDD, the original correct application and philosophy of TDD have become distorted. 😵 The conclusion is: don\u0026rsquo;t blindly follow formulaic TDD. Validating it through your own hands-on experience is the better approach. 🤔\n","permalink":"https://www.jcs-profile.com/posts/tech/tdd-in-different-view/","summary":"\u003cp\u003eHere I\u0026rsquo;d like to document my thoughts on \u003ca href=\"https://en.wikipedia.org/wiki/Test-driven_development\"\u003eTDD\u003c/a\u003e. This article isn\u0026rsquo;t intended to explain \u003ca href=\"https://en.wikipedia.org/wiki/Test-driven_development\"\u003eTDD\u003c/a\u003e in detail—it\u0026rsquo;s not a tutorial.\u003c/p\u003e\n\u003c!-- more --\u003e\n\u003ch2 id=\"-online-explanation\"\u003e🌐 Online Explanation\u003c/h2\u003e\n\u003cp\u003eLet\u0026rsquo;s first look at the online explanation:\u003c/p\u003e\n\u003cdiv style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;\"\u003e\n      \u003ciframe allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen\" loading=\"eager\" referrerpolicy=\"strict-origin-when-cross-origin\" src=\"https://www.youtube.com/embed/yfP_v6qCdcs?autoplay=0\u0026amp;controls=1\u0026amp;end=0\u0026amp;loop=0\u0026amp;mute=0\u0026amp;start=0\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;\" title=\"YouTube video\"\u003e\u003c/iframe\u003e\n    \u003c/div\u003e\n\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Test-driven_development\"\u003eTDD\u003c/a\u003e Simply put, it means writing tests first, then implementing the code. This is actually quite challenging for many programmers. The main reason is that it feels overly tedious, making the development process less smooth.\u003c/p\u003e","title":"TDD in different view"},{"content":"A few weeks ago, I suddenly had the idea to calculate how much time I had spent on programming (including learning). This led to some reflections. The calculation formula is as follows.\nAverage hours per day × Number of days in a year × Total number of years\nI started programming in the spring of 2013 and decided to fully commit to it in 2014. On average, I spend between 5 and 16 hours a day coding, non-stop, including weekends. My time is easy to calculate because, aside from specific times when I go out, I spend most of my time coding, except for eating, sleeping, and other necessities. I’ve always had trouble sleeping, which means I don’t sleep much during the day, and often don’t sleep at all. So I often end up coding for over 16 hours (the longest stretch was probably over 36 hours). 🤔 This is actually quite painful for me, but I won’t go into detail here—I just want to record how much time I’ve spent.\nLet’s start calculating:\nUpper limit: 365 * 12 * 16 = 70,080 (hours) Average: 365 * 12 * ((16 + 5) / 2) = 45,990 (hours) Lower limit: 365 * 12 * 5 = 21,900 (hours) Average of upper and lower limits: (21,900 + 70,080) / 2 = 46,350 (hours) Although my average is roughly 40,000 hours, I feel it should be between 50,000 and 60,000. This is mainly because 5 hours a day is the absolute minimum; typically, 10 hours is the most common amount of time spent.\nI once heard that if you invest over 100 hours in the same thing, you’ve already surpassed 80% of people. So what does investing 50,000 hours mean? Looking back, I realize I’ve come so far… It’s truly awe-inspiring!\n","permalink":"https://www.jcs-profile.com/posts/career/%E5%8C%A0%E4%BA%BA%E7%B4%9A-5-%E8%90%AC%E5%B0%8F%E6%99%82%E6%98%AF%E4%BB%80%E9%BA%BC%E6%A6%82%E5%BF%B5/","summary":"\u003cp\u003eA few weeks ago, I suddenly had the idea to calculate how much time I had spent on programming (including learning).\nThis led to some reflections. The calculation formula is as follows.\u003c/p\u003e\n\u003c!-- more --\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAverage hours per day × Number of days in a year × Total number of years\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eI started programming in the spring of 2013 and decided to fully commit to it in 2014.\nOn average, I spend between 5 and 16 hours a day coding, non-stop, including weekends.\nMy time is easy to calculate because, aside from specific times when I go out,\nI spend most of my time coding, except for eating, sleeping, and other necessities.\nI’ve always had trouble sleeping, which means I don’t sleep much during the day,\nand often don’t sleep at all. So I often end up coding for over 16 hours\n(the longest stretch was probably over 36 hours). 🤔\nThis is actually quite painful for me, but I won’t go into detail here—I just want to record how much time I’ve spent.\u003c/p\u003e","title":"What does 50,000 hours of craftsmanship mean?"},{"content":"I’ve been wanting to write an article about communication issues among game designers for quite some time now. This issue has been simmering within the gaming industry for some time and has been troubling me as well. As a programmer, how can I communicate more smoothly with planners? This article simply aims to document the situations I have observed and, by the end, hopefully provide a better answer to my own doubts.\n🗯️ Introduction I am a professional game programmer with over 6 years of experience in the gaming industry, and over 10 years of actual game development experience (including my university days). As such, I consider myself to be a developer with considerable development experience. However, I have always had issues communicating with planners. Below, I would like to propose several broad directions that I believe are the root causes of this problem.\n🗑️ The barriers to entry for planning are too low, and there is a lack of professional domain knowledge. I think this title will upset many planners, but I believe it is a fact. Compared to art and programming, the barriers to entry for planning are much lower than for the other two categories. Some might say that planners also need to know and understand many things. I don’t deny that, but do you think professionals in other fields who are proficient in more skills know less than you? Are people who can’t even do programming or art really more passionate? Do they really only need to talk to get things done?\nNext, we can talk about communication skills. Most planners only know how to express things related to their own experience. This statement may be a bit unclear, so let’s use an example. For example, when designing a game system that interacts with another system in a special way, most planners can only describe what they see and cannot analyze the underlying logic or operational mechanisms of the system (the process of reverse engineering). But the question is, who wouldn’t do that? Can a skill that even casual players can possess truly be called professional expertise? 🤔 At best, they\u0026rsquo;re just players working in the game industry, often jokingly referred to as “idea generators.”\nDoes that mean planners have no professional knowledge at all? Not exactly. I believe planning is the field that requires the most knowledge. The problem lies with the industry itself, and the specific reasons need to be examined from a historical perspective.\n📜 Looking at it from a historical perspective This is just speculation, but there is no evidence to support it. In fact, such information has been revealed in many past interviews.\nHow did the planning work come about? In the past, planning responsibilities were shared between programmers and artists (mostly programmers), resulting in fewer communication issues, primarily because their knowledge levels were relatively similar. Over time, the workload became too heavy for programmers and artists to handle alone, leading to the emergence of the planning role. Many believed that planning could be delegated to others, essentially treating it as a menial task.\nThe idea of having the planner handle this work is not inherently problematic, but the biggest issue arises when some people suggest that the planner should lead the project. This is a significant concern, as it would be akin to having a general assistant serve as your leader—can you truly trust such an arrangement?\n❓ So why is communication with artists not a problem? I think the reason is simple. Artists are a profession that is close to players, so it makes sense. Let\u0026rsquo;s take a more practical example. Artists can draw a flying horse, but can you “make” a flying horse in reality? Obviously not. At its core, drawing and engineering are fundamentally different disciplines.\n💡 Becoming a true planner I don’t consider myself a planner, but I believe a competent planner possesses the following qualities (at least the abilities that past planners have had).\nThe ability to reverse engineer and uncover the underlying mechanics of a game. Possessing basic programming and art skills—not top-notch, but not so lacking that communication is impossible! Being able to make accurate and realistic proposals (to assist art and programming). The main distinction here is whether you are a “planner” or just a “player who happens to be working in the game industry”? 🤔\n💬 Conclusion I have led countless development teams, and every project has this issue. So if you\u0026rsquo;re working on a project like this, don\u0026rsquo;t feel too discouraged or angry, because you\u0026rsquo;re not alone. But the issue still exists and will continue to exist for some time. I believe that understanding the current situation is the only way to truly improve collaboration between development teams.\nI’d like to add that no solution is provided here, because I believe the problem lies in the industry standards having deviated from their original purpose. In a way, it’s unsolvable. 🤔\n","permalink":"https://www.jcs-profile.com/posts/game-dev/the-hard-truth-about-game-designers-communication/","summary":"\u003cp\u003eI’ve been wanting to write an article about communication\nissues among game designers for quite some time now. This\nissue has been simmering within the gaming industry for\nsome time and has been troubling me as well. As a programmer,\nhow can I communicate more smoothly with planners? This\narticle simply aims to document the situations I have\nobserved and, by the end, hopefully provide a better answer\nto my own doubts.\u003c/p\u003e","title":"Problem with Game Designers communicate with programmers"},{"content":" This is a rant about software engineering interviews and LeetCode.\n🗯️ Preamble In 2024, hundreds of thousands of people worldwide are grinding through LeetCode, aiming to break into the tech industry, drawn by the high salaries it offers.\n🤔 What does LeetCode actually bring? LeetCode offers little more than these benefits:\nAlgorithm exercises and data structure knowledge Coding under pressure (Why though? Are we in a war zone now?) Passing coding interviews However, completing LeetCode doesn\u0026rsquo;t prove you\u0026rsquo;re a good software engineer. It only shows you can code basic algorithms and solve programming puzzles. It doesn\u0026rsquo;t test essential skills like collaboration, communication, documentation, design patterns, system architecture, low-level programming, or core computer science knowledge.\nIf LeetCode only tests these basic skills, what are employers hiring for? An entry-level programmer? It\u0026rsquo;s like hiring a doctor but only testing their basic chemistry knowledge—something they rarely use in real-world situations.\n⁉️ What\u0026rsquo;s the real issue? LeetCode practice isn\u0026rsquo;t about learning. You don’t gain insights into computer science or system design;instead, you learn how to pass coding interviews. If the problem isn’t obvious, here’s another way to look at it: it’s like being in school where learning isn\u0026rsquo;t the point—passing the test and getting good grades is. This mentality might explain why some people, despite being labeled as \u0026ldquo;educated,\u0026rdquo; still act or think poorly. Now, we\u0026rsquo;re doing the same thing with tech interviews.\nLeetCode is not Software Engineering. 😕\n💡 What are better solutions? There are so many more productive things to do. Contribute to Nix/NixOS, improve Emacs’ ecosystem, enhance Java package management, work on C and CMake workflows, better the Godot Asset Store, or practice writing parsers and language servers. So much remains imperfect, yet people waste time on LeetCode. 😢\nIt’s better to study other people\u0026rsquo;s code, talk to them, and learn how they solve real-world programming problems.\nThe industry is suffering because we’ve taken the lazy route—using software to filter candidates without assessing real talent. 😞\n😤 I\u0026rsquo;m not alone A quick Google search reveals countless rants:\nLeetCode Ruined Software Engineering… LeetCode: The Worst Thing to Happen to Software Engineering 💬 Conclusion We can\u0026rsquo;t escape this trend. History has shown that, for now, this is the path society follows. Maybe software engineering just isn\u0026rsquo;t for me at this moment\u0026hellip; 🧐\n","permalink":"https://www.jcs-profile.com/posts/career/problem-with-leetcode-and-swe-jobs/","summary":"\u003cblockquote\u003e\n\u003cp\u003eThis is a rant about software engineering interviews and \u003ca href=\"https://leetcode.com/\"\u003eLeetCode\u003c/a\u003e.\u003c/p\u003e\u003c/blockquote\u003e\n\u003c!-- more --\u003e\n\u003ch2 id=\"-preamble\"\u003e🗯️ Preamble\u003c/h2\u003e\n\u003cp\u003eIn 2024, hundreds of thousands of people worldwide are grinding through \u003ca href=\"https://leetcode.com/\"\u003eLeetCode\u003c/a\u003e, aiming to break into the tech industry, drawn by the high salaries it offers.\u003c/p\u003e\n\u003ch2 id=\"-what-does-leetcode-actually-bring\"\u003e🤔 What does LeetCode actually bring?\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://leetcode.com/\"\u003eLeetCode\u003c/a\u003e offers little more than these benefits:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Algorithm\"\u003eAlgorithm\u003c/a\u003e exercises and \u003ca href=\"https://en.wikipedia.org/wiki/Data_structure\"\u003edata structure\u003c/a\u003e knowledge\u003c/li\u003e\n\u003cli\u003eCoding under pressure (Why though? Are we in a war zone now?)\u003c/li\u003e\n\u003cli\u003ePassing coding interviews\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eHowever, completing \u003ca href=\"https://leetcode.com/\"\u003eLeetCode\u003c/a\u003e doesn\u0026rsquo;t prove you\u0026rsquo;re a good software engineer.\nIt only shows you can code basic algorithms and solve programming puzzles.\nIt doesn\u0026rsquo;t test essential skills like collaboration, communication, documentation, design patterns, system architecture, low-level programming, or core computer science knowledge.\u003c/p\u003e","title":"Problem with LeetCode and SWE jobs"},{"content":"Recently, I came across a post on LinkedIn with the eye-catching title, “I think I’ve met a 10x engineer.” But as I read through the post, I started to have doubts. The author described how one of their colleagues had managed to fix a bunch of complex bugs in a short amount of time, which left them in awe. 🤔\nBut is that really what defines a 10x engineer? It brought back memories of my own experience as a so-called 10x engineer during my first job!\n🗯️ Preamble This took place during my very first job as a Unity software engineer at IMI Technology (which, by now, should have shut down). My primary responsibility was to develop board games.I joined the company mainly because it was conveniently close to home and the pay was reasonable, so I didn’t give it much thought. While some might find game development either intriguing or off-putting, this post isn’t about that industry. It’s purely a reflection of my own experience in software development.\n✏️ Overview The team was made up of 8 people: 5 senior engineers with over 10 years of experience, 1 junior developer, and 2 entry-level engineers. The roles were divided like this:\n3 senior engineers + 1 beginner developing servers in Java 1 senior engineer working with Phaser to develop web game clients 1 senior engineer + me (entry-level) developing the Unity game client 1 entry-level engineer learning the ropes (I’m not really sure what his specific role was) As you can see, I was tasked with working on the Unity game client alongside a senior engineer. Ironically, our team was on the brink of being disbanded. Apparently, our boss wasn’t happy with our progress, and the project was taking too long. Unbeknownst to me at the time, the entire department was on the chopping block. 😒\n📊 Comparison Within our team, I handled all the core game development on my own, while another engineer focused on the UI. I completed the entire game in about a month (around 20 days), replicating all the content from the web client with ease. For comparison, it took the senior engineer 10 months to finish the web client.\nOf course, this is an unfair comparison. The web client engineer had to learn Phaser from scratch and develop the first version, which led to higher communication overhead. I just had to replicate what was already built. 🤔\nStill, when looking at the total development time alone (without diving into the nuances), it was a striking difference: 1 month vs. 10 months! 😬\n💬 Conclusion This happened back in July 2019 (nearly 5 years ago), so the details are a bit hazy, and this post is relatively short. Despite that, I wanted to document the experience because it’s unlikely I’ll go through something like this again—at least, I hope not! 💦\nI also want to stress that my former colleagues were extremely skilled, and I never questioned their professionalism. From what I saw, they were absolutely top-tier in their fields! 💯\n","permalink":"https://www.jcs-profile.com/posts/career/being-10x-engineer-in-my-first-job/","summary":"\u003cp\u003eRecently, I came across a post on \u003ca href=\"https://linkedin.com/\"\u003eLinkedIn\u003c/a\u003e with the eye-catching title, “I think I’ve met a 10x engineer.”\nBut as I read through the post, I started to have doubts. The author described how one of their colleagues had\nmanaged to fix a bunch of complex bugs in a short amount of time, which left them in awe. 🤔\u003c/p\u003e\n\u003cp\u003eBut is that really what defines a 10x engineer? It brought back memories of my own experience as a so-called 10x engineer during my \u003cstrong\u003efirst job\u003c/strong\u003e!\u003c/p\u003e","title":"Being 10x engineer in my first job"},{"content":" Repo link: https://github.com/elisp-lsp/ellsp\nI’ve recently created a language server for Emacs Lisp. It’s interesting since people don’t think a language server for Emacs Lisp will provide any value. The statement is correct, and so do I. Emacs Lisp is only used within the Emacs editor, and Emacs itself is an Emacs Lisp interpreter. Therefore, a language server for Emacs Lisp would hardly bring any benefits to Emacs users.\nBut imagine you can code elisp (short for Emacs Lisp) outside of Emacs. That sounds interesting, huh? 🤔\n🔰 Start from scratch Okay, I didn\u0026rsquo;t start entirely from scratch. I did use some libraries to help me set up things faster. Here are the important one:\nlsp-mode elsa - I\u0026rsquo;ve used some of their code What I\u0026rsquo;ve started from scratch is the stdio solution. It\u0026rsquo;s incredible how simple stdio can be within Emacs\u0026rsquo; batch mode.\n💫 Issue 1: read-from-minibuffer and \\r/\\n The function read-from-minibuffer is one way to receive standard input within Emacs\u0026rsquo; batch mode. There is one issue with this method. It doesn\u0026rsquo;t receive input until there is a \\r or \\n character at the end. That\u0026rsquo;s annoying since the language server would never receive the complete packet. Here is what I would receive from the language client:\nContent-Length: 8203\\r\\n \\r\\n {json} And, this is what I hope to see:\nContent-Length: 8203\\r\\n \\r\\n {json}\\r\\n I’ve spent a couple of hours searching for a solution. Unfortunately, I’m not able to find one. Then, I decided to create a proxy stdio application using node.js and JavaScript that forwards an extra \\r\\n at the end of the packet.\nlet proc = startEmacs(); // Create process Emacs process.stdin.on(\u0026#39;data\u0026#39;, function(data) { let input = data.toString(); proc.stdin.write(input + \u0026#39;\\r\\n\u0026#39;); // Forward with an extra `\\r\\n`! }); Wola, now I am able to receive data from the language client! 🚀\nmethod: initialize \u0026lt;\u0026lt; {\u0026#34;jsonrpc\u0026#34;:\u0026#34;2.0\u0026#34;,\u0026#34;id\u0026#34;:0,\u0026#34;result\u0026#34;:{\u0026#34;server-info\u0026#34;:{\u0026#34;name\u0026#34;:\u0026#34;ellsp\u0026#34;,\u0026#34;version\u0026#34;:\u0026#34;0.1.0\u0026#34;},\u0026#34;capabilities\u0026#34;:{\u0026#34;hoverProvider\u0026#34;:true,\u0026#34;textDocumentSync\u0026#34;:{\u0026#34;openClose\u0026#34;:true,\u0026#34;save\u0026#34;:true,\u0026#34;change\u0026#34;:1},\u0026#34;completionProvider\u0026#34;:{\u0026#34;resolveProvider\u0026#34;:false},\u0026#34;signatureHelpProvider\u0026#34;:{\u0026#34;triggerCharacters\u0026#34;:[\u0026#34; \u0026#34;]}}}} 💫 Issue 2: Specification\u0026hellip; error? According to LSP Specification, we should send two \\r\\n between the Content-Length and the content itself (JSON body). However, for some reason, the language client never gets initialized\u0026hellip;\nThe solution here is to just use \\n instead. (Don\u0026rsquo;t ask me why; I have no idea.) 🤔\nmethod: initialized \u0026lt;\u0026lt; no response ⚜️ Conclusion I apologize; this post isn’t about the implementation details. The implementation is quite simple. It only took me a couple of hours to implement it. If you are interested in the implementation, please check out the repository directly. The link is at the beginning of this page.\n","permalink":"https://www.jcs-profile.com/posts/editor/elisp-ls/","summary":"\u003cblockquote\u003e\n\u003cp\u003eRepo link: \u003ca href=\"https://github.com/elisp-lsp/ellsp\"\u003ehttps://github.com/elisp-lsp/ellsp\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eI’ve recently created a language server for Emacs Lisp. It’s interesting\nsince people don’t think a language server for Emacs Lisp will provide\nany value. The statement is correct, and so do I. Emacs Lisp is only used\nwithin the Emacs editor, and Emacs itself is an Emacs Lisp interpreter.\nTherefore, a language server for Emacs Lisp would hardly bring any benefits\nto Emacs users.\u003c/p\u003e\n\u003cp\u003eBut imagine you can code elisp (short for Emacs Lisp) outside of Emacs.\nThat sounds interesting, huh? 🤔\u003c/p\u003e","title":"Elisp Language Server"},{"content":"ELPA stands for Emacs Lisp Package Archive. It\u0026rsquo;s used for Emacs users to download packages from, and it\u0026rsquo;s also the place where Emacs Lisp developers will host their packages. Here is a list of famous ELPA; see their site for more information!\nGNU Elpa (official) NonGNU Elpa (official) MELPA ❓ Why? So why do we want to host our own ELPA? Aren’t those ELPAs enough?\nYes, in general, you don\u0026rsquo;t need to host ELPA yourself since most packages you need will be available in one of those ELPA (packages can co-exist between ELPA). Here are several reasons why you might want to build your own ELPA:\nThe package you like isn’t (yet) on any ELPA ELPA\u0026rsquo;s package review takes a couple of days or months to review (MELPA is probably the fastest) For packages that are no longer maintained, you can link to the newly maintained fork Similar to Pt. 3, if there are bugs in the package you like, you can create a new fork to replace it! For elisp package development purposes. Sometimes, more than the build tools are needed. 📝 Prerequisite Some knowledge about Emacs Lisp Install Eask CLI 🔍 Step 1. Create ELPA project It\u0026rsquo;s easy to build your own ELPA with Eask. You only need a few commands, and it will run.\nFirst, we need to create the ELPA project:\n$ eask create elpa \u0026lt;project_name\u0026gt; In the example, I\u0026rsquo;m going to use my-elpa as my project name:\n$ eask create elpa my-elpa Then you will be prompted to create the Eask file; enter the required information like this:\n✓ Done cloning the ELPA template Initialize the Eask-file for your project... package name: (my-elpa) version: (1.0.0) description: Test ELPA entry point: (my-elpa.el) emacs version: (26.1) website: keywords: elpa About to write to /home/jenchieh/my-elpa/Eask: (package \u0026#34;my-elpa\u0026#34; \u0026#34;1.0.0\u0026#34; \u0026#34;Test ELPA\u0026#34;) (website-url \u0026#34;\u0026#34;) (keywords \u0026#34;elpa\u0026#34;) (package-file \u0026#34;my-elpa.el\u0026#34;) (script \u0026#34;test\u0026#34; \u0026#34;echo \\\u0026#34;Error: no test specified\\\u0026#34; \u0026amp;\u0026amp; exit 1\u0026#34;) (source \u0026#34;gnu\u0026#34;) (depends-on \u0026#34;emacs\u0026#34; \u0026#34;26.1\u0026#34;) Is this OK? (yes) yes And here is the output:\nPackage-file seems to be missing `my-elpa.el\u0026#39; Preparing your new ELPA project... done v Congratulations! Your new ELPA project is created in /home/jenchieh/my-elpa/ [1] Navigate to /home/jenchieh/my-elpa/ [2] Try out the command `eask info` [3] See the README.md file to learn to use this project Visit https://emacs-eask.github.io/ for quickstart guide and full documentation. Now, you will see the project my-elpa has been created! Use the ls command to see what\u0026rsquo;s in the project folder:\nroot@6a52f76aff2d:/home/jenchieh/my-elpa# ls Eask README.md docs recipes 🔍 Step 2. Add recipes! Now, you can add recipes to the recipes folder.\nIf you don\u0026rsquo;t know what\u0026rsquo;s the recipe, see melpa#recipe-format for more information!\nIn this example, I\u0026rsquo;m going to add the jcs-modeline to this ELPA. But you can add whatever package you like!\nThis is the recipe file, and place it as my-elpa/recipes/jcs-modeline (no file extension).\n(jcs-modeline :repo \u0026#34;jcs-emacs/jcs-modeline\u0026#34; :fetcher github) 🔍 Step 3. Build it! Nice! Now, we have one package in our ELPA.\nNext, build our ELPA to host it with GitHub pages (or your own server).\nFirst, we need to install dependencies for our project.\n$ eask install-deps The output:\nroot@6a52f76aff2d:/home/jenchieh/my-elpa# eask install-deps Package-file seems to be missing `my-elpa.el\u0026#39; Loading package information... done v Installing 1 package dependency... - [1/1] Installing github-elpa (20200129.417)... done v (Total of 1 dependency installed, 0 skipped) Once all dependencies have been installed, we can build our ELPA with the following command:\n$ eask run build The output:\n:: github-elpa: packaging recipe jcs-modeline Package: jcs-modeline Fetcher: github Source: https://github.com/jcs-emacs/jcs-modeline.git Cloning https://github.com/jcs-emacs/jcs-modeline.git to /home/jenchieh/my-elpa/.github-elpa-working/jcs-modeline/ Checking out afff69f4ef4a126902abe271f1e3fd22b9f91021 Copying files (-\u0026gt;) and directories (=\u0026gt;) from /home/jenchieh/my-elpa/.github-elpa-working/jcs-modeline/ to /tmp/jcs-modelinengILfd/jcs-modeline-20230901.330 jcs-modeline.el -\u0026gt; jcs-modeline.el Created jcs-modeline-20230901.330.tar containing: jcs-modeline-20230901.330/ jcs-modeline-20230901.330/jcs-modeline-pkg.el jcs-modeline-20230901.330/jcs-modeline.el ✓ Success: 2023-09-16T03:29:36+0000 jcs-modeline-20230901.330.entry 2023-09-16T03:29:36+0000 jcs-modeline-20230901.330.tar Built jcs-modeline in 0.655s, finished at 2023-09-16T03:29:36+0000 Congratulations! 🎉 Now you have your own ELPA!\nNext, you would just need to push to a GitHub repo and enable GitHub Pages for that repo. See github-elpa#3-change-repository-setting for more information!\n","permalink":"https://www.jcs-profile.com/posts/editor/build-elpa/","summary":"\u003cp\u003e\u003ca href=\"https://www.emacswiki.org/emacs/ELPA\"\u003eELPA\u003c/a\u003e stands for Emacs Lisp Package Archive. It\u0026rsquo;s used for Emacs users\nto download packages from, and it\u0026rsquo;s also the place where Emacs Lisp developers\nwill host their packages. Here is a list of famous \u003ca href=\"https://www.emacswiki.org/emacs/ELPA\"\u003eELPA\u003c/a\u003e; see their site\nfor more information!\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://elpa.gnu.org/\"\u003eGNU Elpa\u003c/a\u003e (official)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://elpa.nongnu.org/\"\u003eNonGNU Elpa\u003c/a\u003e (official)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://melpa.org/#/\"\u003eMELPA\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"-why\"\u003e❓ Why?\u003c/h2\u003e\n\u003cp\u003eSo why do we want to host our own ELPA? Aren’t those ELPAs enough?\u003c/p\u003e\n\u003cp\u003eYes, in general, you don\u0026rsquo;t need to host ELPA yourself since most packages\nyou need will be available in one of those ELPA (packages can co-exist\nbetween ELPA). Here are several reasons why you might want to build\nyour own ELPA:\u003c/p\u003e","title":"How to build your own ELPA with Eask?"},{"content":" Repo Link: https://github.com/shader-ls/vscode-shader\nAug 23rd, 2023. I\u0026rsquo;ve created my first VSCode plugin \u0026ndash; vscode-shader. My intention was simple: to create a language server\u0026rsquo;s client in VSCode for my shader-language-server that I created a couple of months ago. 🤔\n🔰 Simple and good UX First of all, it is very simple to develop a VSCode plugin. Especially developing a language server\u0026rsquo;s client for VSCode. There are many examples and good documentation on their site, making it very easy for developers. I am using uniteai and grammarly-language-server as the references.\n📦 Publish to VSCode Marketplace Publishing to VSCode is probably the most challenging step since you need to navigate to Azure DevOps, which seems utterly irrelevant to VSCode Marketplace! 🤔 Then get the Personal Access Token in order to publish your packages to the marketplace. It\u0026rsquo;s still straightforward but quite confusing on the Azure DevOps part.\nThen you just need to npm install -g @vscode/vsce, vsce package and vsce publish. While publishing, you will be asked to enter your PAT!\nYou can see VSCode\u0026rsquo;s Publishing Extensions website for more information!\n🎖️ Achievement Created a language server client, vscode-shader. My first published VSCode plugin, see https://marketplace.visualstudio.com/items?itemName=shader-ls.vscode-shader. ","permalink":"https://www.jcs-profile.com/posts/lsp/vscode-shader/","summary":"\u003cblockquote\u003e\n\u003cp\u003eRepo Link: \u003ca href=\"https://github.com/shader-ls/vscode-shader\"\u003ehttps://github.com/shader-ls/vscode-shader\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eAug 23rd, 2023. I\u0026rsquo;ve created my first VSCode plugin \u0026ndash; \u003ca href=\"https://github.com/shader-ls/vscode-shader\"\u003evscode-shader\u003c/a\u003e.\nMy intention was simple: to create a language server\u0026rsquo;s client in VSCode\nfor my \u003ca href=\"https://github.com/shader-ls/shader-language-server\"\u003eshader-language-server\u003c/a\u003e that I created a couple of months ago. 🤔\u003c/p\u003e\n\u003c!-- more --\u003e\n\u003ch2 id=\"-simple-and-good-ux\"\u003e🔰 Simple and good UX\u003c/h2\u003e\n\u003cp\u003eFirst of all, it is very simple to develop a VSCode plugin.\nEspecially developing a language server\u0026rsquo;s client for VSCode.\nThere are many examples and good documentation on their site,\nmaking it very easy for developers. I am using \u003ca href=\"https://github.com/freckletonj/uniteai\"\u003euniteai\u003c/a\u003e and\n\u003ca href=\"https://github.com/emacs-grammarly/grammarly-language-server\"\u003egrammarly-language-server\u003c/a\u003e as the references.\u003c/p\u003e","title":"My first VSCode plugin"},{"content":" Repo Link: https://github.com/shader-ls/shader-language-server\nApril 30th, 2023. I have created my first language server that is actually useful to someone. I tried a language server a while back, but it was just an example server, so it’s not very useful, and it’s only for educational purposes.\nThe target language I chose to write is the ShaderLab language. ShaderLab is used in Unity Engine, so you can write custom shaders to stylize your game. Unlike regular programming languages, ShaderLab is much simpler to analyze, so the language server can respond to the client side.\n❓ Why chose C# as the implementaion language? Since Unity Engine\u0026rsquo;s most popular scripting language is C#, I reckon choosing C# is the perfect match.\n💀 C# Language Server Protocal Hell I already had a bad feeling when writing a language server in C# before starting it since I never had a good impression of the author Omnisharp\u0026rsquo;s plugins. I\u0026rsquo;ve tried their official C# plugins on the VSCode Marketplace, but to be honest, I wouldn\u0026rsquo;t say I like it. Here are a few reasons why:\nIt\u0026rsquo;s slow Constant breaking changes. Next update nothing works! Maintainers are not very active (but the community is friendly though) Nevertheless, I insist on giving csharp-language-server-protocol a shot since there are no other reasonable alternatives. After digging it for a few days, here are issues I am facing:\nExample from the official repository is either broken or incomplete (kinda useless) Obsolete or lack of documentation They don\u0026rsquo;t really care about other editors. (Many editor compatible issues and PRs are left opened) Fortunately, I found the thousand language server created by @gulbanana and HlslTools created by @tgjones. Therefore, I am able to accomplish this project by seeing their implementations! 😅😇\nP.S. It took me very long to figure things out!!! 💀\n⚙️ Plug-in ShaderlabVS Another challenge is the engine of the language server. What parses the text document and gives reasonable responses to the client? Then I found a project that already does that for me \u0026ndash; ShaderlabVS. It\u0026rsquo;s an ideal solution since the implementation are also in C#. Thanks to the author @wudixiaop for this amazing project! ❤️\n💥 Create a language server client Okay, now we have a language server up and running, but there is no way to test it! I\u0026rsquo;m an Emacs user, so I\u0026rsquo;ve decided to create an Emacs package \u0026ndash; lsp-shader that uses lsp-mode as the base and use it as my language server\u0026rsquo;s client. I\u0026rsquo;ve already created several language server\u0026rsquo;s clients in Emacs Lisp, so creating another isn\u0026rsquo;t too difficult. 😁\n📦 Publish on NuGet I have no experience publishing packages to NuGet, but it wasn\u0026rsquo;t hard after watching a couple of tutorials on YouTube. I use the csharp-language-server created by @razzmatazz as my reference since this is the only project I know with a similar structure I want.\nIn closing, you only need two step to publish package on NuGet. 😋\nPack the package from Visual Studio Upload to NuGet site 🎖️ Achievement Created a language server. Created Emacs language server\u0026rsquo;s client for shader-ls, lsp-shader. My first published NuGet package, see https://www.nuget.org/packages/shader-ls/. ","permalink":"https://www.jcs-profile.com/posts/lsp/shader-ls/","summary":"\u003cblockquote\u003e\n\u003cp\u003eRepo Link: \u003ca href=\"https://github.com/shader-ls/shader-language-server\"\u003ehttps://github.com/shader-ls/shader-language-server\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eApril 30th, 2023. I have created my first language server that is actually\nuseful to someone. I tried a language server a while back, but it was just\nan example server, so it’s not very useful, and it’s only for educational\npurposes.\u003c/p\u003e\n\u003cp\u003eThe target language I chose to write is the \u003ca href=\"https://docs.unity3d.com/Manual/SL-Reference.html\"\u003eShaderLab\u003c/a\u003e language.\nShaderLab is used in Unity Engine, so you can write custom shaders\nto stylize your game. Unlike regular programming languages, \u003ca href=\"https://docs.unity3d.com/Manual/SL-Reference.html\"\u003eShaderLab\u003c/a\u003e\nis much simpler to analyze, so the language server can respond to the\nclient side.\u003c/p\u003e","title":"Shader Language Server (LS)"},{"content":"⚠️ The intention of this post is to remind myself why Emacs isn\u0026rsquo;t worth my time anymore.\nI\u0026rsquo;ve been using Emacs since 2015. I have developed more than 150 elisp packages, and maintained over 200 packages (including my packages). It\u0026rsquo;s been a long journey staying in the Emacs community, I think it\u0026rsquo;s a good for me to slow myself down and step back a little and think what I\u0026rsquo;ve accomplished through out these years.\n💫 How I got into Emacs? Many people asked me this question, so I decided to reply it here.\nI first saw Emacs is at 2015, seeing Casey Muratori\u0026rsquo;s Handmade Hero series. I was blown away by how fast he can code in Emacs. How he can jump to other window and never leave the keyboard are all new to me.\nBut if I look at his configuration now, it\u0026rsquo;s actually not so great. He doesn\u0026rsquo;t use any third-party packages, so he has every defined in his own configuration file (~/.emacs file). The configuration can still be great without using those third-party packages, but it will only limit you and remake the wheel that maybe others have already done for you.\nBesides all of that, Casey is still a top-tier programmer I have known in my whole life. ❤️\n💫 How much I\u0026rsquo;ve put my time to Emacs? Like I\u0026rsquo;ve mentioned above, trust me. I put in a lot of time to accomplish what I\u0026rsquo;ve done for the Emacs community. If you search all my packages, I hold the most packages in MELPA. The time I have put kinda proof how much I love Emacs, but also how much I get disappointed with Emacs. 😥\n💫 Why Emacs isn\u0026rsquo;t the worth my time anymore? First of all, there is nothing wrong with the Emacs\u0026rsquo; devel. They did a great job keeping Emacs alive, and I like their mentality and most of their technical decisions.\nFor me, the problem is the Elisp dev ecosystem (not the Emacs community itself; consider the Elisp dev ecosystem is the subset of the Emacs community). I appreciate people willing to contribute to Emacs, but I hate when they don\u0026rsquo;t consider their packages' cross-platform capability. Yes, I\u0026rsquo;m a Windows user; actually, I use all the most used systems (Linux, macOS, and Windows). I hate that when I try a package, it only works on a specific system (excluding packages that only rely on certain systems), but it is supposed to work on all systems. I feel terrible and frustrated because most of the Elisp dev does not care or does not care enough about the minority users (Windows users). Even some famous packages don\u0026rsquo;t work well on Windows, magit is slow, straight.el is slow, helm is slow, ivy is slow, projectile is broken, eping is broken, EAF is constatly broken, etc. I use over 500 packages in my configuration. I can list a ton of packages that have terrible cross-platform capability.\nBut are they all bad? Of course not. Most of the authors show patience and are willing to help you with the issue you have encountered. At least they have tried to solve these issues and provide a workaround, etc. Like magit has a GitHub issue (magit/#2982) that explicitly talking about the Windows performance. EAF authors and maintainers constantly respond to the users they have trouble with. These projects are amazing, and I appreciate them so much! But most of them aren\u0026rsquo;t like that\u0026hellip; Unfortunately, they either don\u0026rsquo;t care or don\u0026rsquo;t care enough.\nIn the 2020 Emacs survey, Windows users are only 8%! I\u0026rsquo;ve heard a lot of people claim I\u0026rsquo;m wrong. First of all, I\u0026rsquo;m in the minority; only God knows what we think. Second of all, I wish more than anyone I am wrong. I don\u0026rsquo;t care if I\u0026rsquo;m wrong or not. I want the UX to be improved!\nMany people complain about the OS (Windows), suggest using the WSL, etc. But that\u0026rsquo;s not the issue. Ignoring the issue is the issue! If you can\u0026rsquo;t solve the issue from another platform, don\u0026rsquo;t blame the platform. Blame yourself! There are no bad systems, only bad programmers (in this case).\nTo answer my own question, I am tired of being in the minority. It\u0026rsquo;s laborious and tedious. I\u0026rsquo;m tired of complaining to other Elisp dev. For people that know me, you know I hate to say all this. It\u0026rsquo;s sad and hopeless. Why bother? You might have known why I put so much time into Emacs. I\u0026rsquo;m only filling the gap between Unix-like systems and Windows. And yes, all my packages work across all platforms.\n💫 Will I leave Emacs community? The short answer is no. I will most likely not going to develop more Emacs packages anymore; unless I really want to. But I will continue to maintain all the packages I\u0026rsquo;m currently maintaining since I will continue to use Emacs for my future work!\n⚜️ Conclusion I didn\u0026rsquo;t know the article would be this long. It\u0026rsquo;s been a very long journey for me. I have learned a lot from this community and know many great people. I appreciate people who use my packages and those who do care the minority users like me. ❤️🙏\n","permalink":"https://www.jcs-profile.com/posts/editor/long-journey-with-emacs/","summary":"\u003cp\u003e\u003cstrong\u003e⚠️ The intention of this post is to remind myself why Emacs isn\u0026rsquo;t worth my time anymore.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been using Emacs since 2015. I have developed more than 150 elisp packages,\nand maintained over 200 packages (including my packages). It\u0026rsquo;s been a long\njourney staying in the Emacs community, I think it\u0026rsquo;s a good for me to slow\nmyself down and step back a little and think what I\u0026rsquo;ve accomplished through\nout these years.\u003c/p\u003e","title":"Long Journey with Emacs"},{"content":"I\u0026rsquo;ve developed more than 50 elisp packages, and maintain 100 or more of them. Developing an elisp package isn\u0026rsquo;t easy for a beginner, especially for those who want to publish their package to an ELPA. e.g., GNU Elpa, NonGNU Elpa, MELPA, etc.\nThat\u0026rsquo;s why I use Eask to help me develop elisp packages. Therefore, in this article, I\u0026rsquo;m going to teach people how to use this tool to help you build your own elisp packages! 😄\n🗨️ Trouble using Eask Eask now has more than 50 commands (including hidden ones). The tool is fairly complex so the first thing you need to know is to use --help when have trouble using this tool.\n$ eask --help 📦 Build the package Here we jump right into the package development. I assumed you already know how to create Eask-file and want to use this tool effectively right a way.\nI\u0026rsquo;m going to use an existing elisp package I\u0026rsquo;ve created openai.el just to show the workflow.\n# Clone the project $ git clone https://github.com/emacs-openai/openai.git # Navigate to project directory cd sideline # (Optional) Print the folder structure tree /f The project structure looks like this:\n│ .dir-locals.el │ .gitignore │ CHANGELOG.md │ Eask │ LICENSE.txt │ Makefile │ openai-audio.el │ openai-chat.el │ openai-completion.el │ openai-edit.el │ openai-embedding.el │ openai-engine.el │ openai-file.el │ openai-fine-tune.el │ openai-image.el │ openai-model.el │ openai-moderation.el │ openai.el │ README.md │ └───.github └───workflows test.yml We first build the package with:\n$ eask package This command will create a folder dist, and here is the result:\nNoticed this is a multi-file package so it\u0026rsquo;s built into a tar file. If we inspect the tar file, then this is the result:\n⚙ Install it Now you have created the package successfully, it means your package will have no issue hosting on any ELPA (GNU Elpa, MELPA, etc.). People can download your package on the ELPA you like to host. The next step is to test installing the package. It\u0026rsquo;s meaningless if people can download your package but aren\u0026rsquo;t able to install it. We install the package with the install command:\n$ eask install The package is installed in an isolated environment, so it won\u0026rsquo;t create any side effects to your personal configuration ~/.emacs.d/. Here is the result:\n📋 Activate in runtime The activation test is simple, we normally want to check if your package will run correctly on your user\u0026rsquo;s machine.\n$ eask test activate You should see the following output:\nLoading package information... done v Activating the package `openai\u0026#39;... succeeded v (Nothing to load.) Great! It means our package has been activated without any error! 😋\nThis step is generally optional, but it\u0026rsquo;s good to know if you will encounter any runtime errors!\n👷 Compile it! It\u0026rsquo;s time to compile your package! Compile step is the same as the install step. The only difference is it won\u0026rsquo;t need to be built (eask package) to test to see if your package will install correctly. Therefore, compile step is very helpful since we don\u0026rsquo;t always want to build the package for every change we have made.\n$ eask compile And yes, it compiles successfully without any errors! 😋\nCompiling d:/_workspace/elisp/openai/openai.el... done v Compiling d:/_workspace/elisp/openai/openai-audio.el... done v Compiling d:/_workspace/elisp/openai/openai-chat.el... done v Compiling d:/_workspace/elisp/openai/openai-completion.el... done v Compiling d:/_workspace/elisp/openai/openai-edit.el... done v Compiling d:/_workspace/elisp/openai/openai-embedding.el... done v Compiling d:/_workspace/elisp/openai/openai-engine.el... done v Compiling d:/_workspace/elisp/openai/openai-file.el... done v Compiling d:/_workspace/elisp/openai/openai-fine-tune.el... done v Compiling d:/_workspace/elisp/openai/openai-image.el... done v Compiling d:/_workspace/elisp/openai/openai-model.el... done v Compiling d:/_workspace/elisp/openai/openai-moderation.el... done v (Total of 12 files compiled, 0 skipped) ⚜️ Conclusion These are the basic uses of Eask, but there are more things that Eask can do. Like lint your package, run tests suite, or package management, etc. But we can cover these within the next chapter.\nThis is the result of all the commands we have used in this article:\neask package # Build package artifect (installable file) eask install # Install installable file eask test activate # Test package activation eask compile # Source code compilation ","permalink":"https://www.jcs-profile.com/posts/editor/emacs-eask-101/","summary":"\u003cp\u003eI\u0026rsquo;ve developed more than 50 elisp packages, and maintain 100 or more of them.\nDeveloping an elisp package isn\u0026rsquo;t easy for a beginner, especially for those\nwho want to publish their package to an ELPA. e.g., \u003ca href=\"https://elpa.gnu.org/\"\u003eGNU Elpa\u003c/a\u003e, \u003ca href=\"https://elpa.nongnu.org/\"\u003eNonGNU Elpa\u003c/a\u003e,\n\u003ca href=\"https://melpa.org/\"\u003eMELPA\u003c/a\u003e, etc.\u003c/p\u003e\n\u003cp\u003eThat\u0026rsquo;s why I use \u003ca href=\"https://github.com/emacs-eask/cli\"\u003eEask\u003c/a\u003e to help me develop elisp packages. Therefore, in this\narticle, I\u0026rsquo;m going to teach people how to use this tool to help you build your\nown elisp packages! 😄\u003c/p\u003e","title":"Emacs Eask 101 - Build tool"},{"content":"What\u0026rsquo;s the fastest ELPA? Let\u0026rsquo;s define it first! The ELPA runs the fastest? No, that doesn\u0026rsquo;t make any sense. The ELPA serves you the fastest? Maybe.\nThe definition for fastest ELPA in this article means it builds your packages the fastest! You might wonder why and how! Let me explain it to you!\nNormal ELPA, like MELPA, builds packages from the recipes directory, so it takes O(n) to do so. The more packages one ELPA holds, take longer the time to get packages to update to the server. The general solution is to use a more powerful PC to reduce the build time.\nHere comes JCS-ELPA, it uses the package github-elpa to host packages on the GitHub pages! But why is it the fastest LEPA? There are two factors:\nMicrosoft owns GitHub so technically we serve our ELPA on Microsoft\u0026rsquo;s server We build packages using GitHub Actions with multiple jobs (if you are unfamiliar with GHA, think as multiple PCs helping you build your packages) JCS-ELPA builds your packages with multiple jobs simultaneously! The formula:\nNew build time = Original Build time / jobs If jobs is equal to 1, then the new build time equals to original build time (no build time improvement). For example, if original build time is 10 minutes, and we start 3 jobs, the new build time will be 2 minutes.\n2 min = 10 min / 5 jobs Of course, this is not going to happen in the real life. In reality, we will need to consume time on job scheduling, starting and closing time for the jobs, etc. But in theory, the more packages the ELPA holds, you will see the big differences between these two models.\n👷 How does it work? 💡 Here we only explain how it works sine there aren\u0026rsquo;t enough packages to proof this ELPA is the fastest!\nAs of right now, there are only 136 packages hosted on JCS-ELPA. I have split these recipes into smaller sections. Let\u0026rsquo;s say 50 per section! The formula will be:\njobs = (total recipes / recipes per section) + 1 Hence:\n3 = (136 / 50) + 1 Now you have 3 workers to help you build packages onto our server! The original build time was 4 to 5 minutes, now it\u0026rsquo;s 1.5 minutes! What a big improvement! 😄\nOne of the coolest things is you can see what happens directly through the GHA\u0026rsquo;s log!\n","permalink":"https://www.jcs-profile.com/posts/editor/fastest-elpa/","summary":"\u003cp\u003eWhat\u0026rsquo;s the fastest ELPA? Let\u0026rsquo;s define it first! The ELPA runs the fastest? No,\nthat doesn\u0026rsquo;t make any sense. The ELPA serves you the fastest? Maybe.\u003c/p\u003e\n\u003cp\u003eThe definition for fastest ELPA in this article means it builds your packages\nthe fastest! You might wonder why and how! Let me explain it to you!\u003c/p\u003e\n\u003c!-- more --\u003e\n\u003cp\u003eNormal ELPA, like MELPA, builds packages from the \u003ccode\u003erecipes\u003c/code\u003e directory, so it\ntakes O(n) to do so. The more packages one ELPA holds, take longer the time to\nget packages to update to the server. The general solution is to use a more\npowerful PC to reduce the build time.\u003c/p\u003e","title":"Fastest ELPA"},{"content":"I have always been using AWS as my main web hosting choice. But I have come to the point that I reckon the price and services aren\u0026rsquo;t something that I need. Therefore, I have decided to switch to another web hosting company just for another taste.\nThe main reasons are listed below:\nAWS charges you money when you click on their services without notifying the user. I dislike how it functions. The price is too high, plus I don\u0026rsquo;t really need it UI is awful, and UX is bad Jargons aren\u0026rsquo;t transferable (I\u0026rsquo;m picky) Now, let\u0026rsquo;s move into details.\n📋 Transfer the domain name The target domain I am transferring is jcs-profile.com . If we checked who.is; the registrar is amazon.com. I bought the domain name using AWS\u0026rsquo;s Route 53. But now, I would like to transfer it to Namecheap . This isn\u0026rsquo;t the cheapest choice, but I like their UI/UX. It\u0026rsquo;s simpler and looks much more organized compared to AWS\u0026rsquo;s UI.\nI watched the below video when I was picking my new domain name registrar. I attempted to use Google Domains since it\u0026rsquo;s the best choice from the video, but it came out it doesn\u0026rsquo;t support my country/region, Taiwan (WIP). So I go for the second best choice, which is Namecheap. 😅\nCraylor Made explains very well! Big thanks to him!\nNOTE: It took them 5 days to complete transfer. So I\u0026rsquo;ll have to wait until the transfer is completed!\n📂 Transfer data Transfer data is easy, I use FileZilla (as always) to download all the files I need to move over to the new server. Unlike Node, PHP, or MySQL; there isn\u0026rsquo;t much environment I need to set up (except the Nginx) . We would just have to ensure don\u0026rsquo;t ever close the old server until we have moved everything to the new server!\nSomething I always want to try out is the Docker migration. It sounds like fun to me! But I guess I will have to wait until next time I get the opportunity.🙂\n🩹 Restart our server I have chosen DigitalOcean as my new web hosting company. Reasons are:\ncheaper (relative to aws) Easier to see what is charged and what not Excellent UI Documentation is great; the community seems to be friendly The only defect is the server\u0026rsquo;s location, and there aren\u0026rsquo;t many locations to choose.\nFirst thing first, after transferring all the data. We need to update the name servers so it can be redirected to the correct IP address.\nThe following video says it all. It\u0026rsquo;s amazing!\nThe old name servers from AWS,\nns-1375.awsdns-43.org ns-1685.awsdns-18.co.uk ns-804.awsdns-36.net ns-93.awsdns-11.com The new name servers from DigitalOcean,\nns1.digitalocean.com. ns2.digitalocean.com. ns3.digitalocean.com. Then we need to modify the DNS Records from DigitalOcean\u0026rsquo;s website. We add @ and www points to our new server (IP).\nType Hostname Value TTL(seconds) A @ IP address 3600 (default) A www IP address 3600 (default) Then we are done! Hurray!~ 🥳🎉🎊\n","permalink":"https://www.jcs-profile.com/posts/server/first-server-migration/","summary":"\u003cp\u003eI have always been using AWS as my main web hosting choice. But I\nhave come to the point that I reckon the price and services aren\u0026rsquo;t\nsomething that I need. Therefore, I have decided to switch to another\nweb hosting company just for another taste.\u003c/p\u003e\n\u003c!-- more --\u003e\n\u003cp\u003eThe main reasons are listed below:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eAWS charges you money when you click on their services without\nnotifying the user. I dislike how it functions.\u003c/li\u003e\n\u003cli\u003eThe price is too high, plus I don\u0026rsquo;t really need it\u003c/li\u003e\n\u003cli\u003eUI is awful, and UX is bad\u003c/li\u003e\n\u003cli\u003eJargons aren\u0026rsquo;t transferable (I\u0026rsquo;m picky)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eNow, let\u0026rsquo;s move into details.\u003c/p\u003e","title":"First server migration"},{"content":"Timeline is placed in summer time, middle of July 2022, one of my friend (@henrykuh) invited me to join the Game Jam that he is going to host in Aug 2022. In the meantime, he has also invited me to rejoin the community MatchWorkshop , and become the headmaster of the Game Programming deparetment. Therefore, this Game Jam is treated as an opportunity to collaborate with other headmaster from other department in this community. 😕\nI believe networking is a massive part of the Game Jam; hence I have decided to join the event without too much hesitation. This Game Jam came in just about the right time since I just ended another project last month.\n❓ About Game Jam Game Jam\u0026rsquo;s full name are 5th DIY Game Jam: Surprise. This is hosted by DIY GM. Entire event is about 1 month, it\u0026rsquo;s a lot longer compare to regular Game Jams due to the COVID-19.\nThe theme is already announced through the title, surprise.\n🔰 Joined! Meet the team I was in the MatchWorkshop community once a while ago, but we didn\u0026rsquo;t have time and a chance to get to know each other well. This is the right time for me to network with other people who already have working experience in Taiwan\u0026rsquo;s Game Industry. Team and role are listed below:\nKyrie （Game Desinger） Yi （3D Artist） 黑攻 （2D Artist、Composer） 特里斯卡 （2D Artist） Jen-Chieh Shen （Engineer） \u0026lt;- That\u0026rsquo;s me! 😎 I reckon Yi and Kyrie are two essential pieces in this group. Without their contribution, our game will simply be a disaster. Yi is responsible for making our characters (Minions and Alice) look alive, which requires countless hours to accomplish such a heavy task. Kyrie made a decent GDD, and shows his passion during the entire Game Jam.\nWhat about Jen-Chieh (me)? He made the entire game (programming-wise) within 24 hours. It could be impressive but expected. 🙂 All I want to say is THANK YOU to the group!\n💡 Design, and Programmer View First of all, I didn\u0026rsquo;t come up with the game idea. The game design had been established before I joined the team. Therefore, I will only talk about the game-making (engineering) part of the game. Here are some issues that I think are worth mentioning for the record:\nGDD is incomplete, lack of details We don\u0026rsquo;t know who came up with the idea? (even at the very end of the event) No core design principles, game idea could not be established Nice reminder, this is NOT for me to blame on anyone in the group. I am simply pointing it out to help myself do better in the future. Anyways, we eventually made the game! Congratulation! 🎉🎊 Seeing the finished game always makes me feel good! ✨\n🖼️ Screenshots 💬 Conclusion Let\u0026rsquo;s move on to the conclusion; I sense this project is great compared to many games that have been submitted to the same event. Even though the game isn\u0026rsquo;t a complete complete game, but it has everything a game needs, and there are more details in the game. I am proud of myself in this event! 👍 The only thing I have in mind so the game can be more inclusive is that we don\u0026rsquo;t have time to debug and playtest more. I wish we could have more time or improve our time management during the event! 🙏\n🔗 Links Game: Alice In Surprise Game Jam DIY GM MatchWorkshop ","permalink":"https://www.jcs-profile.com/posts/game-dev/game-jam---aug-2022/","summary":"\u003cp\u003eTimeline is placed in summer time, middle of July 2022, one of my friend\n(\u003ca href=\"https://github.com/henrykuh\"\u003e@henrykuh\u003c/a\u003e) invited me to join the Game\nJam that he is going to host in Aug 2022. In the meantime, he has also\ninvited me to rejoin the community \u003ca href=\"https://github.com/MatchWorkshop\"\u003eMatchWorkshop\u003c/a\u003e\n, and become the headmaster of the Game Programming deparetment.\nTherefore, this Game Jam is treated as an opportunity to collaborate\nwith other headmaster from other department in this community. 😕\u003c/p\u003e","title":"Game Jam - Aug 2022"},{"content":"🔰 Introduction The name Eask came from Emacs Cask ; if you already know what Cask is and what it does, please skip this and forward to the next section.\n(NOTE: Cask and Eask are interchangeable in this section)\nEask is the dependency management tool for Emacs Lisp. It\u0026rsquo;s like npm to Node.js; but it isn\u0026rsquo;t exactly the same since Eask has fewer tools than npm, plus their ecosystems are slightly different. Below is the link Why Cask? has a better explanation.\nWhy Cask? ❓ Then why Eask, and not Cask? A simple comparison table below:\nBehind technology Cross-Platform Emacs Version Size Cask Bash, Batch, and Python (Windows) ❌ Good on Linux and macOS, but it\u0026rsquo;s particularly bad on Windows 24.5+ 3,000+ lines makem.sh Shellscript ❌ Doesn\u0026rsquo;t work on Windows by default 26.1+ 1 file, 1200+ lines Eldev Bash, Batch, and Powershel, etc ✔ Good, but qutie slow on Windows 24.4+ 4,000+ lines Eask Node or Native Executables ✔ Good, and it can be compiled to native executables 26.1+ 3,000+ lines (Table is copy and paste, please visit the site here)\nEask\u0026rsquo;s advantages came from the behind technology choice; it uses Node.js and not Shellscript, Bash, Batch, etc. It would require us to use Node runtime, but we can use pkg (big thanks to vercel) for packaging into native executable to avoid such a hassle.\nI hope the needs to install Node.js and the extra step to call npm install are the only defect from Eask. So what are the GOODS stuff?\nEask can be packaged into native executables; it should give you a better speed! It uses Cask\u0026rsquo;s DSL; it became very easy to adapt from Cask to Eask Eask-file is unlike Cask-file; it\u0026rsquo;s an Elisp file and functions similar to init.el (combined from Cask + Eldev) Use high-level programming language JavaScript; npm has a huge ecosystem. We can always fall back to the node layer if something doesn\u0026rsquo;t work inside Emacs (e.g. exec, init) Eask uses yargs as their CLI parsing library, which makes us only have to focus on the development Eask doesn\u0026rsquo;t require to call Emacs all the time; this is particularly good in Windows due to the fork operation is quite slow in the system (this is why I don\u0026rsquo;t recommend Eldev under Windows) Cross-platform and consistency; other alternatives don\u0026rsquo;t support Windows by default except for Eldev It\u0026rsquo;s easy to expand, and clearer project architecture; Cask, Eldev, and makem.sh have their files very huge, so it would be harder to maintain or add new features Global flag -g allows you to manage your Emacs configuration Eask sounds good, but it isn\u0026rsquo;t perfect. Here are the BADS:\nHarder to get into the development; you will need to know JavaScript and npm Eask project structure follows 1 command to 1 file; people hate having multiple files everywhere The project is much more complicated (same as no. 2) 🧙‍♂️ Conclusion After seeing and comparing all the alternatives; I would eventually pick Eask as my major management tool. Eask has more potential if we compare it to the others; on the other hand, I think JavaScript and npm are very easy to learn.\nI have been using Emacs on Windows for 7 years; it\u0026rsquo;s quite painful. In general, many packages are either broken or doesn\u0026rsquo;t have a good user experience. I sometimes do have a good user experience but rarely. For example, magit, helm, is slow on Windows. Simple ping package eping doesn\u0026rsquo;t support Windows\u0026rsquo; ping.exe. Last time installing docker.el doesn\u0026rsquo;t work on Windows (1 week ago). I know the fact is Emacs is just too slow on Windows, but that doesn\u0026rsquo;t mean that we couldn\u0026rsquo;t do anything about it! The fact is user experience is still bad on Windows, though! 😅\nMany people seem to use Cask, but the majority of them don\u0026rsquo;t require tests on Windows. It\u0026rsquo;s simply hard and inconvenient. You would have to install Python, and Python is particularly bad on Windows (UX wise). Here came the Eask to be the savior. It\u0026rsquo;s compatible with Cask\u0026rsquo;s DSL and ensures the workflow\u0026rsquo;s consistency (no Python). Hopefully, everyone can use Eask to develop their elisp packages. Maybe someday Emacs can live better under the Windows\u0026hellip; What do you think?\nI\u0026rsquo;ve also learned Hugo; would love to share it one day!\n🔗 Links https://github.com/emacs-eask/eask ","permalink":"https://www.jcs-profile.com/posts/editor/emacs-eask/","summary":"\u003ch3 id=\"-introduction\"\u003e🔰 Introduction\u003c/h3\u003e\n\u003cp\u003eThe name \u003ccode\u003eEask\u003c/code\u003e came from \u003ca href=\"https://github.com/cask/cask\"\u003eEmacs Cask\u003c/a\u003e\n; if you already know what \u003ccode\u003eCask\u003c/code\u003e is and what it does, please skip this and\nforward to the next section.\u003c/p\u003e\n\u003cp\u003e(\u003cstrong\u003eNOTE:\u003c/strong\u003e \u003ccode\u003eCask\u003c/code\u003e and \u003ccode\u003eEask\u003c/code\u003e are interchangeable in this section)\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eEask\u003c/code\u003e is the dependency management tool for Emacs Lisp. It\u0026rsquo;s like \u003ccode\u003enpm\u003c/code\u003e to\n\u003ccode\u003eNode.js\u003c/code\u003e; but it isn\u0026rsquo;t exactly the same since \u003ccode\u003eEask\u003c/code\u003e has fewer tools than \u003ccode\u003enpm\u003c/code\u003e,\nplus their ecosystems are slightly different. Below is the link \u003cstrong\u003eWhy Cask?\u003c/strong\u003e has\na better explanation.\u003c/p\u003e","title":"Emacs Eask - Alternative to Emacs Cask"},{"content":"I\u0026rsquo;m recently hooked by the static site generator, hence I have decided to create one for myself. Why not? The huge reason is that I could host the site using the GitHub\u0026rsquo;s static site hosting services, but the one I have previously created in 2018 API-Reference-Template. is server base, which is not generator base.\nThe static site generator isn\u0026rsquo;t hard to create, the most valuable technology is the frontend and UI/UX. However, I have already created the frontend for my own use. The main task for me would just have to extract the server base to generator base. I have also renamed the tool to SiraDoc, so then I\u0026rsquo;m able to use it for other sites as well! Just like the previous website, yet a lot easier and more suitable for the GitHub Actions\u0026rsquo; environment! 😉\n🔗 Link https://github.com/SiraDoc/SiraDoc ","permalink":"https://www.jcs-profile.com/posts/web-dev/first-static-site-generator/","summary":"\u003cp\u003eI\u0026rsquo;m recently hooked by the static site generator, hence I have decided to create\none for myself. Why not? The huge reason is that I could host the site using\nthe GitHub\u0026rsquo;s static site hosting services, but the one I have previously created\nin 2018 \u003ca href=\"https://jcs090218.github.io/blog/2018/11/12/Legacy%20-%20%E8%88%8A%E6%96%87/API-Reference-Template%20-%20API%E5%8F%83%E8%80%83%E6%A8%A1%E6%9D%BF/\"\u003eAPI-Reference-Template\u003c/a\u003e.\nis server base, which is not generator base.\u003c/p\u003e\n\u003c!-- more --\u003e\n\u003cp\u003eThe static site generator isn\u0026rsquo;t hard to create, the most valuable technology\nis the frontend and UI/UX. However, I have already created the frontend for\nmy own use. The main task for me would just have to extract the server base\nto generator base. I have also renamed the tool to \u003ca href=\"https://github.com/SiraDoc/SiraDoc\"\u003eSiraDoc\u003c/a\u003e,\nso then I\u0026rsquo;m able to use it for other sites as well! Just like the previous\nwebsite, yet a lot easier and more suitable for the GitHub Actions\u0026rsquo; environment!\n😉\u003c/p\u003e","title":"First static site generator"},{"content":"Following up the thread, My disappointing experience using Unity in a CI pipeline is also the biggest obstacle for me as well. Personal license (free version) of Unity will expire in a period of time depends on your region. The licensing system from Unity is partially contradict to the CI/CD concept since it will force the user to update their secret UNITY_LICENSE on their GitHub Actions. (Notice this does not apply to Plus/Pro users because they use a different licensing system!) 😖\nLet\u0026rsquo;s go straigt forward to the problem, what should we do about it? And what can be improved by this situation? My approach is to automate the licesning task, but how? Long story short, I came up with a node package unity-license-activate that is originally created by Mizo Take. The package uses a package named Puppeteer, meaning we can control browser through normal JavaScript! That is awesome, the biggest issue has been resolved! 😁\nNext step, we just have to update our secret UNITY_LICENSE through GitHub\u0026rsquo;s API! The tasks are simple, we only need two following GitHub actions.\nread-file-action, by Julian Gruber actions-set-secret, by Habid Enrique Manzur Restrepo We can use read-file-action to read the downloaded .ulf file into memory, then we can use that as a value for our actions-set-secrets. Make sure you have added a secret ACCESS_TOKEN to your repository environment. It’s needed for creating/updating your GitHub secret from the workflow!\nThe full workflow file can be accessed through here.\n🔐 Two Factor Authentication (TFA) unity-license-activate may not work since Unity would require you to enter a 6 digit verification code from your email. To get pass this, you would have to install unity-verify-code in your workflow and follow the steps here.\n🔗 Links unity-license-activate unity-verify-code ","permalink":"https://www.jcs-profile.com/posts/unity/automate-personal-license-activation-in-unity-ci/","summary":"\u003cp\u003eFollowing up the thread, \u003ca href=\"https://forum.unity.com/threads/my-disappointing-experience-using-unity-in-a-ci-pipeline.737678/\"\u003eMy disappointing experience using Unity in a CI pipeline\u003c/a\u003e\nis also the biggest obstacle for me as well. Personal license (free version) of\nUnity will expire in a period of time depends on your region. The licensing system\nfrom Unity is partially contradict to the CI/CD concept since it will force\nthe user to update their secret \u003ccode\u003eUNITY_LICENSE\u003c/code\u003e on their GitHub Actions. (Notice\nthis does not apply to Plus/Pro users because they use a different licensing system!)\n😖\u003c/p\u003e","title":"Automate Personal License Activation in Unity CI"},{"content":"WIP\nWIP\n💬 Past experience WIP\n😨 Puzzled WIP\n❗ Awakening WIP\n💬 Future WIP\n","permalink":"https://www.jcs-profile.com/posts/career/why-i-left-usyd/","summary":"\u003cp\u003eWIP\u003c/p\u003e\n\u003c!-- more --\u003e\n\u003cp\u003eWIP\u003c/p\u003e\n\u003ch2 id=\"-past-experience\"\u003e💬 Past experience\u003c/h2\u003e\n\u003cp\u003eWIP\u003c/p\u003e\n\u003ch2 id=\"-puzzled\"\u003e😨 Puzzled\u003c/h2\u003e\n\u003cp\u003eWIP\u003c/p\u003e\n\u003ch2 id=\"-awakening\"\u003e❗ Awakening\u003c/h2\u003e\n\u003cp\u003eWIP\u003c/p\u003e\n\u003ch2 id=\"-future\"\u003e💬 Future\u003c/h2\u003e\n\u003cp\u003eWIP\u003c/p\u003e","title":"Why I left USYD"},{"content":"This is a record, a message from me to one of my ex-firned.\nThe talked was, 2020-05-06\nWhile you are in a dilemma, we humans are totally normal to be afraid of it. This may be a process; afraid makes us strong and a much more experienced people. Humans suppose to grow like that! So let it be! Once you are afraid of something, don\u0026rsquo;t give up on trying it; think about the issue, think as hard as you can, and try to resolve it! Even if we couldn\u0026rsquo;t resolve the issue, it doesn\u0026rsquo;t mean we are bad, or the issue can\u0026rsquo;t be resolved in the later future.\nWe are often weak while facing problems that are just too tough for us humans. We grow only when the dilemma is just right above us. We can\u0026rsquo;t simply level up by skipping it. Avoiding the issue/weaknesses doesn\u0026rsquo;t mean anything; I have been studying English for more than 20 years, but then I finally have the proof that I could get into a college ranked in the first fifteenth. I have realized that avoiding the dilemma doesn\u0026rsquo;t affect you from any aspect because I have come and eventually resolved it!\nEveryone has the time that they got beaten up. All we need to do is stand up and move on to the next adventure. We all grow that way, so you are simply not alone. You are, I am, all of us are. No one is invincible until they notice this.\n","permalink":"https://www.jcs-profile.com/posts/philosophy/%E9%81%87%E5%88%B0%E5%9B%B0%E9%9B%A3/","summary":"\u003cp\u003eThis is a record, a message from me to one of my ex-firned.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe talked was, 2020-05-06\u003c/p\u003e\u003c/blockquote\u003e\n\u003c!-- more --\u003e\n\u003cp\u003eWhile you are in a dilemma, we humans are totally normal to be afraid\nof it. This may be a process; afraid makes us strong and a much more\nexperienced people. Humans suppose to grow like that! So let it be!\nOnce you are afraid of something, don\u0026rsquo;t give up on trying it; think\nabout the issue, think as hard as you can, and try to resolve it!\nEven if we couldn\u0026rsquo;t resolve the issue, it doesn\u0026rsquo;t mean we are bad,\nor the issue can\u0026rsquo;t be resolved in the later future.\u003c/p\u003e","title":"In a dilemma"},{"content":"Productivity is topic that often is ignored by a lot programmer. I have seen a bunch of documents out there talking about algorithm and data structure, so I would like to post a topic about productivity for an advanced programmer or for the programmer who wants to be a better programmer. So what exactly mean productivity in software development field? If you have seen my previous blog post ' Framework I have been working\u0026hellip; (Part 1) \u0026rsquo; and ' Framework I have been working\u0026hellip; (Part 2) \u0026lsquo;, then you might already know what I am going to write about for the rest of this article.\nSo what essentially methods that we could do to improve the productivity for ourselves as a software engineer? First of all, I would say build your tools. Anything that could speed up the development process will increase the productivity of the project. It sounds straightforward to make your tools or library, but when you start making it, it actually kind of hard to make. That I have heard of a lot of people asking me how to make a library for other people to use?\nBuilding a tool is hard and time-consuming. The first thing to make your tool is to have learned Design Pattern (I have already mentioned few books I recommend in my previous post - ' Framework I have been working\u0026hellip; (Part 1) \u0026lsquo;). Attention, learn design pattern is to learn how to build a better software architecture. Not to learn how to use a design pattern in your code! I have seen programmers use design pattern all the time and feel bad about it because they seem to be attempt to use design pattern instead of designing a software architecture.\nOnce you have the skill and knowledge of design pattern. I would recommend seeing how other people build their tools on any open source platform. As everyone knows GitHub, GitLab, SourceForge, etc. Designing tools are thinking about how to make other programmers feel comfortable when using your tool. Think what kind of params have to pass into this function? Think is this feature that is needed to be here/design?\n","permalink":"https://www.jcs-profile.com/posts/others/what-i-am-about-to-do/","summary":"\u003cp\u003eProductivity is topic that often is ignored by a lot programmer. I have\nseen a bunch of documents out there talking about algorithm and data structure,\nso I would like to post a topic about productivity for an advanced programmer\nor for the programmer who wants to be a better programmer. So what exactly\nmean productivity in software development field? If you have seen my previous\nblog post '\n\u003ca href=\"/?page=Framework_sp_I_sp_have_sp_been_sp_working_sp_-Part_sp_1-\"\u003eFramework I have been working\u0026hellip; (Part 1)\u003c/a\u003e\n\u0026rsquo; and '\n\u003ca href=\"/?page=Framework_sp_I_sp_have_sp_been_sp_working_sp_-Part_sp_2-\"\u003eFramework I have been working\u0026hellip; (Part 2)\u003c/a\u003e\n\u0026lsquo;, then you might already know what I am going to write about for the rest of\nthis article.\u003c/p\u003e","title":"What I am about to do"},{"content":"When get started to the game development, people will somehow face some sort of situation that they will need to determine what they are going to master to do in the development. The game development are mainly split into three careers, which are \u0026lsquo;Art\u0026rsquo;, \u0026lsquo;Design\u0026rsquo;, and \u0026lsquo;Programming\u0026rsquo;. These three jobs are very different to one the other. The best method to figure it out what you want to do is to try all them all out one at a time. If your situation would not allow you to do so,\n","permalink":"https://www.jcs-profile.com/posts/game-dev/art-design-programming/","summary":"\u003cp\u003eWhen get started to the game development, people will somehow face some sort\nof situation that they will need to determine what they are going to master\nto do in the development. The game development are mainly split into three\ncareers, which are \u0026lsquo;Art\u0026rsquo;, \u0026lsquo;Design\u0026rsquo;, and \u0026lsquo;Programming\u0026rsquo;. These three jobs are\nvery different to one the other. The best method to figure it out what you\nwant to do is to try all them all out one at a time. If your situation would\nnot allow you to do so,\u003c/p\u003e","title":"Art, Design, Programming"},{"content":"Demo: http://www.jcs-profile.com:3000/Manual/index.html\nGitHub Repo: https://github.com/jcs090218/API-Reference-Template\nMany of my works are about making API. I always have their trouble making API documents for myself and for people to read what each API does. To resolve this issue, I spent a few hours to design a small website that I could drop the HTML file in the target folder and it will show the file on the website. The following list is the list of technologies I used in the project.\nFrontend Basic HTML/CSS Basic JavaScript and jQuery Backend Express.js Examples JCSUnity Scripting Reference JCSEgret Scripting Reference ","permalink":"https://www.jcs-profile.com/posts/legacy/api-reference-template/","summary":"\u003cp\u003e\u003cstrong\u003eDemo:\u003c/strong\u003e \u003ca href=\"http://www.jcs-profile.com:3000/Manual/index.html\"\u003ehttp://www.jcs-profile.com:3000/Manual/index.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eGitHub Repo:\u003c/strong\u003e \u003ca href=\"https://github.com/jcs090218/API-Reference-Template\"\u003ehttps://github.com/jcs090218/API-Reference-Template\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eMany of my works are about making API. I always have their trouble making\nAPI documents for myself and for people to read what each API does. To\nresolve this issue, I spent a few hours to design a small website that I\ncould drop the HTML file in the target folder and it will show the file on\nthe website. The following list is the list of technologies I used in the project.\u003c/p\u003e","title":"API Reference Template"},{"content":"Link: MapleStory Survival Kit\nThis is the final project from the first class of web development from our school. I joined this class as an elective class so I could have a peek of how web development works. A list below is few highlights I would like to show from this project.\nParallax Effect Use of Sound Gashapon 👁️ Parallax Effect Most parallax effect I have seen aren\u0026rsquo;t quite satisfied to me. Generally they will have a image at the back of other components then have it semi-stationary to sit still at the place. In this project I would like to have a peek of how CSS can do on 2016. Fortunately, after being learning animation system from CSS I am for sure that the parallax effect I was to imagine are possible to accomplish by just the CSS without using JavaScript. You can use the small panel on the top left corner to navigate through the four pages from this website.\n🔊 Use of Sound I did not have any experiences with using JavaScript to play sound in the web browser. I simply searched on google and see if there is a method to play sound using JavaScript. Luckly, I found a JavaScript library, ion.sound which is very simple to use and they have great demo and great examples on their website.\n🎟️ Gashapon If you had visited this website, then you will know there are three gashapons on the mostleft page. Once you hover either of these gashapons, gashapon will start dropping items. This is a simple animation using pure JavaScript renders in 30 FPS.\n","permalink":"https://www.jcs-profile.com/posts/web-dev/parallax-website/","summary":"\u003cp\u003e\u003cstrong\u003eLink:\u003c/strong\u003e \u003ca href=\"https://www.jcs-profile.com/public/AAU/wnm249/m15/wnm249_final/\"\u003eMapleStory Survival Kit\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis is the final project from the first class of web development from our\nschool. I joined this class as an elective class so I could have a peek of how\nweb development works. A list below is few highlights I would like to show from\nthis project.\u003c/p\u003e\n\u003c!-- more --\u003e\n\u003col\u003e\n\u003cli\u003eParallax Effect\u003c/li\u003e\n\u003cli\u003eUse of Sound\u003c/li\u003e\n\u003cli\u003eGashapon\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"-parallax-effect\"\u003e👁️ Parallax Effect\u003c/h2\u003e\n\u003cp\u003eMost parallax effect I have seen aren\u0026rsquo;t quite satisfied to me. Generally they\nwill have a image at the back of other components then have it semi-stationary\nto sit still at the place. In this project I would like to have a peek of how\nCSS can do on 2016. Fortunately, after being learning animation system from\nCSS I am for sure that the parallax effect I was to imagine are possible to\naccomplish by just the CSS without using JavaScript. You can use the small\npanel on the top left corner to navigate through the four pages from this website.\u003c/p\u003e","title":"Parallax Website"},{"content":"This is a introduction of how JCSUnity does for the game data save/load system.\nThere are main three ways that you could do saving and loading in Unity Engine with C#.\nJCS_BinGameData - In binary format JCS_XMLGameData - In XML format JCS_JSONGameData - In JSON format ","permalink":"https://www.jcs-profile.com/posts/unity/jcsunity/save-system/","summary":"\u003cp\u003eThis is a introduction of how JCSUnity does for the game data save/load system.\u003c/p\u003e\n\u003cp\u003eThere are main three ways that you could do \u003ccode\u003esaving\u003c/code\u003e and \u003ccode\u003eloading\u003c/code\u003e in Unity\nEngine with C#.\u003c/p\u003e\n\u003c!-- more --\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://jcs090218.github.io/JCSUnity/ScriptReference/index.html?page=SaveLoad_sl_JCS_BinGameData\"\u003eJCS_BinGameData\u003c/a\u003e - In binary format\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://jcs090218.github.io/JCSUnity/ScriptReference/index.html?page=SaveLoad_sl_JCS_XMLGameData\"\u003eJCS_XMLGameData\u003c/a\u003e - In XML format\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://jcs090218.github.io/JCSUnity/ScriptReference/index.html?page=SaveLoad_sl_JCS_XMLGameData\"\u003eJCS_JSONGameData\u003c/a\u003e - In JSON format\u003c/li\u003e\n\u003c/ul\u003e","title":"JCSUnity - Save System"},{"content":" JCSUnity Repo: https://github.com/jcs090218/JCSUnity\nAcknowledge I have developed this tool for 3 years. Starting from the third year of my college years. Compare to other framework I had developed, this tool have much more completeness. I have been using Unity Engine for 2 years while I decide to develop this framework. I have made cetain of games in this 2 years and I reckon I gained enough experiences to develop a framework for Unity Engine. In the retrospect, that was the time I have just done studying \u0026ldquo;Data Structure\u0026rdquo;, \u0026ldquo;Algorithms\u0026rdquo;, \u0026ldquo;Design Patterns\u0026rdquo;. What I presume that Design Patterns are the vital part to a game development because game are often built by multiple components or modules. What I meant multiple are refer as really a lot of those. On the other hand, most software development would not requires that many of the systems, generally the reasons are most of the environment have been wrap or encapsulate by the former developers. For instances, .NET Frameowrk, Visual BASIC/C++/C#, NetBean Graphic, etc.\nOn top of these concepts, this is the third framework I built. I could not remember what I built for the previous two framworks. I presume that I have some knowledge about building a framework, library, etc. At the beginning of the JCSUnity development process, I have had studied the basis of the game engine architecture but not quite fully understand the Unity Engine itself. For instance, Unity Engine\u0026rsquo;s Scripting API, and some controls specific for Unity Eninge. Because of this, you might realized some of the code or design are a bit fiddle and inconsistent.\nWhen I am writing this article, the framework itself has been developed to the state that is convoluted and hard to maintain. Within this framework, there are around 400 to 500 scripts, most of the scripts are self executed which mean a script is a component that could run by it own. By this idea, one Self-Runnable Script benefits the design and increase the variation possibility but it also brings the cost of unnecessary performance.\nIntroduction JCSUnity is a component driven framework built to allow users to quickly generate commonly used game mechanics or features. The architecture design of JCSUnity come alone to Unity Engine\u0026rsquo;s design, which makes the framework highly compatible with Unity Engine itself. Every time the Unity Engine release an update, there should not be any issues to JCSUnity. This framework increases the productivity of game developers and enhances the game development process. Base my own experiences, the game originally that would spend my 15 weeks, I could compress development time to around 3 to 4 weeks. JCSUnity has most of the game presets that Unity Engine does not usually provide. For instance, switch scene with fade in and out, background music player, automatically adjust the screen to aspect ratio, etc. With all these presets, allow the game developers are more likely can be more focus on the design of the game instead of worrying all these trivial features.\nSelf-Runnable Script Therefore, what is Self-Runnable Script? For example, here is a list of three SRSs.\n1. Circle Action 2. Shake Effect 3. Wave Action Above example scripts are all self-runnable without any dependencies and will not influence to each other scripts. Base on this design patterns, how many unique behaviours if we make all these scripts interact with each other?\n7 behaviours = 3 basic behaviours + (Circle Action + Shake Effect) + (Circle Action + Wave Action) + (Shake Effect + Wave Effect) + (Circle Action + Shake Effect + Wave Action) I presume if anyone who has the necessary knowledge about game engine architecture. Design the components this way could avoid decoupling between the scripts, and added the flexibility to the designers. Designers are no longer limit to specific design; they can test and play with each component easily. The side effects are this could cost a lot of additional performance and memory usage.\n3 Basic Actions 本身3種 (Circle Action 繞圓 + Shake Effect 震動) + (Circle Action 繞圓 + Wave Action 上下搖擺) + (Shake Effect 震動 + Wave Effect 上下搖擺) (Circle Action 繞圓 + Shake Effect 震動 + Wave Action 上下搖擺) Scripting Design Having the script design this way, there should be a script principle so people could contribute or extend to the project easier. I chose to use \u0026lsquo;Header\u0026rsquo; attribute to accomplish this task and here are the definition of all the terminology in JCSUnity.\n#if UNITY_EDITOR [Header(\u0026#34;** Helper Variables (JCS_ExampleScript) **\u0026#34;)] /// \u0026lt;summary\u0026gt; /// Variable only happens in developer mode, so it won\u0026#39;t exist in the final build. Usually the helper tool in for level designer. /// \u0026lt;/summary\u0026gt; float helperVar = 0.0f; #endif [Header(\u0026#34;** Check Variables (JCS_ExampleScript) **\u0026#34;)] /// \u0026lt;summary\u0026gt; /// Variable only for checking, do not adjust the value of the variables, but you can use to check to see the effect during runtime. /// \u0026lt;/summary\u0026gt; float checkVar = 0.0f; [Header(\u0026#34;** Initialize Variables (JCS_ExampleScript) **\u0026#34;)] /// \u0026lt;summary\u0026gt; /// Variable only being use in game initialize time, set these kind of variable before hitting play button in order to get the result. /// \u0026lt;/summary\u0026gt; float initVar = 0.0f; [Header(\u0026#34;** Runtime Variables (JCS_ExampleScript) **\u0026#34;)] /// \u0026lt;summary\u0026gt; /// Variable will work on both initialize time and runtime, you can adjust the variable during runtime and see the effect. /// \u0026lt;/summary\u0026gt; float rtVar = 0.0f; For more information, you can click here!\nUsing \u0026lsquo;JCS_\u0026rsquo; Filename, not Namespace In the early version of Unity, when I try to have the same file name in the project, it occurs error. To address this issue, I chose to have a particular file name prefix in front of every file in the project, which is \u0026lsquo;JCS_\u0026rsquo;.\n","permalink":"https://www.jcs-profile.com/posts/unity/jcsunity/overview/","summary":"\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eJCSUnity Repo:\u003c/strong\u003e \u003ca href=\"https://github.com/jcs090218/JCSUnity\"\u003ehttps://github.com/jcs090218/JCSUnity\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"acknowledge\"\u003eAcknowledge\u003c/h2\u003e\n\u003cp\u003eI have developed this tool for 3 years. Starting from the third year of my\ncollege years. Compare to other framework I had developed, this tool have\nmuch more completeness. I have been using Unity Engine for 2 years while I\ndecide to develop this framework. I have made cetain of games in this 2 years\nand I reckon I gained enough experiences to develop a framework for Unity\nEngine. In the retrospect, that was the time I have just done studying\n\u0026ldquo;Data Structure\u0026rdquo;, \u0026ldquo;Algorithms\u0026rdquo;, \u0026ldquo;Design Patterns\u0026rdquo;. What I presume that Design\nPatterns are the vital part to a game development because game are often built\nby multiple components or modules. What I meant multiple are refer as really a\nlot of those. On the other hand, most software development would not requires\nthat many of the systems, generally the reasons are most of the environment\nhave been wrap or encapsulate by the former developers. For instances, .NET\nFrameowrk, Visual BASIC/C++/C#, NetBean Graphic, etc.\u003c/p\u003e","title":"JCSUnity Overview"},{"content":"Precisely that I am neither an Emacs nor Vim expert. I am just an amateur that knows about the two editors with just amount of knowledge. If you check out two of my Emacs and Vim repo, this could be the worst experience of all time. I hold onto an idea that the editors are just a tool. Unless there are issues that hamper or paster my workflow, I will avoid changing the configuration to my editor. Only because I am not going to remake the wheel, indeed, I am not going judge either Emacs over Vim or Vim over Emacs.\nLead to the conclusion; I use Emacs more often than Vim. Before Vim users left the website, I would like to hold onto the basis, why I chose Emacs for my most frequently used text editor. First and foremost, I organized the editor users into two groups. Base on my own experiences, people who use Emacs are most likely work in the software development industry. On the other hand, the majority of Vim users works either in cybersecurity or a free hacker. The reasons are pretty much straightforward, as a software engineer, I would much appreciate Emacs\u0026rsquo; design. Emacs\u0026rsquo; architecture brings a lot more spaces and flexibilities to the software development workflow, and it maximizes the changing possibilities to the software engineer. Most of the software development is most likely to stay in a program that could likeliest achieve most of the tasks. Does it sound familiar to you? Yes, it is just another way of saying the Integrated Development Environment (IDE). Of course, Vim could possibly do what Emacs does, extends to Vim\u0026rsquo;s original design, I found that conflict Vim is an editor design for fast editing file in terminal. Comparing the two editors, Emacs had been built the way what software developer wants; Vim would most likely lose in this battle on this aspect. Vice versa, Vim are very popular to those who do not need an IDE to do their job and often require to exit text editor to jump to other software, do not even argues that Vim is moving towards to Emacs\u0026rsquo; design. Well, this leads to a problem that I could not find a good reason for having the conflict between the original design fast editing file in terminal and having multiple plugins or configurations in Vim. Though, if Vim starts moving towards to Emacs\u0026rsquo;s design, does that mean Vim will lose the advantage on fast editing file in terminal? Many of Vim users complains Emacs was too big and cost so much of its\u0026rsquo; starting time, but now they want more plugins or configurations to their Vim settings? Emacs was designed between the lightweight text editor and heavyweight IDE, resulting Emacs could not going to be faster than Vim on the starting time, but it brings benefits to people who will like a \u0026rsquo;lightweight IDE\u0026rsquo;, it retains most functionalities from any IDE, or even better, program yourself one!\nIf Emacs is that good why still not many people using it? The reason could be straightforward, I learned Emacs from scratch without any in-between supports like Spacemacs or Doom-emacs. I found that Emacs main website is not that friendly compared to other many sites. Plus, you could barely saw videos online that are about Emacs. Furthermore, compares to Vim\u0026rsquo;s shortcuts design, Emacs have less cognitive shortcuts consequent people having a hard time learning Emacs\u0026rsquo; shortcuts comparing learning Vim\u0026rsquo;s shortcuts. I would doubt anyone would likely to learn Emacs by having all these kind of challenges or difficulties in front of them. The learning curve is steep, and the cost of learning a new language for editing Emacs\u0026rsquo; configuration, which is EmacsLisp, could be an extra cost of time. If you notice programming language Lisp, then maybe this would be too obscure to you. In my case, I have no experience with programming language Lisp which leads me many hassles while learning EmacsLisp. I have been using Emacs for 4 years, and I still could not say that I am an expert to Emacs. I am not trying to, and I reckon developing routine is most likely imperative comparing to fixing the editor\u0026rsquo;s configuration.\nLastly, I would say these are just my personal experiences; this means all of these are just my subjective thoughts. Some could be right, and some could be wrong. Emacs have its\u0026rsquo; own benefits, which Vim also does. I often use Vim editing files while I connect to the remote server. Indeed, one more advantage to Vim is that Vim is pre-installed on the most system. This lead to the conclusion that there is no best editor, the only wise man knows how to use the right tool on the right circumstance.\n","permalink":"https://www.jcs-profile.com/posts/editor/emacs-vs-vim/","summary":"\u003cp\u003ePrecisely that I am neither an Emacs nor Vim expert. I am\njust an amateur that knows about the two editors with just\namount of knowledge. If you check out two of my\n\u003ca href=\"https://github.com/jcs090218/jcs-emacs\"\u003eEmacs\u003c/a\u003e\nand\n\u003ca href=\"https://github.com/jcs090218/jcs-vim\"\u003eVim\u003c/a\u003e\nrepo, this could be the worst experience of all time. I hold\nonto an idea that the editors are just a tool. Unless there\nare issues that hamper or paster my workflow, I will avoid\nchanging the configuration to my editor. Only because I am\nnot going to remake the wheel, indeed, I am not going judge\neither Emacs over Vim or Vim over Emacs.\u003c/p\u003e","title":"Emacs vs Vim"},{"content":"First the foremost, this article is all subjective opinions by me, and there are all kind of text editor for any kind of programmer. I think some programmer have some kind of religion, so I am not going to tell anyone to use any particular text editor. I believed text editor is just tool to help programmer make a software and get their job done.\nAt my previous post ' Framework I have been working\u0026hellip; (Part 2) \u0026rsquo; I mentioned I watched a few episodes of ' Handmade Hero \u0026rsquo;s series. Casey Muratori was using Emacs as a text editor coding C/C++(I think now he use 4coder instead of Emacs). I was surprised by how fast he can code in Emacs. So I made some research and discovered there is Vim which is another great text editor competing with Emacs. I decide to give both editor a try, and it turn out I chose Emacs over Vim.\nFirst, I would like to talk about why I chose Emacs over Vim. I think Emacs can do almost everything that Vim does. Vim stays cool he just wants to be a text editor and does not want to do something else. Emacs design the way that you could turn Emacs from text editor to something else. And of course, Emacs is not perfect. Emacs has few troubles doing something like you still need to use third-party software in order to run a package, and sometimes Emacs just froze when I am just trying to edit a text file. Emacs is just a right tool for me because I use to want a text editor that could edit any programming languages and do anything inside it. On the other hand, you might say that is gross to have a text editor do all kind of job for you. Why do not we just use another program instead of code in elisp and write your own functionality for Emacs? Is that even worth it?\nThe answer is really depend on who is using it. For me, I program in different programming languages; I would somehow need to use other text editor or IDE when I change to code in another programming language. For example, I code Java and C++ I would have to change from \u0026lsquo;Eclipse\u0026rsquo;/\u0026lsquo;Android Studio\u0026rsquo; to \u0026lsquo;Visual Studio\u0026rsquo;/\u0026lsquo;MonoDevelop\u0026rsquo;. And these IDEs has different key bindings, which I really hate because I would somehow make mistakes by pressing the wrong key binding from previous IDE to current IDE. In this case, Emacs/Vim become useful because I could finally code all programming languages with the same key bindings. On the other hand, if you are a front-end developer you would recommend people use Sublime Text instead of Emacs because it is wasting your time and is not worth it anymore.\n* My emacs file config repo * url: https://github.com/jcs090218/jcs-emacs * Few Videos I watched when I learn Emacs * Casy\u0026rsquo;s Emacs Tutorial: https://www.youtube.com/watch?v=hbmV1bnQ-i0\u0026t=1584s Stop Worrying and Love Emacs: https://www.youtube.com/watch?v=JWD1Fpdd4Pc ","permalink":"https://www.jcs-profile.com/posts/editor/best-editor-ever/","summary":"\u003cp\u003eFirst the foremost, this article is all subjective opinions\nby me, and there are all kind of text editor for any kind of\nprogrammer. I think some programmer have some kind of religion,\nso I am not going to tell anyone to use any particular text\neditor. I believed text editor is just tool to help programmer\nmake a software and get their job done.\u003c/p\u003e\n\u003c!-- more --\u003e\n\u003cp\u003eAt my previous post '\n\u003ca href=\"/?page=Framework_sp_I_sp_have_sp_been_sp_working_sp_-Part_sp_2-\"\u003eFramework I have been working\u0026hellip; (Part 2)\u003c/a\u003e\n\u0026rsquo; I mentioned I watched a few episodes of '\n\u003ca href=\"https://www.youtube.com/user/handmadeheroarchive\"\u003eHandmade Hero\u003c/a\u003e\n\u0026rsquo;s series.\n\u003ca href=\"https://twitter.com/cmuratori\"\u003eCasey Muratori\u003c/a\u003e\nwas using Emacs as a text editor coding C/C++(I think now he use 4coder instead of Emacs). I was surprised by how fast he can code in Emacs. So I made some research and discovered there is Vim which is another great text editor competing with Emacs. I decide to give both editor a try, and it turn out I chose Emacs over Vim.\u003c/p\u003e","title":"Best Editor Ever"},{"content":"Productivity is topic that often is ignored by a lot programmer. I have seen a bunch of documents out there talking about algorithm and data structure, so I would like to post a topic about productivity for an advanced programmer or for the programmer who wants to be a better programmer. So what exactly mean productivity in software development field? If you have seen my previous blog post ' Framework I have been working\u0026hellip; (Part 1) \u0026rsquo; and ' Framework I have been working\u0026hellip; (Part 2) \u0026lsquo;, then you might already know what I am going to write about for the rest of this article.\nSo what essentially methods that we could do to improve the productivity for ourselves as a software engineer? First of all, I would say build your tools. Anything that could speed up the development process will increase the productivity of the project. It sounds straightforward to make your tools or library, but when you start making it, it actually kind of hard to make. That I have heard of a lot of people asking me how to make a library for other people to use?\nBuilding a tool is hard and time-consuming. The first thing to make your tool is to have learned Design Pattern (I have already mentioned few books I recommend in my previous post - ' Framework I have been working\u0026hellip; (Part 1) \u0026lsquo;). Attention, learn design pattern is to learn how to build a better software architecture. Not to learn how to use a design pattern in your code! I have seen programmers use design pattern all the time and feel bad about it because they seem to be attempt to use design pattern instead of designing a software architecture.\nOnce you have the skill and knowledge of design pattern. I would recommend seeing how other people build their tools on any open source platform. As everyone knows GitHub, GitLab, SourceForge, etc. Designing tools are thinking about how to make other programmers feel comfortable when using your tool. Think what kind of params have to pass into this function? Think is this feature that is needed to be here/design?\n","permalink":"https://www.jcs-profile.com/posts/productivity/productivity/","summary":"\u003cp\u003eProductivity is topic that often is ignored by a lot programmer. I have\nseen a bunch of documents out there talking about algorithm and data structure,\nso I would like to post a topic about productivity for an advanced programmer\nor for the programmer who wants to be a better programmer. So what exactly\nmean productivity in software development field? If you have seen my previous\nblog post '\n\u003ca href=\"/?page=Framework_sp_I_sp_have_sp_been_sp_working_sp_-Part_sp_1-\"\u003eFramework I have been working\u0026hellip; (Part 1)\u003c/a\u003e\n\u0026rsquo; and '\n\u003ca href=\"/?page=Framework_sp_I_sp_have_sp_been_sp_working_sp_-Part_sp_2-\"\u003eFramework I have been working\u0026hellip; (Part 2)\u003c/a\u003e\n\u0026lsquo;, then you might already know what I am going to write about for the rest of\nthis article.\u003c/p\u003e","title":"Productivity"},{"content":"The story start when I have difficulty when I was working inside one of our class in college. It is a collaborative class that all kind of experts work on the same project, and of course for game development students we decide to make a AR game.\nWell, the dream always big and great, but when it get into reality it always not going to be fun, especially when you are making a game and work in the game industry. Game is a hard thing to work on , both on the programming side and the art side. All members in the group will just get stressful every day and every week. Plus when you know that you are the only programmer in the team, I think this could be really stressful. I would just admit I stress out the first day of class despite I already have some experience using the game engine Unity.\nBecause for whole semester I was so stressful, so I did not remember much what I did for the class in details. In fact, I did everything except the art for the project. It was fun and I did learn three things from this class.\nNever repeat yourself. (Duplicate code) Design Patterns. New technology is dangerous. Never repeat yourself, and the duplicate code is a significant part to be a good programmer Because duplicate code will cause copy and paste everywhere around the place. In architecture wise, copy and pasting the code everywhere is not a good structure and it could cause an issue if the program gets huge enough that you could not maintain the whole software. I am not saying I made the duplicate on this project, but what does annoying me is that I have nearly created everything the same over and over again in each project I have made from scratch. For instance, a scene manager could probably create for all kind of game because what kind of game does not need to switch a scene? Even a bad game will still need to switch scene from menu to gameplay.\nDesign Patterns is the key for extreme programming and maintainability for software architecture. Prevent duplicate code is also the topic include from the design patterns. I would recommand people read \u0026lsquo;Head First Design Pattern\u0026rsquo; that are written by Eric Freeman and Elisabth Robson. The example code was written in Java and as everyone knows that Java is a good programming language when people need to explain OOP concepts.\nOtherwise, there is another option book \u0026lsquo;Design Patterns\u0026rsquo; written by a bunch of good C++ programmers, for people who feel more comfortable with using C++ than using Java.\nAt this time, one of my instructor [Billy Garban](https://www.linkedin.com/in/billylemonzest/) from Academy of Art University suggests me to watch [Handmade Hero](https://www.youtube.com/user/handmadeheroarchive) series that host by [Casey Muratori](https://twitter.com/cmuratori) . I have watched a few episodes what make me impressive is how he can teach people in such a way that everyone could understand, including me. I like when he talks about what makes him special is his productivity to the company. (I will discuss a bit more 'productivity' in another post.) This changes me think differently instead of just thinking about algorithm and data structure. What makes you different than other programmers? Then I realize, being productive is important and advance as a programmer. Then I figure out that how to make myself productive as much as possible is to write your own tool. The reason is simple, the majority of people that are not programmer might think of the most time programmer did is to type the program itself, but I believe this is a huge mistake. In fact, the time spending on thinking is way more than time spent on actually typing. So writing your own tool is saving your time when you think.\nHere is a list of some frameworks or libraries that I have created for my own use during my college years. All of them have a different purpose, and some of them were written in various programming language. These are also the evidence that these tools did save me a lot of time when doing my school work. Think back in the past, when I start the project from scratch I nearly will have to keep my eyes on the project all the time. But I after I have made my framework \u0026lsquo;JCSUnity\u0026rsquo; I hardly dot not have to do any school work anymore.\nJCSCos2x URL: https://github.com/jcs090218/JCSCos2x_Lib_src JCSLOVELua URL: https://github.com/jcs090218/JCSLOVELua_Framework JCSPyGm_Lib URL: https://github.com/jcs090218/JCSPyGm_Lib JCSUnity URL: https://github.com/jcs090218/JCSUnity_Framework ","permalink":"https://www.jcs-profile.com/posts/productivity/framework-i-have-been-working-on/","summary":"\u003cp\u003eThe story start when I have difficulty when I was working inside one of\nour class in college. It is a collaborative class that all kind of experts\nwork on the same project, and of course for game development students we\ndecide to make a AR game.\u003c/p\u003e\n\u003c!-- more --\u003e\n\u003cp\u003eWell, the dream always big and great, but when it get into reality it always\nnot going to be fun, especially when you are making a game and work in the game\nindustry. Game is a hard thing to work on , both on the programming side and\nthe art side. All members in the group will just get stressful every day and\nevery week. Plus when you know that you are the only programmer in the team, I\nthink this could be really stressful. I would just admit I stress out the first\nday of class despite I already have some experience using the game engine Unity.\u003c/p\u003e","title":"Framework I have been working on"},{"content":"I\u0026rsquo;m not fond of talking about myself. Primarily I\u0026rsquo;m nobody, not phenomenal, and never been onto news or other media, not any of those. Is hard to think that who will spend their precious time reading this \u0026lsquo;About Me\u0026rsquo; article. I would desire not to write a verbose introduction about myself. I\u0026rsquo;m currently 24; I wouldn\u0026rsquo;t say that I lived long, but long enough for me to review my past few years of living and consider what\u0026rsquo;s the future path I\u0026rsquo;m going to step in.\nThe story always starts sad; it was entirely a disaster in my early life. I\u0026rsquo;m very pessimistic, give up things quickly, and not knowing how to be persistent. Wonder where are the differences between success and failure. Maybe I do have gifts for doing things right, but not for long. When I grew up a little, I\u0026rsquo;m already at the bottom of the class. I usually couldn\u0026rsquo;t be proud of myself especially when you have brothers and sisters that they often did things better than you. Util to the day first year of middle school, my life of concepts has a drastic change; my grade stays at the average rate, but instead of focusing on grades, my parent chose to have me entered the athletic class in tennis rather than the regular class. I felt motivated about sports comparing to coursework. During spartan training from our coaches, plus my innate health doesn\u0026rsquo;t take any advantages to make me successful in tennis. I finally got my first specialty by been through all the rigorous training. Form this experience; I learned the importance of being persistent, sometime you couldn\u0026rsquo;t care for all the possibilities, and confidence.\nLast year of the middle school years, I went back to the regular class. I decide to challenge something that I was always trying to avoid, studying. In the beginning, this wasn\u0026rsquo;t easy for me by doing something that isn\u0026rsquo;t that interesting. In a certain opportunity, I get to know some thoughts about life, which are \u0026ldquo;Life aren\u0026rsquo;t always happy.\u0026rdquo; and \u0026ldquo;In some aspect, no one like to study.\u0026rdquo;. I kept these thoughts in mind and started to do the hard work on studying. Surprisingly, my grades have some improvements. Although this could not be enough to be like the top 3 in our school, this makes me comprehend somethings that are way more important than the grade. \u0026ldquo;Exertion wouldn\u0026rsquo;t betray you.\u0026rdquo; and \u0026ldquo;Knowing the taste of success, would make you feel omnipotent.\u0026rdquo;\nThere are a lot of things that happened in high school. The truths are that not everything goes perfectly throughout my life. During my high school life is my first time getting bullied at school, not physically but metaphysically. I reckon because I was too proud and aggressive at that time and I argued all the subtleties and most of the time I was right. Consequent that being always right does not mean success in real life. I was in despair about the reality and learned some significant lessons, not arguing so much and be humble.\nAfter the worst part of my life, I started to get in touch with people carefully. I attempted to learn how to talk to people and endeavored to be modest. I would like to search for my equanimity at any time and face things more mature.\nMy life wasn\u0026rsquo;t going smooth all the time; I underwent both pleasing and hurtful part of my life. I\u0026rsquo;m not like Albert Einstein or Nikola Tesla that smart. I learned lessons from every failure, and knowing from failure to success. Most of the time paying hard works wouldn\u0026rsquo;t get what you want, but you could change your life only if you tried.\n","permalink":"https://www.jcs-profile.com/posts/announcement/about-me/","summary":"\u003cp\u003eI\u0026rsquo;m not fond of talking about myself. Primarily I\u0026rsquo;m nobody, not phenomenal,\nand never been onto news or other media, not any of those. Is hard to think\nthat who will spend their precious time reading this \u0026lsquo;About Me\u0026rsquo; article. I\nwould desire not to write a verbose introduction about myself. I\u0026rsquo;m currently\n24; I wouldn\u0026rsquo;t say that I lived long, but long enough for me to review my\npast few years of living and consider what\u0026rsquo;s the future path I\u0026rsquo;m going to\nstep in.\u003c/p\u003e","title":"About Me"},{"content":" I have heard about people saying that writing a blog is a good idea. And here is it, I am going to write a development blog for myself. I have been coding for years and would like to share what I had been through and talk about more like what I think is significants to a programmer. What are the jobs and tasks to the programmer and what does programmer does?\n","permalink":"https://www.jcs-profile.com/posts/announcement/start-blog-announcment/","summary":"\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"blog-img\" src=\"./blog_pic.png\" width=\"319\" height=\"181\" /\u003e\n\u003c/p\u003e\n\u003cp\u003eI have heard about people saying that writing a blog is a good idea. And\nhere is it, I am going to write a development blog for myself. I have been\ncoding for years and would like to share what I had been through and talk\nabout more like what I think is significants to a programmer. What are the\njobs and tasks to the programmer and what does programmer does?\u003c/p\u003e","title":"Start blog announcment"},{"content":"Do you have a project in mind? Want to hire me? or simply wanna chat? Feel free to schedule a meeting.\n","permalink":"https://www.jcs-profile.com/contact/","summary":"\u003cp\u003eDo you have a project in mind? Want to hire me? or simply wanna chat? Feel free to \u003ca href=\"https://calendly.com/jenchieh94\"\u003eschedule a meeting\u003c/a\u003e.\u003c/p\u003e","title":"Contact"},{"content":"This page showcases a selection of my personal, professional, and academic projects. The source code for most of these, along with additional projects, is available on my GitHub and GitLab accounts.\nAll of my open-source projects are maintained as needed, unless stated otherwise. The dates listed below indicate when the majority of the major development took place.\n💸 = Professional work 🏫 = School work 👨‍💼 = Role in the team 👷 = Maintainer ✨ = Contributor 🔗 = Forked projects (not the original author) 🏅 = Reward or Achievement 🔞 = Adult Content 📢 You can hover over these emojis for a detailed explanation!\nThere are a lot of information on this page. Please use Ctrl+f to search through the project list.\n🚧 Currently working on See details Untitled: CODE_E - Moga Quest (Winter 2024 – Present 👨‍💼💸): A roguelike adventure inspired by Vampire Survivors, Risk of Rain 2, and Megabonk, featuring both human and non-human parties to deliver a rich and varied gameplay experience. Qob or cl-qob/cli (Fall 2024 – Present 🏅🏅🏅🏅): CLI for building, running, testing, and managing your Common Lisp dependencies. cogru (Summer 2024 – Present): Where the collaboration start!? I\u0026rsquo;ve implemented the Operational Transformation (OT) in Rust using the client-server model. dotfiles (Summer 2024 – Present): Jen-Chieh\u0026rsquo;s dotfiles. jayces (Winter 2023 – Present): Programming language I\u0026rsquo;ve created to learn to write one my own. 🧰 Tools, Framework, and Libraries See details JCSNetP (Winter 2017): A framework is developed to improve efficiency in network programming using C++. JCSQtJ (Fall 2017): A compact framework that encapsulates Qt Jami to expedite development. Explore additional projects that have utilized this framework, such as Guild-Emblem-Simulator, OC_Install, and more. JCSNetS (Summer 2017): A dedicated network framework tailored for the creation of MMO games, leveraging Apache Mina and MySQL. Please checkout the project BB_Shoot, which utilizes this framework. JCSPyGm_Lib (Winter 2016 🏫): A set of tools designed to boost the speed of game development with Pygame. Please visit the demo project ImpulseEngine for more detailed usage information. (6 weeks; including the demo project) JCSCos2x_Lib (Fall 2016 – Winter 2016 🏫): A small library provides a fast, superficial, easy-to-implement layer for parallax effects and essential features for making a 2D game using Cocos2d-x. Watch a short video of the demo project here. (4 weeks; including the demo project) JCSLOVELua (Fall 2016 – Winter 2016 🏫): A game framework built on the LÖVE 2D engine that enhances productivity and user experience by providing commonly used systems pre-implemented (animation, camera, input, rendering, simple physics, etc). Please checkout the demo project PetShop for more detailed usage information. (5 weeks; including the demo project) JCSCC_Engine (Spring 2016 – Winter 2017 🏫): A game engine offering a straightforward programming interface for developing cross-platform native code games. It includes a resource manager with secure decoding and encoding algorithms. The project\u0026rsquo;s goal is to gain insights into the construction of game engines, understand their architecture, and apply this knowledge to other modern game engines. JCSStarling (Spring 2015): This is a programming interface layered on top of the Starling framework, transforming the event-driven system into a component-driven system. Unity See details HTTP_Server (Spring 2025): A simple C# HTTP server implementation for Unity. Prefs (Fall 2023): A small library designed to fetch a list of EditorPrefs/PlayerPrefs. Mx (Fall 2023): A command-based completion framework. It allows you to execute all kinds of tasks based on your design. The idea is to port the M-x functionality from Emacs. USqr (Spring 2023 – Present): Set of attributes, tools and extensions for Unity. NovBundle (Fall 2021 – Spring 2022 💸🏅): An abstraction layer constructed atop the AssetBundles system, aiming to streamline the AssetBundles workflow, sparing users from delving into intricate system details. WatchLog (Summer 2021 – Fall 2021 💸🏅): A dedicated tool that tracks variable over time. Inspect Yaml (Summer 2021 💸🏅): A dedicated and up to date YAML editor inside the Inspector window. Inspect Xml (Summer 2021 💸🏅): A dedicated and up to date XML editor inside the Inspector window. Inspect Json (Summer 2021 💸🏅): A dedicated and up to date JSON editor inside the Inspector window. Afterimage (Summer 2021 💸🏅): Afterimage VFX for Unity. A simple solution that work with 2D and 3D renderers, including UI components (Image, Text, Button, etc). sHierarchy (Summer 2021 💸🏅): Minimalistic good looking hierarchy. 32feet.Unity.Example (Spring 2021): Example project to use 32feet inside Unity (Bluetooth Classic). Unity.Lua (Spring 2020 💸): Use Lua scripting language (tolua) in Unity to accomplish hot update/fix functionality. UndoRedoSystem (Summer 2018): Implementation of an Undo-Redo system in Unity using C# and uGUI. Unity.Toggle (Summer 2018): A little bit overkill toggle button UI for Unity Engine using uGUI. PackageExporter (Winter 2017): An alternative approach to package management utilizing ignore files. TileEditor (Fall 2017 – Winter 2017): Light-weight tile editing tool for Unity 2D/3D. JCSUnity (Summer 2016 – Winter 2017): Quickly construct your game using multiple components and predefined default settings. 📐 Algorithms AI_Link (Winter 2024 – Spring 2025): This project specifically addresses the limitations of the NavMesh Link by replacing the original with a custom system. 2D_Visibility (Summer 2024): Implementation of 2D Visibility in Unity using C#. AStar (Summer 2023): Implementation of A-star in Unity using C#. 🖌️ Animations, Shaders, and VFX VideoTransition (Summer 2024 – Spring 2025 💸): Use video transition to do scene transition. The original author is my co-worker @hirosaga created the video transition mask effect and being used in our game Untitled: 長姬記. Grass_Sway (Summer 2023): Create a grass sway effect in Unity using Shader Graph with Universal Render Pipeline (URP). Better_Skybox (Summer 2023): Enhance the overall visual experience by adjusting various settings in Unity. ⚙️ Systems MantisRobotics.CSG_Editor (Fall 2025 💸): Interview assignment for MantisRobotics. A minimal editor exploring Constructive Solid Geometry (CSG). nyamyam.CaptureCamera (Fall 2025 💸): Interview assignment for Nyamyam. The task is to design a camera capture system inspired by the video 2025 0820 The Seance Flow. 🎮 Games See details Untitled: ASAKU (Winter 2025 – Fall 2025 👨‍💼💸): Turn-based MOBA co-developed with ASAKU, a manga by Taiwanese artist MingKun Liu, and a team of 10+ people. Features strategic PVP battles with manga-inspired characters. Built in Unity using FishNet and LiteNetLib for networking. Developed both client and server systems, with servers hosted on AWS. Untitled: 長姬記 (Summer 2024 – Spring 2025 👨‍💼💸🔞): A 2D erotic game featuring turn-based combat and adventure-driven storytelling. Developed by Bunny Eats Tiger with a core team of three members, the game is funded and set to be published by Mango Party. You Have An Order (Summer 2024 👨‍💼): A 2D pixel horror game, players strive to evade monsters while searching for an escape route. This game participates in the 机核GCORES 2024 Game Creation Challenge. (3 weeks) Alice in Surprise (Summer 2022 👨‍💼): A mini-game that combines the mechanics of hack and slash with tile-matching. The game has been submitted to the 5th DIY Game Jam. (4 weeks) Pipeline Of Emperor Yu (Fall 2019 – Winter 2019 👨‍💼💸🏅🏅🏅): A puzzle game that merges historical legends with the classic gameplay of water pipe challenges! Untitled: Poker (Fall 2019 💸): An online gambling game featuring a total of 5 mini-games. Our team consists of 7 members, and I am one of the game client engineers working with the Unity engine. I am fully responsible for developing the entire gameplay system, while the UI is created by my senior coworker. Unfortunately, the entire team got laid off, leaving the game unfinished. (8 weeks) Greedy Island (Fall 2018 – Summer 2019 💸): A mobile multiplayer shooting MOBA developed by T-NEXUS. I contributed to the backend engineering, building the login server and designing its database schema with MongoDB. Sugar Sleuths (Fall 2017 – Winter 2017 👨‍💼🏫🏅🏅): A mulitplayer, hot-seat game in which the campers (players) discover clues that point to the Master Candy Thief. BB_Shoot (Fall 2017): A bullet bounce game featuring multiplayer third-person shooter (TPS) mechanics. Hemlock and the Horrible Net (Spring 2017 – Summer 2017 👨‍💼🏫🏅💸): Embark on an undersea adventure in this side-scrolling game! (15 weeks) PetShop (Winter 2016 🏫): An example project using JCSLOVELua Framework. Players can use a left-click of the mouse to generate adorable animals, allowing them to reside within a sandbox. The concept is to emulate an aquarium experience. Might \u0026amp; Blade (Fall 2016 – Winter 2016 👨‍💼🏫🏅): A 3rd person hack and slash action game made in the Unity engine, developed by a team of 18 in the Academy of Art University. (15 weeks) Radiant Rune Fist (Fall 2016 – Winter 2016 👨‍💼🏫): A run and gun platforming game from Old Gods Game Studio. Battle for glory and against evil! Made in the Unity engine, developed by a team of 8 in the Academy of Art University. (15 weeks) DJMax_Remake (Spring 2016 🏫): A clone of DJMax implemented in Processing. TPS (Fall 2015 – Winter 2015 🏫): A simple ASCII third-person shooter (TPS) game coded in C++. View the gameplay video here. Untitled: Project M (Summer 2015 – Winter 2015 👨‍💼💸): Action game (ACT) with RPG elements and a locked top-down perspective. I worked on the minimum viable product (MVP) of a game under NDA as the sole software engineer. The game wasn\u0026rsquo;t completed due to its 7+ years project timeline, so I passed it on to the next team. Archers Duel (Winter 2014 👨‍💼🏫🏅🏅): A compact two-player RPG fighting game featuring battles between pre-designed archer characters, built with the Starling framework in AS3. (7 weeks) Cardinal (Fall 2014 👨‍💼🏫🏅): A compact visual novel game where the player assumes the role of a detective, working to unravel a mystery and identify the murderer. (7 weeks) Rhythm Punks! (Fall 2014 – Winter 2014 👨‍💼🏫): A competitive two player game that will have the player fighting one another for victory. The first stage will be a death match between the two players, the second stage will have the players fighting enemies to see who can kill the most while dying the least. The 3rd stage will be a boss fight, where the player who does the most damage wins. (14 weeks) Plugins moba-inting (Fall 2024): A basic UI automation bot to avoid AFK penalties. The bot ensures your character takes action (like intentionally moving) at regular intervals. Emulator and simulator MapleStory2Unity (Spring 2026 – Present): A framework to build MapleStory 2 MMO RPG games. MapleStoryUnity (Summer 2021 – Present): A framework to build MapleStory MMO RPG games. UnityWzLib (Summer 2021): WzLib for Unity. 🖥️ Desktop apps See details OC_Install (Summer 2018): An univseral software installer by one click. MagicCardTool (Summer 2017 🏫): A small desktop application that generates an image of a card for the Magic: The Gathering card game. Initial attempt to develop a desktop application with Windows Forms using Visual C#. Guild-Emblem-Simulator (Fall 2017): A small program that allows you to customize your guild emblem just like in the game MapleStory and export it into a PNG file. Skycrap Client/Server (Spring 2017 – Summer 2017): A small and enjoyable project that transmits webcam data using the server/client model. Implemented in Java, this project utilizes the Apache Mina framework. 🪞 AR/VR mobile apps See details Monumental Conversations (Summer 2021 – Spring 2022 👨‍💼💸🏅🏅): An augmented reality mobile app for learning history of Monument Avenue and Arthur Ashe Boulevard. This project was featured in CODAworx\u0026rsquo;s magazine\u0026rsquo;s Art for Social Change edition. Lights \u0026amp; Delights (Winter 2020 – Spring 2021 👨‍💼💸🏅): An augmented reality holiday adventure for the Downtown Seattle Association\u0026rsquo;s 2020, Holiday Lights and Delights Festival. Twilight Tower LiveVR (Spring 2015 👨‍💼🏫🏅): A mini marker-based AR game, utilizing the Vuforia AR SDK within the Unity platform. Players can interact with objects in the scene by simply clicking on them. 🎼 Music apps See details Meteo (Spring 2020 – Spring 2021 👨‍💼💸🏅🏅🏅): An app for sharing music that works with illuminated piano keyboards — Meteo piano. You can view a demonstration of the core mechanics here (please note that this demo is in its early stages and may appear rough). Music_Visualizer (Fall 2018): Implementation of a music visualizer in Unity. Check out the demo here. 📐 Algorithms See details Fuzzy Matching rs-flx (Winter 2025 🏅): Rust bindings for flx-c. demo-rs-flx (Winter 2025): Demo to use rs-flx. FlxSwift (Winter 2024 🏅): Rewrite emacs-flx in Swift. DemoFlxSwift (Winter 2024): Demo to use FlxSwift. flx.go (Winter 2024 🏅): Rewrite emacs-flx in Go. demo-flx.go (Winter 2024): Demo to use flx.go. flx.py (Winter 2024 🏅): Rewrite emacs-flx in Python. flx_dart (Winter 2024 🏅): Rewrite emacs-flx in Dart. clj-flx (Winter 2024 🏅): Rewrite emacs-flx in Clojure. flx-java (Winter 2024 🏅): Rewrite emacs-flx in Java. cl-flx (Fall 2024 🏅🏅): Rewrite emacs-flx in Common Lisp. flx-zig (Spring 2024): Rewrite emacs-flx in Zig. zig-flx (Spring 2024): Zig bindings for flx-c. flx-c (Spring 2024): Rewrite emacs-flx in C. flx-ts (Spring 2024 🏅): Rewrite emacs-flx in TypeScript, with added support for JavaScript. FlxCs (Fall 2023 🏅): Rewrite emacs-flx in C#. Built on the Mono framework, you can utilize this in any environment compatible with Mono. This is utilized within the Unity.Mx tool. flx-rs (Winter 2021 🏅): Rewrite emacs-flx in Rust for dynamic modules. The original emacs-flx were written in pure Emacs Lisp. While their scoring engine is impressive, the performance is unbearable on Windows systems. Therefore, this package was developed, leading to a speed increase ranging from 10x to 16x. flxy-rs (Winter 2021 🏅): Fast, character-based search library in Rust. This represents my first attempt to rewrite emacs-flx in Rust, which was not successful. Although it remains usable, the results in terms of fuzzy matching were not as impressive as the original emacs-flx algorithm. 🧲 Physics See details ImpulseEngine (Fall 2017 🏫): An unofficial port of Impulse Engine written in Python. This is constructed using JCSPyGm_Lib layered on top of Pygame. 🌐 Web apps and services See details JCS Emacs Homepage (Spring 2022): Landing page for jcs-emacs. This webiste is made using React.js. JCS ELPA Homepage (Winter 2021): A homepage for JCS ELPA designed to showcase all packages in the archive. The site only consists of basic HTML, CSS and JavaScript. Pixisoft Website (Summer 2021 – Winter 2021 💸): A small web application made using React.js, designed for use as a company\u0026rsquo;s homepage. sherlock-web (Spring 2021): Website to interact Sherlock API. sherlock-project/api (Spring 2021): API for the sherlock module implemented in Python using Django REST Framework (DRF). Initial attempt with DRF. box_server (Spring 2020 💸): A straightforward server designed to be compatible with any WebSocket client utilizing the ws library. This is a small demo I developed while working at WISBET. There is no documentation as we moved on to the next project afterward. Unity.DataServer (Winter 2019 💸): A data server and a solution for the missing game data, including in-app purchase (IAP) history, when the game is uninstalled from a mobile device. sherlock (Spring 2019 ✨): 🔎 Hunt down social media accounts by username across social networks. I was one of the early contributors who took care of the ANSI color using colorama. Links_Template (Spring 2020): Rapidly build your link page to marketing your games! RandomCookMenu (Winter 2017): A small application that enables you to create cooking menus and randomly selects one for you. This was originally designed for my mom, who often struggled with deciding what to cook every day. MapleStory Survival Kit (Summer 2017 🏫): A website that guides you on navigating the popular MMORPG, MapleStory! Constructed using only fundamental HTML, CSS, and JavaScript, this is the final project from our first web design class at the Academy of Art University. Best Boba Tea (Summer 2017 🏫): A website recommends a few boba tea places in San Francisco! Constructed using only fundamental HTML, CSS, and JavaScript, this is the midterm project from our first web design class at the Academy of Art University. 👤 Blog and personal websites jcs-profile (Spring 2024): My personal website version 2, using Hugo and PaperMod theme. blog@v2 (Fall 2022 – Spring 2024): My personal blog site, built using Hugo with LoveIt theme. blog@v1 (Fall 2021 – Fall 2022): My personal blog site, built using Hexo with hipaper theme. jcs-profile@v1 (Winter 2018 – Spring 2024): My single page personal website implemented in basic HTML, CSS and JavaScript Blog_JenChieh (Winter 2018 – Winter 2020): The blog system I initiated during my university years was constructed using the Blog_Template. I later shifted to a Static Site Generator (SSG) solution to minimize my server costs. Blog_Template (Winter 2018): A blog template that allows individuals to self-host their blogs! Constructed using Node.js and Express.js. (replaced with SiraDoc) 📚 Documentations and manuals Qob Manual (Fall 2024 — Winter 2024): Qob\u0026rsquo;s documentation website. collaboration-server-protocol (Summer 2024 — Fall 2024): Defines a common protocol for collaboration servers. Built with docsy. Scripting_Manual_JCSGodot (Winter 2023): Scripting manual website for JCSGodot API. Eask Manual (Summer 2022 – Winter 2022): Eask\u0026rsquo;s documentation website. CCosQuick Manual (Fall 2021): The documentation website for my game framework — CCosQuick. JCSEgret Manual (Fall 2021): The documentation website for my game framework — JCSEgret. JCSUE Manual (Fall 2021): The documentation website for my game framework — JCSUE. JCSUnity Manual (Fall 2021): The documentation website for my game framework — JCSUnity. SiraDoc/demo (Fall 2021): Demo website for SiraDoc. Scripting_Manual_JCSUE (Summer 2020): Scripting manual for JCSUE API. Scripting_Manual_CCosQuick (Spring 2020): Scripting manual for CCosQuick API. Scripting_Manual_JCSEgret (Winter 2018): Scripting manual website for JCSEgret API. API_Reference_Template (Winter 2018): Simple API references webiste hoster. (replaced with SiraDoc) Scripting_Manual_JCSUnity (Fall 2018): Scripting manual for JCSUnity API. Later separated into API_Reference_Template and subsequently reliant on it. 🔎 Browser extensions See details password-toggle (Summer 2024): Show/Hide passwords on the page. eyny-video-downloader (Spring 2024): An extension that integrates a download button for EYNY Video site. browser-statistic (Spring 2024): This is a small extension that presents statistical charts indicating the websites you frequently visit. 👨‍💻 Programming languages and parsers See details 🌳 Tree-sitter csharp-tree-sitter (Winter 2025 – Spring 2026): C# bindings to the Tree-sitter parsing library. tree-sitter-actionscript (Spring 2021 – Winter 2025): ActionScript grammar for tree-sitter. Although Rileran stated that his project was inspired by mine, I was also inspired by his project, Rileran/tree-sitter-actionscript. 📦 Package managers and build tools See details cl-qob/packaging (Winter 2024 – Present): Packaging for Qob CLI. emacs-eask/packaging (Fall 2023 – Winter 2023): Packaging for Eask CLI. I\u0026rsquo;ve actively contributed to diverse package managers such as Chocolatey, Snapcraft, MacPorts, etc. Furthermore, I\u0026rsquo;ve established my own package repositories for Scoop, Homebrew, Personal Package Archive (PPA), and more. emacs-eask/archives (Spring 2022 – Winter 2023): Back up the archive-contents to avoid potential failures when refreshing the package archive. This is a factor that enhances the stability of Eask. Eask or emacs-eask/cli (Spring 2022 – Winter 2023 🏅🏅🏅🏅🏅🏅🏅🏅🏅): CLI for building, running, testing, and managing your Emacs Lisp dependencies. This tool is the successor to Cask, offering enhanced stability, cross-platform capability, and extensibility. Cask (Spring 2021 – Spring 2022 👷): Project management tool for Emacs. I\u0026rsquo;m the maintainer specifically responsible to Windows platform. Nix See details jcs090218/nur (Fall 2024 – Present): Jen-Chieh\u0026rsquo;s Nix User Repository (NUR). eask2nix (Fall 2022 🏅): Convert Eask into Nix expressions. nixpkgs (Fall 2022 – Present ✨): Nix Packages collection \u0026amp; NixOS. I serve as the package maintainer for a small set of packages. 🖇 Language clients and servers See details Ellsp (Winter 2023 – Spring 2026): Language server implementation for Emacs Lisp. The Emacs client (using lsp-mode) is also included; do M-x ellsp-register to enable it. After version 0.2.0, the client is now lsp-ellsp. shader-language-server (Summer 2023 – Fall 2023 🏅): Language server implementation for ShaderLab. It also provides support for various CG programming languages such as HLSL, GLSL, Cg, and more. grammarly-language-server (Summer 2022 ✨👷🔗): Grammarly for VS Code. unofficial-grammarly-language-server (Spring 2021 ✨👷🔗): Unofficial Grammarly extension. Forked from the original repository and maintained a version to ensure compatibility with various editors. This language server is now deprecated as the upstream has transitioned to the official API in 2022. Users are encouraged to use the newer grammarly-language-server instead. Eine See details 📢 Most EINE packages are published on EINE ELPA 🏅 so I won’t list them explicitly.\nx-slime-volleyball (Spring 2026): Play slime-volleyball. x-go (Spring 2026): Play Go. x-tetris (Spring 2026): Play Tetris. x-org-lint (Spring 2026): Run org-lint on Org files. cat (Spring 2026): View files with syntax highlighting powered by e2ansi. simple-httpd-cli (Spring 2026): A command-line interface for simple-httpd. gt-cli (Spring 2026): A command-line interface for gt.el (previously go-translate). google-translate-cli (Spring 2026): A command-line interface for Google Translate. 📝 Text Editor See details Emacs See details 📢 Most Emacs packages are published on either MELPA 🏅 or JCS ELPA 🏅 so I won’t list them explicitly.\nemamux (Winter 2025 👷): tmux manipulation from Emacs. foldvis (Fall 2025): Display indicators for various folding systems. eca (Summer 2025 👷): Editor Code Assistant (ECA) integration for Emacs. prettier-js (Summer 2025 👷): Minor mode to format code on file save. org-journal (Summer 2025 👷): A simple org-mode based journaling mode. lsp-smart-req (Spring 2025): Lazy load LSP packages. sideline-emoji (Spring 2025): Show emoji information with sideline. eglot-ltex-plus (Spring 2025): Eglot client leveraging LTEX+ Language Server. lsp-ltex-plus (Spring 2025): lsp-mode client leveraging LTEX+ Language Server. highlight-indent-guides (Winter 2024 👷): Emacs minor mode to highlight indentation. qob-mode (Winter 2024): Major mode for editing Qob files. jcs-screensaver (Winter 2024): A screensaver for jcs-emacs. sideline-geiser (Winter 2024): Show Geiser result with sideline. sideline-racket (Winter 2024): Show racket result with sideline. sideline-sly (Winter 2024): Show SLY result with sideline. sideline-cider (Winter 2024): Show CIDER result with sideline. sideline-eros (Winter 2024): Show EROS result with sideline. markdown-toc (Winter 2024 👷): Generate a TOC in markdown file. ueval (Winter 2024): Universal Evaluation Utilities. rustic (Winter 2024 👷): Rust development environment. rust-mode (Fall 2024 👷): Emacs configuration for Rust. cognitive-complexity (Summer 2024): Show cognitive complexity of code in Emacs 29+ (treesit-based). This package is based on codemetrics but is designed to support the built-in treesit.el. (ported by @abougouffa ❤️) treesit-langs (Summer 2024): Language bundle for Emacs\u0026rsquo;s treesit.el. This package is based on tree-sitter-langs but is designed to support the built-in treesit.el. colorful-mode (Summer 2024 👷): 🎨 Preview any color in your buffer. responsive-window (Summer 2024): Adapt to different screen sizes automatically. cogru.el (Summer 2024): Cogru plugin for Emacs. treesit-fold (Summer 2024): Code folding using treesit.el. (ported by @DevelopmentCool2449 ❤️) region-occurrences-highlighter (Summer 2024 👷): This emacs package implements a local minor mode that highlights occurrences of the current selected region. ansi-colorful (Summer 2024): Toggle render ansi-color. centaur-tabs (Summer 2024 👷): Emacs plugin aiming to become an aesthetic, modern-looking tabs plugin. auto-close-block (Summer 2024): Automatically close block. doom-dashboard (Spring 2024 👷): Doom Like style for emacs dashboard. sideline-load-cost (Spring 2024): Display load/require module size with sideline. guard-lf (Spring 2024): Guard large files. flymake-ziglint (Spring 2024): Flymake for ziglint. flycheck-ziglint (Spring 2024): Flycheck for ziglint. flymake-dart (Spring 2024): Flymake support for dart analyze. flycheck-dart (Spring 2024): Flycheck for dart analyze. zig-mode (Spring 2024 👷): Zig mode for Emacs. gptscript-mode (Spring 2024): Major mode for editing GPTScript natural language. dashboard-bm (Spring 2024 ✨👷): Visual Bookmarks (bm.el) for Dashboard. google-gemini (Spring 2024): Elisp library for the Google Gemini API. flycheck-rust (Spring 2024 👷): Better Rust/Cargo support for Flycheck. copilot.el (Spring 2024 👷): An unofficial Copilot plugin for Emacs. rainbow-csv (Winter 2023): 🌈 Highlight CSV and TSV spreadsheet files in different rainbow colors. qss-mode (Winter 2023): Major mode for Qt Style Sheets. sideline-eglot (Winter 2023): Show eglot information with sideline. company-emmet (Winter 2023): Company completion for emmet. ic (Winter 2023): Pretty print to debug. Inspired by the icecream package from the Python/PyPi community. lsp-ellsp (Winter 2023 – Spring 2026): lsp-mode client leveraging Ellsp. jcs-template (Winter 2023): Template module for jcs-emacs. dart-mode (Fall 2023 👷): An Emacs mode for the Dart language. php-mode (Fall 2023 👷): A powerful and flexible Emacs major mode for editing PHP scripts. elisp-tree-sitter (Fall 2023 👷): Emacs Lisp bindings for tree-sitter. tree-sitter-langs (Fall 2023 👷): Language bundle for Emacs\u0026rsquo;s tree-sitter package. blacken (Fall 2023 👷): Python Black for Emacs. anaconda-mode (Fall 2023 👷): Code navigation, documentation lookup and completion for Python. company-anaconda (Fall 2023 👷): Anaconda backend for company-mode. pythonic (Fall 2023 👷): Utility functions for writing pythonic emacs package. djangonaut (Fall 2023 👷): Emacs minor mode for Django. isortify (Fall 2023 👷): Isort for Emacs. pyenv-mode (Fall 2023 👷): Integrate pyenv with python-mode. chatgpt-sideline (Fall 2023): Sideline support for chatgpt. eglot-uniteai (Fall 2023 ✨👷): eglot client leveraging uniteai. lsp-uniteai (Fall 2023 ✨👷): lsp-mode client leveraging uniteai. eglot-shader (Fall 2023): eglot client leveraging shader-language-server. nerd-icons-buffer-menu (Summer 2023): Display nerd icons in buffer-menu. on.el (Summer 2023 🔗): Hooks for faster Emacs startup. deepl (Summer 2023): Elisp library for the DeepL API. jcs-poptip (Summer 2023): Generic popup tip. doxygen-asterisk (Summer 2023): Minor mode that helps you insert pair /* and */. This package is no longer supported as it has been superseded by the auto-close-block package. lsp-shader (Spring 2023 – Summer 2023): lsp-mode client leveraging shader-language-server. codemetrics (Spring 2023): Plugin shows complexity information. Inspired by CodeMetrics from the VSCode community. This plugin implements live calculation of the Cognitive Complexity metric, which was proposed by G. Ann Campbell in Cognitive Complexity - A new way of measuring understandability (c) SonarSource S.A. 2016-2021, Switzerland. jcs-echobar (Spring 2023): An echo-bar for jcs-emacs. jcs-frametitle (Spring 2023): A frame title for jcs-emacs. vs-comment-return (Spring 2023): Comment return like Visual Studio. flymake-elsa (Spring 2023): Flymake integration for Elsa — Emacs lisp static analyzer. dall-e (Spring 2023): Use DALL-E inside Emacs. chatgpt (Spring 2023): Use ChatGPT inside Emacs. codegpt (Spring 2023): Use GPT-3 inside Emacs. This project is inspired by the Code GPT: Chat \u0026amp; AI Agents from the VSCode community openai (Spring 2023): Elisp library for the OpenAI API. espuds (Spring 2023 👷): Common step definitions for Ecukes. ecukes (Spring 2023 👷): Cucumber for Emacs. sound-async (Winter 2022): Play sound asynchronously. block-travel (Winter 2022): Move to previous/next blank line. Drawn inspiration from Block Travel in the Atom community and Block Travel in the VSCode community. jcs-modeline (Winter 2022): A modeline for jcs-emacs. pkg-dm (Winter 2022): Package dependencies management. Emacs rarely encounters confusion regarding the dependency relationships between packages; this helps provide clarity. vc-refresh (Winter 2022): Refresh vc-state in certain events for better user experience. flycheck-deno (Winter 2022): Flycheck for deno-lint. ace-link-dashboard (Winter 2022 ✨👷): Ace-link for emacs-dashboard. easky (Winter 2022): Control Eask CLI in Emacs. eldoc-eask (Winter 2022): Eldoc support for Eask-file. company-eask (Winter 2022): Company backend for Eask-file. eask (Winter 2022): Core Eask APIs, for Eask CLI development. company-elisp-keywords (Winter 2022): Company completion for finder-known-keywords. cycle-case-style (Winter 2022): Cycle through case style (PascalCase, camelCase, etc). cycle-slash (Winter 2022): Cycle through slash, backslash, and double backslash. helafy (Winter 2022): minify/uglify/prettify contents. repos-window (Winter 2022): Reposition window when needed. company-paths (Winter 2022): A company backend for paths. vs-electric-spacing (Winter 2022): Add spacing around operators like Visual Studio. eval-mark (Winter 2022): Evaluate then deactive mark. The behavior of Emacs in this manner makes more sense to me. balanced-windows (Winter 2022): Keep windows balanced. ff-guard (Winter 2022): Create parent directory for non-existent file. fof (Winter 2022) Default configuration for ff-find-other-file. ffpc (Winter 2022): Find file in project or current directory. elenv (Winter 2022): Environment variable management. execrun (Winter 2022): Run through compilation-mode. editorconfig-emacs (Fall 2022 👷): EditorConfig plugin for Emacs. msgu (Fall 2022): Utility functions help output the messages. toggle-profiler (Fall 2022): Useful functions to interact with profiler. sideline-color (Fall 2022): Show color information with sideline. git-gutter (Fall 2022 👷): Emacs port of GitGutter which is Sublime Text Plugin. company-autoconf (Fall 2022 🔗): Completion backend for editing autoconf files in Emacs. company-kaomoji (Fall 2022): Company backend for Kaomoji. kaomoji.el (Fall 2022 🔗): Input kaomoji (顔文字) easily! ┌（┌ ＾o＾）┐ﾎﾓｫ company-makefile (Fall 2022 🔗): Emacs company completion backend for GNU Makefiles. company-cmd (Fall 2022 🔗): Emacs company-mode backend for windows DOS/batch scripts. company-powershell (Fall 2022 🔗): Autocompletion backend for powershell-mode in Emacs. company-dockerfile (Fall 2022 🔗): Add dockerfile keywords to company-mode keywords alist. ts-docstr (Fall 2022): A document string minor mode using tree-sitter. prt (Fall 2022): Progress Reporter Library. fussy (Summer 2022 👷): Emacs completion-style leveraging flx. vsc-multiple-cursors (Summer 2022): multiple-cursors integration behave like VSCode. sideline-blame (Summer 2022): Show blame messages with sideline. sideline-lsp (Summer 2022): Show lsp-mode information with sideline. sideline-flymake (Summer 2022): Show flymake errors with sideline. sideline-flycheck (Summer 2022): Show flycheck errors with sideline. sideline (Summer 2022): Show information on the side. gdscript-mode (Summer 2022 👷): An Emacs package to get GDScript support and syntax highlighting. javap-mode (Summer 2022 🔗): Show the ouput of javap when opening a jvm class file in Emacs. company-coffee (Summer 2022 🔗): Emacs add coffee keywords to company-keywords for completion. company-c-headers (Summer 2022 🔗): Auto-completion for C/C++ headers using Company. buffer-move (Summer 2022 🔗): easily swap buffers. noflet (Summer 2022 🔗): nic\u0026rsquo;s overriding flet, for fleting functions for the purpose of decorating them. eping (Summer 2022 🔗): An Emacs package that checks internet connectivity using ping. flymake-eask (Summer 2022): Eask support in Flymake. flycheck-eask (Summer 2022): Eask support in Flycheck. recentf-excl (Summer 2022): Exclude commands for recent files. Certain commands might inadvertently add files, resulting in unwanted entries in recentf. This package helps you address this issue. mbs (Summer 2022): Minibuffer stats. vertico-flx (Summer 2022): flx integration for vertico. flx-style (Spring 2022): Completion style for emacs-flx. vs-edit-mode (Spring 2022): Minor mode accomplish editing experience in Visual Studio. message-clean-mode (Spring 2022): Keep messages buffer clean. For an elisp developer, maintaining a clean *Messages* buffer is crucial for effectively tracking debug log information. fontawesome (Spring 2022 👷): FontAwesome utility. quick-peek (Spring 2022 🔗👷): Quick-peek inline-window library for Emacs. vs-revbuf (Spring 2022): Revert buffers like Visual Studio. eask-mode (Spring 2022): Major mode for editing Eask files. buffer-menu-project (Spring 2022): List buffers relative to project. buffer-menu-filter (Spring 2022): Filter buffer-menu items using fake header. While buffer-menu is a default method for switching between buffers, it lacks filtering capabilities. This package introduces that feature. electric-indent-sexp (Spring 2022): Automatically indent entire balanced expression block. fextern (Spring 2022): Record file external stats. auto-scroll-bar (Spring 2022): Automatically show/hide scroll-bars as needed. fuz-bin (Winter 2021): Similar to fuz.el but with precompiled binaries. I favor packages with precompiled binaries for an improved user experience. flx-rs (Winter 2021): emacs-flx in Rust using dynamic module. It packages the Rust library flx-rs and includes precompiled binaries, which are built and uploaded as artifacts through GitHub Actions. flxy (Winter 2021): flxy in Rust using dynamic module. sublime-fuzzy (Winter 2021): Fuzzy matching algorithm based on Sublime Text\u0026rsquo;s string search. Build sublime_fuzzy in Rust to Emacs loadable binaries. github-tags (Fall 2021): Retrieve tags information through GitHub API. company-box (Fall 2021 🔗): A company front-end with icons. Forked due to its challenging usability on Windows, incorporating numerous bug fixes, enhanced performance, and other improvements. ts-fold (Fall 2021): Code-folding using tree-sitter. hl-preproc (Fall 2021): Unhighlight invalid preprocessor region. This package uses meta-net to parse all define constants inside a csproj file. eldoc-meta-net (Fall 2021): Eldoc support for meta-net. company-emojify (Fall 2021): Company completion for Emojify. meta-view (Summer 2021): View metadata from .NET assemblies. company-meta-net (Summer 2021): company-mode backend for C# project. meta-net (Summer 2021): Parse .NET assembly\u0026rsquo;s XML. flex (Summer 2021): Flexible Matching Library. Algorithm is extracted from package ido-better-flex. liquidmetal (Summer 2021): A mimetic poly-alloy of the Quicksilver scoring algorithm. Ported from rmm5t/liquidmetal. logms (Summer 2021): Log message with clickable links to context. eglot-languagetool (Summer 2021): eglot client leveraging LanguageTool Language Server. lsp-languagetool (Summer 2021): lsp-mode client leveraging LanguageTool Language Server. eglot-ltex (Summer 2021): Eglot client leveraging LTEX Language Server. lsp-ltex (Summer 2021): lsp-mode client leveraging LTEX Language Server. flymake-languagetool (Summer 2021): Flymake support for LanguageTool. flycheck-languagetool (Summer 2021): Flycheck support for LanguageTool. auth-source-keytar (Summer 2021): Integrate auth-source with keytar. applescript-mode (Spring 2021 👷): Emacs mode for editing AppleScript. send-to-osx-grammarly (Spring 2021): An Emacs extension to send a text to/from Grammarly. eglot-grammarly (Spring 2021): eglot client leveraging grammarly-language-server. lsp-grammarly (Spring 2021): lsp-mode client leveraging grammarly-language-server. flycheck-google-cpplint (Spring 2021 👷): Google C++ Style checker for Flycheck. flymake-google-cpplint (Spring 2021 👷): Help to comply with the Google C++ Style Guide on Emacs with flymake. flymake-cppcheck (Spring 2021 👷): Cppcheck for Emacs with flymake. emacs-flymake-perlcritic (Spring 2021 👷): Run Perl::Critic static analysis \u0026ldquo;While U Type\u0026rdquo; via Emacs Flymake. flymake-phpcs (Spring 2021 👷): PHP CodeSniffer for Emacs with flymake. emacs-flymake-phpcs (Spring 2021 👷): Glue to bind Emacs Flymake mode to PHP_CodeSniffer static analysis. emacs-flymake-cursor (Spring 2021 👷): Display flymake error for the current line on the minibuffer. fuzzy-el (Spring 2021 – Present 👷): Fuzzy matching utilities designed for GNU Emacs, originally created for auto-complete. keytar (Spring 2021): Emacs Lisp interface for keytar-cli. lsp-grammarly-un (Spring 2021): lsp-mode client leveraging unofficial-grammarly-language-server. watch-cursor (Winter 2020): Display cursor from all live windows. docstr (Winter 2020): A document string minor mode. modablist (Winter 2020): Modifiable tabulated-list extension. scroll-text (Winter 2020): An enjoyable endeavor for animating scrolling text within an Emacs buffer. npm-pkgs (Winter 2020): An npm packages client. preview-it (Winter 2020): Preview anything at point. undo-tree-vf (Winter 2020): Visualizer follow mode for undo-tree. quelpa-leaf (Winter 2020): Emacs quelpa handler for leaf. quelpa (Fall 2020 – Present 👷): The package.el-compatible package manager for Emacs uses the MELPA\u0026rsquo;s format. auto-complete (Fall 2020 – Present 👷): An Intelligent auto-completion extension for Emacs. un-mini (Fall 2020): Automatically close minibuffer after it loses focus. ivy-file-preview (Fall 2020): Preview the current ivy file selection. ivy-describe-modes (Fall 2020): Ivy interface to describe-mode. Inspired by helm-describe-modes. flymake-grammarly (Fall 2020): Flymake support for Grammarly. lsp-focus (Fall 2020 👷): lsp-mode ❤️ focus. helm-lsp (Fall 2020 👷): lsp-mode ❤️ helm. lsp-ivy (Fall 2020 👷): lsp-mode ❤️ ivy. lsp-origami (Fall 2020 👷): lsp-mode ❤️ origami.el. dap-mode (Fall 2020 👷): Emacs ❤️ Debug Adapter Protocol. lsp-ui (Fall 2020 👷): UI integrations for lsp-mode. lsp-mode (Fall 2020 👷): Emacs client/library for the Language Server Protocol. license-templates (Fall 2020): Create LICENSE using GitHub API. atl-long-lines (Fall 2020): Turn off truncate-lines when the line is long. atl-markup (Fall 2020): Automatically truncate lines for markup languages. cursor-preview (Fall 2020): Preivew cursor movement while executing command interactively. impatient-showdown (Fall 2020): Preview markdown buffer live over HTTP. auto-highlight-symbol (Fall 2020 👷): Automatic highlighting current symbol minor mode. better-scroll (Fall 2020): Improve user experience when scrolling window. fill-page (Fall 2020): Fill the buffer so you don\u0026rsquo;t see empty lines at the end. undersea-theme (Fall 2020): Theme styled after undersea imagery. origami.el (Summer 2020 🔗): A folding minor mode for Emacs. This project is a Regular Expression-based solution, but it became deprecated following the creation of ts-fold. popup-el (Summer 2020 – Present 👷): Visual Popup Interface Library for Emacs. It\u0026rsquo;s used with auto-complete. transwin (Summer 2020): Make window/frame transparent. helm-searcher (Summer 2020): Helm interface to use searcher. ivy-searcher (Summer 2020): Ivy interface to use searcher. searcher (Summer 2020): An alternative to ag, rg, grep, and others, written in pure elisp for enhanced portability. quickrun (Summer 2020 👷): Run command quickly. This packages is inspired quickrun.vim. zoom-window (Spring 2020 👷): Zoom and Unzoom window. sound-wav (Spring 2020 👷): Play wav file. emp (Spring 2020): Emacs Music Playlist. manage-minor-mode-table (Spring 2020): Manage minor-modes in table. Expands on the functionality of the package manage-minor-mode. helm-themes (Spring 2020 👷): Emacs theme selection with helm interface. helm-gtags (Spring 2020 👷): GNU GLOBAL helm interface. helm-ag (Spring 2020 👷): The silver searcher with helm interface. emoji-github (Spring 2020): Display list of GitHub\u0026rsquo;s emoji. (cheat sheet) buffer-wrap (Spring 2020): Wrap the beginning and the end of buffer. dashboard-ls (Spring 2020): Display files/directories in current directory on Dashboard. manage-minor-mode (Spring 2020 👷): Manage your minor-mode on the dedicated interface buffer. popwin (Spring 2020 👷): Popup Window Manager for Emacs. undohist (Spring 2020 👷): Persistent Undo History for GNU Emacs. yascroll (Spring 2020 👷): Yet Another Scroll Bar Mode. company-quickhelp-terminal (Winter 2019): Terminal support for company-quickhelp. ffmpeg-player (Winter 2019): Play video using ffmpeg. The performance is notably poor as it plays the video frame by frame, leading to significant file I/O (including memory) demands. However, this remains the sole solution for playing videos within Emacs! parse-it (Winter 2019): Simple parser in Emacs Lisp. It provides support for over 25 languages (e.g. C, C++, C#, Python, Lua, etc), but its performance is noticeably slow as it operates on top of the elisp interpreter. flycheck-grammarly (Winter 2019): Grammarly support for Flycheck. grammarly (Winter 2019): Grammarly API interface. (reverse-engineered solution) tabulated-list-search (Winter 2019): Provide filtering/searching tabulated-list interface. reveal-in-folder (Winter 2019): Reveal current file/directory in folder. define-it (Winter 2019): Define, translate, wiki the word. Inspired by Amazon Kindle\u0026rsquo;s reading experiences. multi-shell (Winter 2019): Managing multiple shell buffers. vs-light-theme (Fall 2019): Visual Studio IDE light theme. vs-dark-theme (Fall 2019): Visual Studio IDE dark theme. diminish-buffer (Fall 2019): Diminish (hide) buffers from buffer-menu. company-fuzzy (Fall 2019): Fuzzy matching for company-mode. helm-fuzzy (Fall 2019): Fuzzy matching for helm source. marquee-header (Fall 2019): Code interface for displaying marquee in header. alt-codes (Fall 2019): Insert alt codes using meta key. haxe-mode (Fall 2019): Major mode for editing Haxe files. jayces-mode (Fall 2019): Major mode for editing JayCeS file. csharp-mode (Fall 2019 👷): A major-mode for editing C# in emacs. dashboard (Summer 2019 – Present 👷): An extensible Emacs startup screen showing you what’s most important. indent-control (Summer 2019): Generic control the indentation level for each mode. show-eol (Summer 2019): Show end of line (EOL) symbol in buffer. Derived inspiration from the built-in functionality of the editor Notepad++. helm-file-preview (Summer 2019): Preview the current helm file selection. goto-char-preview (Summer 2019): Preview character when executing goto-char command. goto-line-preview (Spring 2019): Preview line when executing goto-line command. isearch-project (Spring 2019): Incremental search through the whole project. toggle-quotes-plus (Spring 2019): Simple quote toggler that cycle through \u0026quot;, ', and `. file-header (Winter 2018): Highly customizable self design file header. com-css-sort (Winter 2018): Common way of sorting the CSS attributes. htmltagwrap (Winter 2018): Wraps a chunk of HTML code in tags. Inspired by the htmltagwrap from the VSCode community. auto-close-tag (Winter 2018): Automatically add HTML/XML close tag. Inspired by the Auto Close Tag from the VSCode community. auto-rename-tag (Winter 2018): Automatically rename paired HTML/XML tag. Inspired by Auto Rename Tag from the VSCode community. use-ttf (Summer 2018): Keep font consistency across different OSs. project-abbrev (Summer 2018): Customize your own abbreviation expansion in the project. line-reminder (Summer 2018): Line annotation for changed and saved lines. organize-imports-java (Summer 2018): Automatically organize imports in Java code. It has been deprecated with the advent of the Language Server Protocol. Package Archive (ELPA) EINE ELPA (Spring 2026): ELPA for EINE. JCS ELPA (Winter 2021 – Spring 2026): Jen-Chieh Shen\u0026rsquo;s (my own) ELPA; currently featuring 250+ packages. melpa (Fall 2020 – Winter 2023 ✨): Recipes and build machinery for the biggest Emacs package repo. MELPA stands for \u0026ldquo;Milkypostman’s Emacs Lisp Package Archive,\u0026rdquo; and I am among the top 5 contributors to the repository. Distribution JCS Emacs (Summer 2015 – Present): Emacs distribution that is designed to function smoothly across all operating systems, delivering exceptional performance, especially on legacy Windows systems. VSCode vscode-ellsp (Winter 2023 🏅): Emacs Lisp languages support for Visual Studio Code. vscode-shader (Fall 2023 🏅): Shader languages support for Visual Studio Code. Zed zed-shader-ls (Spring 2026): Shader languages support for Zed. zed-ellsp (Spring 2026 🏅): Emacs Lisp languages support for Zed. ⚙️ Technical utilities See details minify-dir (Spring 2019 🏅): Minify all files within a directory. Another Node.js website minifier created initially for the static site generator — SiraDoc. JCSBat_Util (Winter 2016 – Present): Some handy batch files for my workflow as programmer. (Windows) 🔓 Reverse engineering, hacking, and security See details keytar-cli (Spring 2021 🏅): CLI for keytar. It was initially used with lsp-grammarly, but it became obsolete after the upstream grammarly-language-server had adapted the official API. reverse_shell (Spring 2019): Reverse shell implemented in Python. 🤖 AI \u0026amp; Machine Learning See details shakespeare-monkey (Spring 2024 – Summer 2024): First attempt at implementing a Genetic Algorithm to demonstrate the Infinite Monkey Theorem in Rust. ⚡️ Static site generators See details SiraDoc (Fall 2021 🏅): A static documentation generator for scripting manuals! This was initially developed for several of my game frameworks, including JCSUnity, JCSEgret, CCosQuick, etc. 🏭 CI/CD tools and automation See details jcs-actions/delete-tag-and-release (Winter 2025 ✨🔗🏅): Simple action to delete a git tag, and optionally the associated release. Forked from dev-drprasad/delete-tag-and-release and ClementTsang/delete-tag-and-release, my own maintained fork since the upstream is no longer being maintained. setup-qob (Winter 2024 🏅): Install Qob for GitHub Actions workflow. tree-sitter-langs/update-grammars.yml (Spring 2024): Automatically update the TreeSitter grammars (submodules) by opening pull requests. Unlike the typical update_submodules.yml process, updating individual grammars is more complex, hence the importance of splitting it into separate modules. melpa/review-pr.yml (Spring 2024): Automatically review and comment on new package pull requests on MELPA. I\u0026rsquo;ve submitted the pull request in melpa#8904. This marks the second attempt to resolve the issue in melpa#6714. This solution is significantly simpler, relying solely on GitHub Actions, which improves the chances of it being merged. update_submodules.yml (Spring 2024): Automatically update all the submodules within the repository and update the repository by opening a pull request. This workflow is used across several projects, such as emacs-eask/cli, jcs-profile (this website), and more. setup-emacs-windows/update-stable.yml (Spring 2024): Automatically locate the latest Emacs\u0026rsquo; version and update the code through a pull request (PR). setup-emacs-windows/update-snapshot.yml (Spring 2024): Automatically locate the most recent Emacs\u0026rsquo; snapshot and update the code through a pull request (PR). setup-lem (Fall 2023 🏅): Install Lem for GitHub Actions workflow. jcs-actions/github-push-action (Summer 2022 ✨🔗🏅): GitHub actions to push back to repository eg. updated code. Forked from ad-m/github-push-action, this fork includes the rebase option tailored for my automation workflows. setup-emacs (Summer 2022 🏅): Github Actions which installs a given Emacs version. This project aims to replace purcell/setup-emacs by combining the two GitHub Actions — purcell/setup-emacs and setup-emacs-windows — into one. As a result, it now supports all commonly used operating systems. setup-eask (Spring 2022 🏅): Install Eask for Github Actions workflow. unity-verify-code (Fall 2021 🏅): An email parser to get 6 digit verification code to bypass TFA. unity-license-activate (Fall 2021 🏅): Activate Unity\u0026rsquo;s personal license through CLI. setup-emacs-windows (Fall 2020 🏅): A Github Actions that installs a specific Emacs version. This project draws inspiration from purcell/setup-emacs but is specifically dedicated to supporting legacy Windows systems. package-bot (Spring 2020 – Fall 2020): Review new package PRs on MELPA automatically. Requested by the community, refer to melpa#6714. While it wasn\u0026rsquo;t ultimately accepted, it propelled the community towards a better alternative — melpazoid. ⏸️ On-hiatus projects (might be finished someday) See details flx-hs (Spring 2025): Rewrite emacs-flx in Haskell. Untitled: CODE_F (Winter 2024 – Spring 2025 👨‍💼💸): A bottom-up project that explores mechanics from games like Vampire Survivors, 20 Minutes Till Dawn, and others. aws-toolkit-emacs (Winter 2023): A plugin for interacting with AWS from Emacs editor. jcs-lem (Summer 2023 – Present): My personal lem configuration files. Lem is still in its early stages, particularly on Windows systems. Untitled: CODE_D (Spring 2023 – Fall 2023 👨‍💼💸): A top-down action-adventure game inspired by Monument Valley, A Plague Tale: Innocence, and Assassin’s Creed. Prevo (Summer 2021): Preview GameObject using preview window. Untitled: CODE_C - Unfinished Road (Winter 2020 – Spring 2021 👨‍💼💸): A game featuring core battle mechanics reminiscent of MegaMan NT Warrior. 8comic (Fall 2020): Use 8comic to read manga. UCTooth (Summer 2020 💸): A cross-platform Bluetooth plugin for Unity, implemented in the native code of each platform. Untitled: CODE_B - Arrows For One (Summer 2020 – Fall 2020 👨‍💼💸): A third-person fighting game that incorporates MMO mechanics. Untitled: CODE_A - Find Tweety (Winter 2019 – Spring 2020 👨‍💼💸): Find the object game in which players are presented with a scene and tasked to find all the hidden objects before moving on to the next scene. CCosQuick (Winter 2019 – Summer 2020 💸): Prototype your game easily with component driven library built on top of Cocos Creator. swagger-it (Fall 2019 – Spring 2020 💸): Automatically generate the swagger.io yaml file for your project. MGDP (Fall 2019 – Winter 2019): Quaver is essentially a DJMax clone; hence, I\u0026rsquo;m uncertain whether to proceed with this project. Client (closed-source): Utilizing the Unity Engine, this game client aims to implement the gameplay aspect of the MGDP project. DevTool (closed-source): A simple desktop application assists me in generating music archive, which are then deployed on the server. DevelopmentKit (closed-source): Empower MGDP game developers with the capability to create their own music games and publish them on the MGDP platform. JCSUE (Fall 2017): Quickly construct your game by utilizing multiple components and predefined default settings. jcs-vim (Winter 2016 – Present): My personal vim configuration files. This is my initial experience with Vim, and I\u0026rsquo;m interested in exploring NeoVim in the future. 🛑 Abandoned projects (will never be finished) See details work-time (Spring 2021): How long have you been working? I\u0026rsquo;m uncertain about its current value, as it could potentially be substituted with wakatime and hammy.el. organize-imports-python (Spring 2021): Automatically organize imports in Python code. No reason to create this package anymore due to the advent of the Language Server Protocol. vlc-player (Winter 2019): Play video using VLC. I can\u0026rsquo;t recall the precise reason for abandoning this. My best assumption is that VLC doesn\u0026rsquo;t support the necessary options for stopping the video, prompting me to opt for ffmpeg instead. JCSEgret (Winter 2018 💸): A library designed for efficient game production using the Egret engine as its foundation. The project was initiated during the course of work but is no longer in use as the Egret engine became obsolete following their bankruptcy. ","permalink":"https://www.jcs-profile.com/projects/","summary":"\u003cp\u003eThis page showcases a selection of my personal, professional, and academic projects.\nThe source code for most of these, along with additional projects, is available on\nmy \u003ca href=\"https://github.com/jcs090218\"\u003eGitHub\u003c/a\u003e and \u003ca href=\"https://gitlab.com/jcs090218\"\u003eGitLab\u003c/a\u003e accounts.\u003c/p\u003e\n\u003cp\u003eAll of my open-source projects are maintained as needed, unless stated otherwise.\nThe dates listed below indicate when the majority of the major development took place.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cspan aria-label=\"Professional work\" data-balloon-pos=\"up\"\u003e💸\u003c/span\u003e = Professional work\u003c/li\u003e\n\u003cli\u003e\u003cspan aria-label=\"School work\" data-balloon-pos=\"up\"\u003e🏫\u003c/span\u003e = School work\u003c/li\u003e\n\u003cli\u003e\u003cspan aria-label=\"Role\" data-balloon-pos=\"up\"\u003e👨‍💼\u003c/span\u003e = Role in the team\u003c/li\u003e\n\u003cli\u003e\u003cspan aria-label=\"Maintainer\" data-balloon-pos=\"up\"\u003e👷\u003c/span\u003e = Maintainer\u003c/li\u003e\n\u003cli\u003e\u003cspan aria-label=\"Contributor\" data-balloon-pos=\"up\"\u003e✨\u003c/span\u003e = Contributor\u003c/li\u003e\n\u003cli\u003e\u003cspan aria-label=\"Forked projects\" data-balloon-pos=\"up\"\u003e🔗\u003c/span\u003e = Forked projects (not the original author)\u003c/li\u003e\n\u003cli\u003e\u003cspan aria-label=\"Reward or Achievement\" data-balloon-pos=\"up\"\u003e🏅\u003c/span\u003e = Reward or Achievement\u003c/li\u003e\n\u003cli\u003e\u003cspan aria-label=\"Adult Content\" data-balloon-pos=\"up\"\u003e🔞\u003c/span\u003e = Adult Content\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e📢 You can hover over these \u003cstrong\u003eemojis\u003c/strong\u003e for a detailed explanation!\u003c/p\u003e","title":"Projects"}]