Skip to content

TIL - 2024. 08.

이전 페이지

2024. 08. 01

AutoCAD .NET에서 nested transaction으로 할 수 있는 것

Nesting instincts: getting more out of transactions inside AutoCAD using .NET - Through the Interface (keanw.com)

autocad .net에서 nested transaction에 대한 이야기.

c# - how to display entity on autocad drawing area without add to database? - Stack Overflow

이 링크에서 타고 갔던 건데, 답글 중에 하나에서 아래의 테크닉을 사용한 사례로 소개한다.

 tr.TransactionManager.QueueForGraphicsFlush();

msi의 product code와 upgrade code

.net - What are ProductCode & UpgradeCode & GUID? How to detect if certain application/library is already installed on the user machine? - Stack Overflow

UpgradeCode denotes a product with different versions.

ProductCode denotes a version of a product.

For example, theoretically there is one ProductCode for Microsoft Word 2003 and a different one for Word 2007. However both Word 2003 and 2007 would share the same UpgradeCode since you can upgrade from one to the other.

즉, 디버깅용 설치 파일이랑 배포용 설치 파일 중 하나만 컴퓨터에 설치되어있게 하고 싶다면 다른 product code를 사용하고 같은 upgrade code를 공유하면 일차적인 방어가 가능할 것으로 보인다.

2024. 08. 02

TIOBE Index - TIOBE

검색하다가 이런 것을 찾았다. 2024년 7월 기준 아래와 같이 요약을 해주고 있다.

# **TIOBE Index for July 2024**

### July Headline: Rust is preparing itself for the top 10

This month, high-performance language Rust jumped from position #17 to position #13 in the TIOBE index. This is an all time high for Rust. Gaining 4 positions might seem a small change, but Rust has been "the talk of the town" the last couple of years without making much progress in the TIOBE index. Rust is finally moving up. After the tailwind of the US government, which recently announced to recommend moving from C/C++ to Rust for security reasons, things are going fast for Rust. The community is growing, including the number of third party libraries and tools. In short, Rust is preparing itself for a top 10 position in the TIOBE index. --_Paul Jansen CEO TIOBE Software_

The TIOBE Programming Community index is an indicator of the popularity of programming languages. The index is updated once a month. The ratings are based on the number of skilled engineers world-wide, courses and third party vendors. Popular web sites Google, Amazon, Wikipedia, Bing and more than 20 others are used to calculate the ratings. It is important to note that the TIOBE index is not about the _best_ programming language or the language in which _most lines of code_ have been written.

