Retrospective of this year

Table of Contents


Background

I am writing this to look back on this year and plan for the future. Below is the list of retrospectives I have written previously.

I used to write very detailed retrospectives every year but now I really don’t have enough time so I intend to keep it as concise as possible. I will write following the stream of consciousness but I’ll try to finish each point in one line if possible.


Looking Back at 2025

I will write in the order of company, personal work and daily life.

Company

Work

Last time I organized and wrote everything in detail but this time I will write briefly. Since the work didn’t fit me well and there were difficult parts in 2024, I set a goal for 2025 to just resolve the given tasks well. Fortunately, I was able to take on and proceed with the server development, operations, and QA tasks that I wanted to do.

I took charge of all the server related tasks (including development and maintenance) that had been postponed and I proceeded with issue handling and efficiency improvements. I conducted QA alone for relatively large services. Although the metrics for deployment frequency and error detection were a bit lacking, I spent a successful year.

I was able to learn various knowledge while using AI and I think I was able to do the work I wanted to do more enjoyably. However there were some challenges in the QA part and there still are so it would be good if those parts are improved in the future.

I put tasks in Microsoft To Do and the tasks I didn’t delete after finishing at the end of the year. It was very helpful for this retrospective so I plan not to delete them and keep them separately from now on.

DX Insider Activity

This is an activity similar to last year’s DX Creator. There were many ups and downs but essentially it was enjoyable and helpful. Since I like filming and videos, it was a great help for self-actualization and stress relief and I have no regrets as I could have a good time with the team members. I hope I can do it next year as well.

Thanks to last year’s activity and this year’s activity, I was able to apply for other broadcast appearances and it was fun. There was a really good opportunity but unfortunately it fell through. As expected, one must always be prepared and it seems opportunities come if you live diligently.

I hope to find self-actualization and joy through such filming and broadcasting work in the future, not just within the company. It is one of my many joys.


Personal Work

Blog

I could hardly do it. Since I took care of my family as the top priority and then focused on company matters, I lacked time to rest. I tried to write when I had a gap but it wasn’t easy. In fact, instead of blogging I split my time to do other studies(stocks, development, English) or slept more.

Perhaps because blog traffic decreased significantly with the emergence of language models and AI, it became a lower priority.


Personal Projects

There are so many things I want to make such as games, services, novels, and webtoons, and I imagined a lot. Realistically I haven’t made anything and only dreamed.

For games, AI has developed a lot but drawing was difficult and although I thought a lot about scenarios or direction they remain only in my head. Actually I haven’t done anything. Let’s reflect on this.

For service development, speed picked up a lot as AI developed but it is still hard to make time for it. I am currently working hard on making something to check how long it takes when developing via AI whici is aiming for a release next month.

In the case of novels and webtoons, there is no platform where I can write the genre I want and the only way is to make it with AI and post it on SNS. However I haven’t even started yet.

The only part I practically proceeded with is the service development I started around November. I am really trying to make time but making time is truly difficult and since everything requires sufficient time and sincerity I felt a limit. The service I am making isn’t for profit so I don’t know if there will be any ROI but I want to complete at least this successfully.

Still, the fortunate part amidst these poor results is that AI has developed so well these days that speed has increased tremendously in whatever work I do. I could write a lot about this but I think people who can think while utilizing AI well will succeed in the future. Otherwise hmm… I think everything will be sufficiently replaced. I believe only the people in areas where AI is applied slowly and those who use it well will eventually remain and that won’t be that many. I have to survive, right?

Additionally there are still many various things I want to do.


Daily Life

Maybe because of my age it became harder to wake up in the morning starting this summer. So I used to exercise for over an hour every day but it decreased to about 30 to 40 minutes. I don’t know the reason but my body condition requires more sleep. Still I can’t stop exercising so I tried to go as much as possible every day.

This year, whatever I did, time was always too short. As mentioned above there are many things I want to do but my body is tired and since family is the top priority I had almost no spare time because I was doing family related things first.

In fact there were quite a few times when I was mentally stressed. Still I tried to relieve it as much as possible by exercising, playing games, sleeping, and doing what I wanted to do.

To summarize, while attending the company I was as faithful as possible to my family and I tried to do various things whenever I had time in between. However I feel regretful because the results seem a bit lacking compared to what I expected.

It’s something I feel every time, but I often think “I wish my energy and ability were better.”

​I happened to read my past post again, [Retrospective](EN) Retrospective of a tenth-year major in computer science and engineering. Even though it was written three years ago, my worries about the country have not only persisted but have actually grown deeper.

​High real estate prices, the deepening conflicts between people and social division, and the distorted population structure combined with the low birth rate remain unresolved, weighing heavily on our society. However there are new problems. The extinction of local regions, the lack of an education system to nurture talent capable of leading technology and the crises faced by key industries due to intensified global competition.

