3 minute read


blog

블로그가 로그로만 포스트가 도배되니 보기가 좀 그런데.. 일부 내용이라도 표시되게 하거나 해야 할 듯하다. 또한 포스트의 toc도 활성화시켜야겠다.

홈 페이지에서 특정 태그나 카테고리의 포스트만 보이게 할 수도 있다는 듯하다. 설정을 통해 메인에서는 팁 등만 보이게 하고, 피드 등의 추가 페이지에서 로그를 작성하는 식으로 해도 좋을 듯하다. excerpt 추가도 필요하다.

https://mmistakes.github.io/minimal-mistakes/docs/layouts/

또한, 밝은 테마에 비해 다크 테마가 가독성이 그리 좋지 못하고, 코드 출력 등도 아주 이쁘지는 않은 아쉬움이 있다. 이걸 다 신경쓰기보단 일단 git을 메인으로 생각하려고 한다.

그런데 깃허브에서도 frontmatter가 나름 동작하는거 같아서 그냥 그대로 사용할까 고민중..

작업의 효율적인 관리를 위해 wbs같은 것이 필요할 듯하다.

project

epis

생각해보니 나는 시간관리 앱을 만들고 싶었는데, 지금 쓰는 TODO를 내가 마크다운 형식과 연동시켰으니, unist를 사용 가능할지도 모르겠다. electron 클라이언트에서 시각적으로 조작 가능하게? 그런데 이건 또 서버에서 멀어진다..

cloud

acloud guru 강의 - aws lambda

하나 수강하고서, 찾아보니 좋은 툴을 찾아서 사용했다.

https://github.com/r0oth3x49/acloud-dl

파이썬 패키지 설치하여 사용중에, 아래와 같은 에러가 있었다. 원인은 맥에서 인증서? 같은 것이 설치되지 않아서라고 한다.

리퀘스트 카피할 때, 사파리를 써야 했다.


# install_certifi.py
#
# sample script to install or update a set of default Root Certificates
# for the ssl module.  Uses the certificates provided by the certifi package:
#       https://pypi.python.org/pypi/certifi

import os
import os.path
import ssl
import stat
import subprocess
import sys

STAT_0o775 = ( stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
             | stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP
             | stat.S_IROTH |                stat.S_IXOTH )


def main():
    openssl_dir, openssl_cafile = os.path.split(
        ssl.get_default_verify_paths().openssl_cafile)

    print(" -- pip install --upgrade certifi")
    subprocess.check_call([sys.executable,
        # "-E", "-s", 
        "-m", "pip", "install", "--upgrade", "certifi"])

    import certifi

    # change working directory to the default SSL directory
    os.chdir(openssl_dir)
    relpath_to_certifi_cafile = os.path.relpath(certifi.where())
    print(" -- removing any existing file or link")
    try:
        os.remove(openssl_cafile)
    except FileNotFoundError:
        pass
    print(" -- creating symlink to certifi certificate bundle")
    os.symlink(relpath_to_certifi_cafile, openssl_cafile)
    print(" -- setting permissions")
    os.chmod(openssl_cafile, STAT_0o775)
    print(" -- update complete")

if __name__ == '__main__':
    main()

위 스크립트를 관리자 권한으로 실행하여 해결했다. (sudo python3)

grpc 공부

단위 서비스를 만들기 위해 grpc를 공부중. .proto 확장자를 가진 스키마를 만들고, 이를 이용해서 동적으로 코드를 생성하거나, protoc라는 유틸리티로 코드를 만드는 방식인 듯하다. https://developers.google.com/protocol-buffers/docs/proto3#simple

bloomrpc 라는 grpc gui client를 찾았다.

다시 생각해보니 그런 생각이 든다. 저장소를 굳이 따로 관리할 필요가 있을까? 설령, 마이크로서비스로 각 서비스들을 따로 작업한다고 해도, 굳이 꼭 소스까지 따로 관리해야할까? 어차피 작업 폴더와 파일이 다르면 충돌은 일어나지 않으니 상관없을 거 같다는 생각이 든다.

지금 보니 copilot이 rust등 다른 언어에서도 작동하긴 하는데, 확실히 성능이 떨어지는 듯하다.

sport

cf 734

A

a+2b=n이면서 |a-b|를 최소로 하는 값 찾기 나머지가 얼마인지에 따라 케이스 나누어 품.

B2

B1의 확장 문제

조건들 대충 보고 해서 틀림. 생각보다 효율은 문제가 되지 않았고, 완벽하게 조건대로 구현하는게 중요한 문제.

접근방법들
  • 접근 1
    • 각 나온 수마다 카운트 관리하면서, 앞에서부터 1씩 증가시키면서 다음 수 넣기
    • 넣을 수 없으면 (k번 초과), 0 넣고 스킵
      • 이렇게 했을때, 색칠된 수의 개수가 같지 않게되어 틀림
      • 그것만 고치면 되나 했는데, 더 큰 문제는, 다른 수가 나와서 사이클 돌다 이전 수로 다시 나왔을 때 안겹치고 다음 컬러 찾는게 너무 어려워짐
  • 접근 2
    • 각 숫자별로 1부터 씀, k 초과하면 0 씀
      • 이렇게 하면, 앞의 숫자가 더 많이 사용되어 틀림
  • 접근 3
    • 각 나온 수마다 카운트 관리하고, 총 사용할 숫자 수 계산함
    • 숫자별로 인덱스를 만들어 순회시킴 (이건 필요한지 잘 모르겠다->필요할듯)
js solution

let i = ''
process.stdin.on('data', c => i += c)
process.stdin.on('end', () => {
  const {EOL} = require('os')
  const lines = i.split(EOL);
  
  // iter lines
  const cases = lines[0] - 0;

  for (let i = 1; i <= cases; i++) {
    const [n,k] = lines[2*i - 1].split(' ').map(x => parseInt(x));
    const arr = lines[2*i].split(' ').map(x => parseInt(x));
    // console.log(n,k,arr);
    // create a map for cycle
    const map = {};
    // pos[num] = [each pos]
    const pos = {};
    const rpos = {};
    const cnts = {};
    const ans = [];
    let target_count = 0;
    // count how many times each num appears, iter j
    for (let j = 0; j < arr.length; j++) {

      if (map[arr[j]]) {
        map[arr[j]]++;
      } else {
        map[arr[j]] = 1;
      }

      // pos
      if (pos[arr[j]]) {
        pos[arr[j]].push(j);
        // add target_count if arr[j] appeared less than k times
        if (map[arr[j]] <= k) {
          target_count++;
        }

      } else {
        pos[arr[j]] = [j];
        cnts[arr[j]] = 0;
        target_count+=1;
      }
    }

    // left target_count number should be multiple of k
    target_count -= (target_count % k);

    const poses = [];
    // flatten pos to poses
    for (let key in pos) {
      poses.push(...pos[key]);
    }

    // iter thru poses
    let color = 1;
    for (let j = 0; j < poses.length; j++) {
      // get now pos
      const now = poses[j];
      // get cnts of this num
      const cnt = cnts[arr[now]];
      // put ans cnt+1 if cnt < k
      if (cnt < k && target_count > 0) {
        ans[now] = color++;
        cnts[arr[now]]++;
        if(color > k) {
          color = 1;
        }
        target_count--;
      } else {
        ans[now] = 0;
      }
    }
    console.log(ans.join(' '));
  }

})


Comments