The index can be used to check whether your programming skills are still up to date or to make a strategic decision about what programming language should be adopted when starting to build a new software system. The definition of the TIOBE index can be found [here](https://www.tiobe.com/tiobe-index/programminglanguages_definition).

랭킹 매기는 방법도 설명해놓고 그래서 이 랭킹을 어떻게 받아들이면 좋은지 설명해놓은 것도 그렇고 나중에 좀 더 자세히 읽어보면 재미있을것 같다.

C#에서 geos 기능을 사용할 수 있을까?

Bindings | GEOS (libgeos.org)

libgeos에 있는 bindings 항목에는 c# binding이 없다. 검색해봐도 c#에서 geos를 쓰려는 사람들이 별로 없는 것으로 보인다.

2024. 08. 03

2024. 08. 04

2024. 08. 05

nextjs에서 이미지 다루기

Components: Image | Next.js (nextjs.org)

import Image from "next/image";

export default function Page({ photoUrl }) {
  return (
    <div style={{ position: "relative", width: "300px", height: "500px" }}>
      <Image
        src={photoUrl}
        alt="Picture of the author"
        sizes="300px"
        fill
        style={{
          objectFit: "contain",
        }}
      />
    </div>
  );
}

2024. 08. 06

c# string reverse

C# 에서의 문자열 뒤집기(2023-09-18 TIL) (velog.io)

// 1. string.Reverse()
// 위 페이지에서는 아래와 같이 구현했다.
string newStr = new string(str.Reverse().ToArray());
// 그런데 위 페이지에 나오지는 않지만 이걸 더 짧게 줄일 수 있다. 숏코딩에 유리.
string newStr = string.Concat(str.Reverse());

// 2. Array.Reverse()
// stack overflow에 자주 등장하는 답변이기도 함.
char[] charArr = str.ToArray();
Array.Reverse(charArr);
string newStr = new string(charArr);

2024. 08. 07

C#에서 배열 앞의 n개의 아이템을 떼어서 뒤로 보내기

다음과 같은 방식으로 구현할 수 있다.

y.Skip(2).Concat(y.Take(2))

2024. 08. 08

AutoCAD C# ResultBuffer 다루기

Storing and retrieving handles from a resbuf using the .NET API - AutoCAD DevBlog (typepad.com)

이런 식으로 코드를 작성하면 된다.

ResultBuffer buf =
    new ResultBuffer(new TypedValue((int)DxfCode.Handle, id.Handle));

//Retrieve the Handle and use it to construct an ObjectId
TypedValue[] arr = buf.AsArray();

long val = Convert.ToInt64(arr[0].Value.ToString(), 16);

AutoCAD C# CommandEventHandler

Trying to Display Transient Text (theswamp.org)

커맨드 이벤트 핸들러를 사용해서 REGEN이라는 string이 포함된 커맨드가 들어오는 경우 특정한 작업을 진행하도록 하는 부분 참조.

public static bool eventadded = false;

public static void DisplayText(string mystring)
{
 ...
 if (!eventadded)
 {
  acDoc.CommandWillStart += new CommandEventHandler(doc_CommandWillStart);
  eventadded = true;
 }
 ...
}
public static void doc_CommandWillStart(object sender, CommandEventArgs e)
{
 if (e.GlobalCommandName.Contains("REGEN"))
 {
  ClearMarkers();
  Document doc = Application.DocumentManager.MdiActiveDocument;
  doc.CommandWillStart -= new CommandEventHandler(doc_CommandWillStart);
  eventadded = false;
 }
}

AutoCAD C# curve의 두께 세팅 방법

Setting the Lineweight of a Line in .NET - AutoCAD DevBlog (typepad.com)

db.LineWeightDisplay 값이 true여야 작동한다.

...
// create a new line
Line line = new Line(new Point3d(0, 0, 0), new Point3d(100, 100, 0));
// set the lineweight for it
line.LineWeight = LineWeight.LineWeight211;
// add the object to the current space
Database db =
        Application.DocumentManager.MdiActiveDocument.Database;
// make sure lineweights are turned on
db.LineWeightDisplay = true;
...

2024. 08. 09

Use lazy % formatting in logging functions Pylint(W1203)

W1203:logging-fstring-interpolation

Why it matters how you log in python | by Mike Taylor | The Startup | Medium

logging을 하기 위해서 string을 만드는 과정에서 에러가 발생하면 안된다!

logger.error('haha %d' % None)

# is equivalent to:

message = 'haha %d' % None
logger.error(message)

그래서 이런 상황을 logging 모듈에서 처리할 수 있도록 다음과 같이 코드를 작성하는 것이 좋다.

import logging
logger = logging.getLogger()

# ...

def good_call_with_problem():
    try:
        logger.error('haha %d', None)
    except:
        print("This will never be raised.")
        raise

2024. 08. 10

React Image 코너 라운딩

<Image
    ...
    style={{
    ...
    borderRadius: 6 // <- 이 줄 추가
    }}
/>

tailwind condtional

javascript - How to add a style on a condition in tailwind css - Stack Overflow

매우 단순. 그냥 template literals 쓰면 되는 거였다.

<... className={
    `flex items-center space-x-2 px-4 py-5 transition duration-500 ease-in-out transform hover:-translate-y-1 hover:scale-110 border-l-4 border-white ${
    window.location.pathname === '/' ? 'border-red-200' : ''
    }`
}>

2024. 08. 11

python의 Counter

collections — Container datatypes — Python 3.12.5 documentation

A Counter is a dict subclass for counting hashable objects.

2024. 08. 12

python에서 숫자에 '_'를 넣어도 영향을 주지 않는다?

Usage of the Underscore (_) in Python | by Soumendra's Blog | Medium

PEP 515 – Underscores in Numeric Literals | peps.python.org

이게 왜 됨..?

>>> 1_00_000
100000
>>> 3_25_50_000 == 32550000
True

python 패키지 셋업할때 dev일때만 특정 패키지를 설치하도록 하는 방법

Dependencies Management in Setuptools - setuptools 72.2.0.post20240809 documentation (pypa.io)

  • setup.pyextras_require 값 넣기.
    • extras_require={"dev": ...} 같은 방식.
  • pip install .[dev] 같이 뒤에 extras_require에 넣어둔 키값을 활용해서 설치.

MANIFEST.in에서 recursive-exclude와 prune 차이

python 2.7 - Difference between prune and recursive-exclude in setuptools? - Stack Overflow

  • recursive-exclude dir pat1 pat2 takes the directory dir and ignores all the files that match patterns pat1 and pat2
  • prune dir will exclude all files within the directory dir

mypy에서 특정 경로에 있는 내용물만 체크하도록

python - Why is mypy checking files that I've excluded? - Stack Overflow

만약 follow_imports값을 세팅하지 않으면 import한 모듈들을 다 따라가면서 체킹을 진행하므로 exclude를 통해 특정 경로를 무시하도록 한 것이 잘 작동하지 않을 수 있다.

2024. 08. 13

mypy로 shapely 관련 타입 체크

How about adding type hints? · Issue #721 · shapely/shapely (github.com)

types-shapely · PyPI

예를 들어, 두 polygon을 union한 결과를 내보내는 함수의 리턴 값의 타입이 Polygon으로 되어있으면 에러라고 알려줌. 왜냐하면 union 결과는 BaseGeometry이기 때문.

regex에서 특정 단어를 제외한 전부 찾기

regex - Need to find a regular expression for any word except word1 or word2 - Stack Overflow

Regex Tutorial - Lookahead and Lookbehind Zero-Length Assertions (regular-expressions.info)

negative lookahead를 활용하면 된다.

q(?!...)

mypy의 exclude에 활용하려고 잠시 살펴보았다.

github repo 리뷰어 제한

How do I increase number of reviewers| remove "up to 1" · community · Discussion #23978 (github.com)

유료 플랜 안 쓰면 private repo에서는 리뷰어가 최대 한 명.

2024. 08. 14

regex에서 제일 긴 매치 말고 짧은 매치 찾기

.net - RegEx: Smallest possible match or nongreedy match - Stack Overflow

.*? 같이 뒤에 물음표를 붙이면 nongreedy match를 한다.

20973번: Uddered but not Herd (acmicpc.net)

이 문제 풀때 사용했다.

using System.Text.RegularExpressions;
string s()=>Console.ReadLine();var a=string.Concat(Enumerable.Repeat(s(),1001));
Console.Write((new Regex(".*?"+string.Join<char>(".*?",s())).Match(a).Length+25)/26);

python requirements.txt에 주석을 다는 방식

Requirements File Format - pip documentation v24.2 (pypa.io)

A line that begins with `#` is treated as a comment and ignored. Whitespace followed by a `#` causes the `#` and the remainder of the line to be treated as a comment.

Comments are stripped _after_ line continuations are processed.

2024. 08. 15

2024. 08. 16

2024. 08. 17

2024. 08. 18

2024. 08. 19

python의 bool은 int의 subclass다

boolean - Is it Pythonic to use bools as ints? - Stack Overflow

위 링크에 읽을 거리들이 많은데, 우선

>>> isinstance(True, int)
True
>>> isinstance(False, int)
True

그리고

...
Historically, logical true/false operations tended to simply use `0` for false and `1` for true; in the course of Python 2.2's life-cycle, Guido noticed that too many modules started with assignments such as `false = 0; true = 1` and this produced boilerplate and useless variation (the latter because the capitalization of true and false was all over the place -- some used all-caps, some all-lowercase, some cap-initial) and so introduced the `bool` subclass of `int` and its `True` and `False` constants.

There was quite some pushback at the time since many of us feared that the new type and constants would be used by Python newbies to _restrict_ the language's abilities, but Guido was adamant that we were just being pessimistic: nobody would ever understand Python so badly, for example, as to avoid the perfectly natural use of `False` and `True` as list indices, or in a summation, or other such perfectly clear and useful idioms.
...

Boolean Objects — Python 3.12.5 documentation

여기에 명시되어 있다.

Booleans in Python are implemented as a subclass of integers.

js에서 특정 문자가 포함된 string에 split을 사용하면 의도와 다르게 작동할 수 있다

https://stackoverflow.com/a/58220344

예시로, 이런 문제가 발생.

s = "abcd";
console.log(s.split("")); // [ 'a', 'b', 'c', 'd' ]
s = "😀😂😍";
console.log(s.split("")); // [ '\ud83d', '\ude00', '\ud83d', '\ude02', '\ud83d', '\ude0d' ]

spread notation을 쓰면 해결된다.

s = "😀😂😍";
console.log([...s]); // [ '😀', '😂', '😍' ]

js의 code point와 code unit

How to slice or get symbols from a unicode string with emojis in JavaScript? Lets learn how JavaScript represent strings - DEV Community

여기에 unicode, UTF-16 등등에 대해 잘 설명되어 있음. 이해한 것을 요약하자면

  • code point는 하나의 문자를 나타냄.
  • 그런데 code point는 하나, 혹은 둘의 code unit으로 이루어짐.
  • js에서 string을 split('')하면 code unit으로 쪼갬! 그래서 string의 length가 글자 개수와 다르다.
  • spread notation으로 string을 array로 바꾸면 code point 단위로 쪼갬. 즉, length가 글자 개수와 같다.

2024. 08. 20

winform의 checked list box에서 아이템 체크시 한 번만 클릭해도 되도록

c# - Checked List Box requires me to select an Item twice - Stack Overflow

속성 중 동작에 있는 CheckOnClick값을 True로 설정.

nextjs에서 dynamic하게 metadata를 생성하기

Functions: generateMetadata | Next.js (nextjs.org)

app/.../[id]/page.tsx 같이 id값을 쓰는 페이지가 있으면 여기에 generateMetadata 함수를 넣어두면 된다. 사용 법은 위 링크에 나온 것을 복붙해서 상황에 맞게 변경하기만 해도 된다.

json-ld

거1지같은 JSON-LD (velog.io)

이 분 글 너무 웃기다...

사실 Site Names in Google Search | Google Search Central  |  Documentation  |  Google for Developers 여기에서 사이트 이름을 부여하는 방법을 보다가 json-ld라는 것을 처음 발견하고는 좀 더 검색해보다 찾은 것인데, json-ld는 이후에 좀 더 사용법을 찾아봐야겠다.

2024. 08. 21

C#에서 string의 마지막 글자만 잘라내고 싶을때

How to replace last character of the string using c#? - Stack Overflow

"123444".TrimEnd('4')를 하면 끝에 있는 4들을 전부 없애서 "123"이 되긴 하지만, 그래도 여러 상황에서 숏코딩 할때 유용하게 사용할 수 있을 것으로 보인다.

str = str[0..^1] + ",";

이것도 매우 유용해보임. TrimEnd보다 더 많은 상황에서 사용할 수 있을것 같다.

2024. 08. 22

python에서 return vs return None vs 아무 것도 리턴하지 않음

null - python: return, return None, and no return at all -- is there any difference? - Stack Overflow

의도 상의 차이.

  • return: break과 비슷한 의도. 함수의 결과값을 받아서 사용하지 않는 것이 좋다.
  • return None: None으로 리턴한 값을 이후에 사용하는 것이 의도.
  • 아무 것도 리턴하지 않음: 다른 언어에서 void 타입을 리턴하는 함수에 대응된다고 보면 된다. 여기서도 함수의 결과값을 받아서 사용하지 않는 것이 좋다.

react로 무한 스크롤 쉽게 구현하는 방법

Infinite Scroll with Next.js Server Actions: A Simple Guide | by Simon Ferlat | Medium

react-intersection-observer 패키지를 써서 무한 스크롤 구현.

2024. 08. 23

python shapely Polygon shell 실험

from shapely import Polygon

coords = ((0., 0.), (0., 1.), (1., 1.), (1., 0.), (0., 0.))
polygon = Polygon(coords)
print(polygon.area)  # 1.0

coords = ((0., 0.), (0., 1.), (1., 1.), (1., 0.))
polygon = Polygon(coords)
print(polygon.area)  # 1.0

coords = ((0., 0.), (0., 1.), (1., 1.), (1., 0.), (0., 0.), (0., 0.))
polygon = Polygon(coords)
print(polygon.area)  # 1.0

2024. 08. 24

gh에서 c# 컴포넌트로 BigInteger를 쓰려면

Text to number conversion of large numbers - Grasshopper (grasshopper3d.com)

System.Numerics.dll을 컴포넌트에 추가해주어야 한다. 단순히 위에 using System.Numerics를 더하는 것만으로는 작동하지 않음.

2024. 08. 25

python의 Protocol 클래스

typing — Support for type hints — Python 3.12.5 documentation

What is a Protocol in python? - DEV Community

원래라면 abstract 클래스를 써서 한 클래스가 다른 클래스를 직접 상속받도록 했을 것을, 이러한 직접 상속 없이 타입 체킹으로 비슷한 효과를 낼 수 있도록 한 것이라고 생각하면 편하다. 예를 들어, 다음과 같다.

# Protocol 클래스는 이렇게 정의했다.
class A(Protocol):
    def hi(self):
        pass

    def bye(self):
        pass

# B는 A를 상속받지는 않았으나 A가 들고 있는 함수를 들고 있다.
class B:
    def hi(self):
        print("hi")

# 어떤 함수가 있어서 A 타입의 객체를 받아서 작동.
def say_hi(x: A):
    x.hi()

# 위의 함수에 B 객체를 만들어서 넣는다.
say_hi(B())  # hi가 출력됨.

위의 상황에서 A에는 bye가 정의되어 있지만 B에는 정의되어 있지 않은 것을 볼 수 있는데, Protocol을 쓰면 이런 상황에서 문제가 없이 돌아가므로 주의. mypy같이 정적 타입 체킹을 해주는 툴에서는 이런 상황을 잡아준다는 것 같기도.

2024. 08. 26

pylint의 dangerous-default-value / W0102

dangerous-default-value / W0102 - Pylint 3.3.0-dev0 documentation (pycqa.org)

아래 상황이 예시로 나온다.

**Problematic code:**

def whats_on_the_telly(penguin=[]):  # [dangerous-default-value]
    penguin.append("property of the zoo")
    return penguin


**Correct code:**

def whats_on_the_telly(penguin=None):
    if penguin is None:
        penguin = []
    penguin.append("property of the zoo")
    return penguin


**Additional details:**

With a mutable default value, with each call the default value is modified, i.e.:

whats_on_the_telly() # ["property of the zoo"]
whats_on_the_telly() # ["property of the zoo", "property of the zoo"]
whats_on_the_telly() # ["property of the zoo", "property of the zoo", "property of the zoo"]

2024. 08. 27

Protocols and structural subtyping

Protocols and structural subtyping - mypy 1.11.2 documentation

크게 보면 덕타이핑에 대한 이야기. 잘 읽어보면 좋을듯하다.

2024. 08. 28

python의 range에 관하여

performance - Why is "1000000000000000 in range(1000000000000001)" so fast in Python 3? - Stack Overflow

재밌는 얘기들 많음. range는 generator가 아니고, 내부에 특수한 contains check가 가능한 함수가 구현되어 있는 sequence일 수 있다.

python의 range에는 왜 float을 쓸 수 없는가?

python - range() for floats - Stack Overflow

int만 썼을때 스펙상 유리한 점이 많아서 float을 range에 못 쓰게 된 것일 수도 있지 않을까?

python multi-line docstring

PEP 257 – Docstring Conventions | peps.python.org

multi-line docstring을 작성할때는 '''로 시작하는 첫 줄을 newline으로 띄워도 되고 아니어도 된다. docstring indentation을 처리할때 newline이 있는 것과 없는 것을 같은 것으로 취급한다는듯.

pandas docstring guide — pandas 2.1.2 documentation (pydata.org)

다만 pandas docstring guide처럼 첫 줄과 마지막 줄을 무조건 띄우는 것을 컨벤션으로 정해놓을 수도 있으니 상황에 따라 일관성을 유지할 것.

2024. 08. 29

pyproject.toml

pyproject.toml을 이용한 파이썬 패키징 (1) - setup.py의 문제 (bearpooh.com)

pyproject.toml을 이용한 파이썬 패키징 (2) - pyproject.toml의 등장 (bearpooh.com)

역사를 훑으며 setup.py 쓰는 것이 어떤 문제가 있는지 잘 정리되어있는 글.

github actions에서 private repo에 있는 패키지를 설치하기 위해 token 세팅하는 방법

Document How To Install Python Package from a Private Repo · Issue #104 · actions/setup-python (github.com)

여기에 victorsevero 코멘트 참고.

Just add
`git config --global url."https://${{ secrets.GH_TOKEN }}@github".insteadOf https://github`
at the beggining of your `run` step (before installing dependencies).

C# swap 내부 구현

Is a C# 7 tuple-based variable swap thread safe? - Stack Overflow

SharpLab

위의 링크에서 swap을 구현한 메소드를 IL로 바꾼 것을 볼 수 있다.

public static void Swap(ref int a, ref int b)
{
    int temp = a;
    a = b;
    b = temp;
}

->

.method public hidebysig static
    void Swap (
        int32& a,
        int32& b
    ) cil managed
{
    // Method begins at RVA 0x20c8
    // Code size 11 (0xb)
    .maxstack 2
    .locals init (
        [0] int32 temp
    )

    IL_0000: ldarg.0
    IL_0001: ldind.i4
    IL_0002: stloc.0
    IL_0003: ldarg.0
    IL_0004: ldarg.1
    IL_0005: ldind.i4
    IL_0006: stind.i4
    IL_0007: ldarg.1
    IL_0008: ldloc.0
    IL_0009: stind.i4
    IL_000a: ret
} // end of method C::Swap
public static void TupleSwap(ref int a, ref int b)
{
    (a, b) = (b, a);
}

->

.method public hidebysig static
    void TupleSwap (
        int32& a,
        int32& b
    ) cil managed
{
    // Method begins at RVA 0x20e0
    // Code size 13 (0xd)
    .maxstack 2
    .locals init (
        [0] int32,
        [1] int32
    )

    IL_0000: ldarg.1
    IL_0001: ldind.i4
    IL_0002: stloc.0
    IL_0003: ldarg.0
    IL_0004: ldind.i4
    IL_0005: stloc.1
    IL_0006: ldarg.0
    IL_0007: ldloc.0
    IL_0008: stind.i4
    IL_0009: ldarg.1
    IL_000a: ldloc.1
    IL_000b: stind.i4
    IL_000c: ret
} // end of method C::TupleSwap

2024. 08. 30

github action으로 pytest 돌리기

[3-4] github action으로 CI 파이프라인 구축하기 (tistory.com)

참고할만한 자료.

ci: use get-changed-files for GitHub Actions CI by Jolg42 · Pull Request #6612 · prisma/prisma

새로 수정된 파일 기반으로 테스트 돌리도록 하는 것도 가능하다.

2024. 08. 31

이전 페이지