​There was a time when enhancing national prestige was one of my life goals but that goal has long since faded. The reason I continue to live here now is simply because this is where my family and loved ones have their roots and because I have grown accustomed to this life.

​Although the current situation seems bleak and the political reality looks frustrating which makes me with zero expectation, I earnestly hope that a day will come when I can look back on this post and breathe a sigh of relief thinking “I was worrying for nothing back then.”


2026 Goals

Every time I look at last year’s post, I am a bit surprised that I had already written everything I wanted to say. Seeing this every year, it seems my beliefs or values are already established. Listing them to make it easier to see, it is as follows.

The most important things are still these three.

  • Family
  • Health
  • Work

These are the important elements that become my criteria for judging any matter. I wrote ‘Work’ at the end but it doesn’t mean work is more important than friends or people around me… Is there anyone who would misunderstand this?

I added to last year’s thoughts and thought the following.

  • Even if there is something that I’d like to do, I may not be able to do it.
  • Goals should be set specifically.
  • I have to clean up my greed.
  • There is no turning back.
  • Speed is life.

Two things were added. Since there is no turning back now, I have to focus and work hard every time. The last one is something I didn’t know usually but felt recently. I am a bit slow when doing certain tasks. It was a part where I used to catch up similarly by investing more time than others but now speed seems to be life as well. As a simple example in daily life, starting with folding laundry… let’s not fold it too diligently.

Nothing will change significantly. I am still thinking as below.

  • Family related work first
  • Work
    • Company
    • DX Insider activity
  • Travel with family
  • Exercise four times a week
  • Speaking and listening to English conversation during commute
  • A good night’s sleep and rest
  • Blog
  • Investment
  • Personal Works

It changed a little from last year and looking at it this way 2025 seems like a year well spent. One goal has increased in a way but the reason I couldn’t remove anything is that all of these are now essential for survival.

I wrote down several goals but I plan not to be too greedy. I will definitely take care of health and family, and while those things are good, I want to become emotionally stable. I seem to be a bit emotionally unstable and I hope this improves.


Conclusion

I tried to finish with one line but I wrote longer than expected.

This year, I was happy spending time with my family and happiness and celebratory events came as a new family member arrived. However it is also a year when my dog who lived at my parents’ house crossed the rainbow bridge. I was mentally struggling due to various events and had recovered but when I think about sending away the dog who was our family, my heart still breaks and I only remember what I couldn’t do for him. It is a past event and it is sad but I will remember him forever. I want to meet my brother again someday. Perhaps due to this influence, I want to spend more time with the family currently by my side without any regrets.

I have the standards of life written above and I plan to live diligently while keeping those standards, just as I have done so far.

Let’s continue to work hard as I’ve done so far. Gratefully and humbly, let’s work hard!


환경

  • GCP
  • GitHub Actions


GCP Console 입력에서 Audience 입력 시 있었던 일

GitHub Actions에서 GCP 인증을 위해 Workload Identity Federation을 설정할 때, Audience 값을 입력하는 부분이 있었다. 해당 값을 입력하고 GitHub Actions을 실행했더니 아래와 같은 오류가 발생했다.

Error: google-github-actions/auth failed with: retry function failed after 4 attempts: failed to generate Google Cloud federated token for ***: (400) {"error":"invalid_grant","error_description":"The audience in ID Token [***] does not match the expected audience."}

값을 복사해 붙여넣은 것이었기 때문에 Ctrl + F로 여러 번 확인했음에도 불구하고 계속 오류가 났다. 몇 시간을 시도해 본 끝에, 입력한 값 앞에 공백(“ “)이 있어서 다른 값으로 인식되고 있었다는 것을 알게 되었다.

공백을 인식하거나 경고해주는 검증이 있었더라면 좋았겠지만, 그런 기능이 없어서 공백이 포함된 채 값이 입력되었다. 물론 이 부분은 명백히 내 실수다. 예전에 회사에서 비밀번호 입력할 때도 비슷한 문제가 있었는데, 앞으로는 입력에 좀 더 주의해야겠다.


참고자료


Environment and Prerequisite

  • GCP
  • GitHub Actions


Background

While setting up Workload Identity Federation for GCP authentication in GitHub Actions, there was a step to put the Audience value. After putting the value and running the workflow, I encountered the following error.

Error: google-github-actions/auth failed with: retry function failed after 4 attempts: failed to generate Google Cloud federated token for ***: (400) {"error":"invalid_grant","error_description":"The audience in ID Token [***] does not match the expected audience."}

Since I had copied and pasted the value, I used Ctrl + F to verify it multiple times, but the error persisted. After spending a few hours troubleshooting, I finally realized that there was a space (“ “) at the beginning of the input.

It would’ve been helpful if there had been a validation check to catch or warn about leading spaces, but there wasn’t. So the value was accepted with the space included. Of course, this was entirely my fault. I had a similar issue before at work when entering a password, so from now on, I’ll be more careful about blank space in my inputs.


Reference

GitHub Actions actions/github-script에서 별도 파일을 실행하기


환경

  • GitHub Actions
  • JavaScript


배경

  • yq 혹은 코드를 통해 GitHub Actions에 있는 workflow YAML 파일을 동적으로 수정했을 때 코드가 큰따옴표(“”)로 감싸지는 현상이 있어서, 코드 파일을 바깥으로 빼고 호출하는 형태로 변경한 사례가 있어서 정리함.
  • actions/github-script를 사용해봤는데 앞으로도 종종 사용할거 같아서 정리함.


방법

  • 사용법은 공식 문서에 나와 있었다.
  • 일반적인 JavaScript의 호출 및 사용법과 같다.

예시

코드

github-script-file-return-test.yml

name: Separate JavaScript File Return Workflow
on:
  workflow_dispatch:
jobs:
  print-javascript-return-value-job:
    name: print javascript process return value
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Run javascript code
        id: workflow_result
        uses: actions/github-script@v7
        with:
          script: |
            const exportedModule = require('.github/workflows/scripts/github-script-file-test.js');
            return exportedModule.processValue(github, context);
      - name: Print javascript return value
        run: |
          echo "${{ fromJSON(steps.workflow_result.outputs.result).data }}"

github-script-file-test.js

function processValue(github, context) {
  console.log(JSON.stringify(context));
  return {"data": context.workflow};
};

module.exports = {
    processValue
};

결과

Run echo "Separate JavaScript File Return Workflow"
  echo "Separate JavaScript File Return Workflow"
  shell: /usr/bin/bash -e {0}
Separate JavaScript File Return Workflow


기타

  • 문서에 보면 사용할 수 있는 미리 만들어진 객체들이 있다.
    • github: A pre-authenticated octokit/rest.js client with pagination plugins
    • context: An object containing the context of the workflow run
    • core: A reference to the @actions/core package
    • glob: A reference to the @actions/glob package
    • io: A reference to the @actions/io package
    • exec: A reference to the @actions/exec package
    • require: A proxy wrapper around the normal Node.js require to enable requiring relative paths (relative to the - - current working directory) and requiring npm packages installed in the current working directory. If for some reason you need the non-wrapped require, there is an escape hatch available: original_require is the original value of require without our wrapping applied.
  • actions/github-script 사용시에 코드가 길어질 경우 포맷팅도 할 수 없고 관리가 어려워질거 같아서 외부 파일로 분리했다.
  • 일반 JavaScript 사용법과 사실 똑같다.


참고자료

Usage of running a separate file in GitHub Actions actions/github-script


Environment and Prerequisite

  • GitHub Actions
  • JavaScript


Background

  • I encountered an issue where code was being wrapped in double quotes (“”) when dynamically modifying workflow YAML files in GitHub Actions using yq or code so I extracted the code files and called that instead.
  • I once applied actions/github-script and since I think I’ll be using it often in the future. So I decided to write it.


Usage

  • The official document provides the instructions.
  • It is similar to the usual way of using JavaScript.

Example

Code

github-script-file-return-test.yml

name: Separate JavaScript File Return Workflow
on:
  workflow_dispatch:
jobs:
  print-javascript-return-value-job:
    name: print javascript process return value
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Run javascript code
        id: workflow_result
        uses: actions/github-script@v7
        with:
          script: |
            const exportedModule = require('.github/workflows/scripts/github-script-file-test.js');
            return exportedModule.processValue(github, context);
      - name: Print javascript return value
        run: |
          echo "${{ fromJSON(steps.workflow_result.outputs.result).data }}"

github-script-file-test.js

function processValue(github, context) {
  console.log(JSON.stringify(context));
  return {"data": context.workflow};
};

module.exports = {
    processValue
};

Result

Run echo "Separate JavaScript File Return Workflow"
  echo "Separate JavaScript File Return Workflow"
  shell: /usr/bin/bash -e {0}
Separate JavaScript File Return Workflow


Others

  • The document introduces pre-built objects that you can use.
    • github: A pre-authenticated octokit/rest.js client with pagination plugins
    • context: An object containing the context of the workflow run
    • core: A reference to the @actions/core package
    • glob: A reference to the @actions/glob package
    • io: A reference to the @actions/io package
    • exec: A reference to the @actions/exec package
    • require: A proxy wrapper around the normal Node.js require to enable requiring relative paths (relative to the - - current working directory) and requiring npm packages installed in the current working directory. If for some reason you need the non-wrapped require, there is an escape hatch available: original_require is the original value of require without our wrapping applied.
  • When using actions/github-script, I separated the code into an external file because if the code gets too long, it becomes difficult to format and manage.
  • It is actually the same as using regular JavaScript.


Reference