Open arch-spatula opened 1 month ago
Why You Struggle to Follow Through (Thinkers vs Doers)
https://www.youtube.com/watch?v=xSBGYoS6z68
https://github.com/utmapp/UTM/
의외로 설치는 직관적이었습니다.
docker run -it nixos/nix
# shell.nix 설정을 위해 설치
nix-shell -p git neovim
nvim shell.nix
shell.nix
에 의존하는 CLI를 추가하니까 이제는 LSP가 동작합니다.console.trace
를 라이브러리 코드에서 실행해보려고 node_modules를 편집했습니다.
console.trace
가 찍히지 않았습니다. 이것은 HMR이 반응할 때 node_modules내의 변화까지 감지하는 것은 비효율적이라 이렇게 처리한 것으로 추측됩니다.vite dev
로 실행하고 있던 web server 를 껐다가 다시 켜보니까 node_moduels 내에 수정했던 console.trace
이 찍혔습니다.parseInt('2,500') // 2
https://www.hanbit.co.kr/store/books/look.php?p_code=B8068754595
https://www.hanbit.co.kr/store/books/look.php?p_code=B5813900488
https://www.hanbit.co.kr/store/books/look.php?p_code=B3301714641
import
는 바로 제거하는 것을 권장합니다.
__dirname
이 현재 파일 이름입니다. 이 파일이름은 파일에 해당하는 즉시실행함수의 매개변수라서 접근이 가능합니다.https://developer.mozilla.org/en-US/docs/Web/API/Navigator/clipboard
애매하지만 [[Typescript]]로 분류합니다.
navigator.clipboard.writeText('클립보드에 저장할 텍스트')
위처럼 작성하면 클립보드 데이터를 접근할 수 있습니다.
https://goorm-sans.goorm.io/?utm_source=community&utm_medium=social&utm_content=eoplanet
string literal
이 더 유리함const foo = ref(true);
const bar = ref(false);
const baz = ref(false);
위처럼 선언하고 호출이 발생하는 지점마다 개별로 플래그 컨트롤하면 가독성과 제어 측면에서 불리합니다.
const onBazClick = () => {
foo.value = false;
bar.value = false;
baz.value = true;
};
위처럼 작성하면 무엇을 키고 무엇을 끄는지 자세히 확인해야 합니다. 지금은 onBazClick
를 살린다는 것을 알 수 있습니다.
위와 비슷한 코드가 5개 정도 있습니다. 더 직관적인 방법은 string literal
을 사용하고 어디로 바뀌는지 보여주는 것입니다.
type ShowType = 'foo' | 'bar' | 'baz';
const show = ref<ShowType>('foo');
const changeShow = (showType: ShowType) => {
show.value = showType;
};
위처럼 선언하면 무엇을 변경하고 살릴지 더 선언적으로 제어할 수 있습니다.
const onBazClick = () => {
changeShow('baz');
};
이전에 본 코드는 이렇게 1줄로 정리됩니다.
조금더 생각해보면 플래그 컨트롤할 때는 true, false로 제어하는 것보다 상태를 명시하는 것이 좋습니다.
type PageType = 'list' | 'detail'
리스트 페이지, 상세 페이지 모달이 보이고 안보이고로 URL 변화 없이 제어해야 하는 상황이면 이런 것이 더 유리할 것입니다.
Testxxx
로 명명해야 합니다. 그래야 테스트합니다. 대소문자 구분이 중요합니다.package main
import "testing"
func testHello(t *testing.T) {
got := Hello("Jake")
want := "Hello, Jake!"
if want != got {
t.Errorf("want %q, gate %q", want, got)
}
}
testing: warning: no tests to run
이런 메시지를 터미널에 출력하게 될 것입니다.package main
import "testing"
func TestHello(t *testing.T) {
got := Hello("Jake")
want := "Hello, Jake!"
if want != got {
t.Errorf("want %q, gate %q", want, got)
}
}
func TestHello(t *testing.T) {
t.Run("saying hello to people", func(t *testing.T) {
got := Hello("Jake")
want := "Hello, Jake"
assertCorrectMessage(t, want, got)
})
t.Run("say 'Hello, world' when empty string is supplied", func(t *testing.T) {
got := Hello("")
want := "Hello, world"
assertCorrectMessage(t, want, got)
})
}
func assertCorrectMessage(t testing.TB, want, got string) {
t.Helper()
if want != got {
t.Errorf("want %q, gate %q", want, got)
}
}
t.Helper
은 인터페이스에서 제공하는 함수입니다. 이미 호출하는 부분부터 주소로 전달 받기 때문에 또 주소로 받겠다고 할필요가 없습니다.https://kciter.so/posts/principles-of-debugging/
https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/pointers-and-errors
https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events
https://news.hada.io/topic?id=16105&utm_source=slack&utm_medium=bot&utm_campaign=T056MP5374J
https://news.hada.io/topic?id=16082&utm_source=slack&utm_medium=bot&utm_campaign=T056MP5374J
https://github.com/floating-ui/floating-ui/blob/master/pnpm-workspace.yaml
https://github.com/CYBERGEM777/HIDEAGEM
888 888 8888888 8888888b. 8888888888 d8888 .d8888b. 8888888888 888b d888
888 888 888 888 "Y88b 888 d88888 d88P Y88b 888 8888b d8888
888 888 888 888 888 888 d88P888 888 888 888 88888b.d88888
8888888888 888 888 888 8888888 d88P 888 888 8888888 888Y88888P888
888 888 888 888 888 888 d88P 888 888 88888 888 888 Y888P 888
888 888 888 888 888 888 d88P 888 888 888 888 888 Y8P 888
888 888 888 888 .d88P 888 d8888888888 Y88b d88P 888 888 " 888
888 888 8888888 8888888P" 8888888888 d88P 888 "Y8888P88 8888888888 888 888
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▄ ____ ______ ____ ▄ ▄
█ / / \ \ HIDEAGEM STEGANOGRAPHY PLATFORM █ . . █
█ /___ /________\ ___\ █ .-. .-. '.___.' █
█ \ \ / / ASTRAL SOFTWARE FROM THE FUTURE █ (_ \ / _) .' `. █
█ \ \ / / █ | : : █
█ \ \ / / COPYRIGHT 2024 WWW.CYBERGEM.NET █ | : : █
█ \ \ / / █ | `.___.' █
█ \/ LET'S DO COMPUTER STUFF ALL DAY █ █
█ █ █
█ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ._____. .--. █
█ MMMMMSSSSSSSSSSSSSSSSSSSSSSSSSSddMMMMMSSSSSSMSSSSSSSSSS; █ | | / _`. █
█ MMMMSSSSSSSSSSSSSSSSSMSSSSS; ;SSdMMMMSSSSSSMMSSSSSSSSSS, █ | | (_) ( ) █
█ MMSSSSSSSMSSSSSMSSSSMMMSS."-.-":MMMMMSSSSMMMMSSMSSSMMSS █ _|_|_ '. / █
█ MSSSSSSSMSSSSMMMSSMMMPTMM;"-/\":MMM^" MMMSSMMMSSMM █ ' ' `--' █
█ SSSSSSSMMSSMMMMMMMMMP-.MMM : ;.;P dMMMMMMMMMP' █ █
█ SSMSSSMMMSMMMMMMMMMP :M;`: ;.'+"""t+dMMMMMMMMMMP █ _ █
█ MMMSSMMMMMMMMPTMMMM"""":P `.\// ' ""^^MMMMMMMP' █ .--. ' `:--.--. █
█ MMMMMMPTMMMMP="TMMMsg, \/ db`c" dMMMMMP" █ ( ) | | |_ █
█ MMMMMM TMMM d$$$b ^ /T$; ;-/TMMMP' Let's █ (_) / | | | ) █
█ MMMMM; .^`M; d$P^T$$b : $$ ::MMMMP hide some █ (_, | | |/ █
█ MMMMMM .-+d$$ $$$; ;. $$ ;;MMMP, Gems ! █ (J █
█ MMMMMMb _d$$$ $$$$ :$$$; :MMMMMMp. █ █
█ MMMMMM" " T$$$._.$$$; T$P.'MMMSSSSSSb █ _ █
█ MMM`TMb -")T$$$$$$P' `._ "" :MMSSSMMP' █ __ ' `:--.--. █
█ MMM / \ ' "T$$P" / :MMMMMMP' █ ___.' '.___ | | | █
█ MMSb`. ; " :MMMMMM' █ ____________ | | | █
█ MMSSb_lSSSb. .___. MMMMMP ,d88b.d88b, █ | | | .., █
█ MMMMSSSSSSSSb. .MMMMMM. 88888888888 █ `--': █
█ MMMMMMMMMMMSSSb .dMMMMMMMP `Y8888888Y' █ █
█ MMMMMMMMMMMMMSS; .dMMMMMMMMMM' `Y888Y' █ ... _ █
█ MMMMGEMMAMMMMb`;"-. .dMMMMMMMMMMP' `Y' █ .': \ /_) █
█ MMMMMMMMMMMMMMb: `'--.___.dMMMMMMMMMPP' █ .' \ /`. █
█ MMMMMMMMMMMMMMMb; dMMMMMMMMPPR █ `..' \ / ; █
█ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ █ .'`. \/ __.' █
█ █ █
█ ░░░░░░░░ ▒▒▒▒▒▒▒▒ ░░░░░░░░ █ █
█ ▓▓▓░░ ████████ ███▒▒ ▓▓▓▓▓▓▓▓ ▓▓▓░░ ████████ █ `-. .-' █
█ ▒▒▒▓▓ ░░ ██ ▒▒▒▒▒▒░░░██ ▒▒ ▓▓ ░░░░░░▒▒▒▓▓ ░░ ██+§¥µ██ █ .-"-._.-"-._.- : : █
█ ███▒▒ ▓▓ ░░░██ ▒▒ ▓▓▓░░ ██ ▒▒▒▓▓ ░░ ███▒▒ ▓▓ ░░░██$@¢¶██ █ .-"-._.-"-._.- --:--:-- █
█ ██ ▒▒ ▓▓▓▓▓▓███▒▒ ▓▓ ░░ ██████▓▓▓░░ ██ ▒▒ ▓▓▓▓▓▓████████ █ : : █
█ ██ ▒▒▒▒▒▒▒▒ ▒▒▒▓▓ ░░░░░░░░ ░░░██ ▒▒▒▒▒▒▒▒ █ .-' `-. █
█ ████████ ▓▓▓▓▓▓▓▓ ████████ CYBERGEM █ █
▀ ▀ ▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
https://blog.codingconfessions.com/p/simultaneous-multithreading
https://news.hada.io/topic?id=16164&utm_source=slack&utm_medium=bot&utm_campaign=T056MP5374J
https://news.hada.io/topic?id=16174&utm_source=slack&utm_medium=bot&utm_campaign=T056MP5374J
역사와 전통의 Yacc, Bison 이런 것들을 파서 제너레이터라고 부릅니다.
출력으로 파서를 생성하는 도구라고 합니다.
출력물이 코드입니다. 컴파일, 인터프린트 가능한 코드입니다. 피서 그자체가 구문 트리를 생성하는 입력 소스 코드도 제공됩니다.
문맥 무관(Context Free Grammar, CFG)를 사용합니다. 배커스-나우어 표기법(Backus-Naur Form, BNF), 확장된 배커스-나우어 표기법(Extended Backus-Naur Form, EBNF)이 있습니다. 존 배커스, 피터 나우어가 창안 했습니다.
파서 제너레이터는 상용 언어를 구현할 때는 사용하지만 학습용으로는 직접 파싱 기능을 구현할 것을 권장합니다.
go test ./parser > testoutput.txt
testoutput.txt
같은 파일은 .gitignore
할 것을 권장합니다. 디렉토리 노출도 문제이고 자주 바뀌는 내용이라 커밋에 안 올라가는게 좋을 것 같습니다. 하지만 이런 파일을 각자 로컬에 갖고 있으면 유용할 것 같습니다.
터미널에 로그가 너무 길게 찍힌 이유는 알고 보니까 재귀 오류가 있었습니다.
https://github.com/PLTEAM1/lisp-interpreter
위랑 같은 것이 정상적인 프로그래머의 실력입니다.
이제는 시작해야 할 것 같습니다. 오늘 회사에서 사용하는 wsl 운영체제 패키지를 설치하는 방법을 알아냈습니다.
우리나라 정서에 상당히 안 맞습니다. 이직 준비를 시작하면 숨겨둘 것입니다. 하지만 이직 준비를 안 하는 동안에는 공개할 것입니다. 우리나라 정서에 상당히 거부감이 강한 이유는 window 감성 터지는데 그것돋 MS-Dos로 돌아가야 한다고 외치는 이상한 사람들이 흘러 넘칩니다. 물론 제가 이상한 사람이라는게 우리나라 현실입니다.
lua, neovim, nix를 다루면서 문서를 분리할 필요가 생긴 것 같습니다.
:e
으로 버퍼를 초기화할 수 있습니다. lsp, git 표시 등을 초기화할 수 있습니다.https://github.com/kitasuke/monkey-go
정답 레포가 있습니다. 이 레포를 보니까 인터프리터 1권과 컴파일러 2권 모두 다루기 위해 하나의 레포에서 작업한 것이 보입니다.
저도 흉내를 내야겠습니다.
go test -count=1 ./...
func buildBinary() (string, error) {
binName := randomString(10) + "-" + baseBinName
build := exec.Command("go", "build", "-o", binName)
if err := build.Run(); err != nil {
return "", fmt.Errorf("cannot build tool %s: %s", binName, err)
}
return binName, nil
}
빌드 등 명령하기
dir, err := os.Getwd()
if err != nil {
return nil, nil, err
}
cmdPath := filepath.Join(dir, binName)
cmd := exec.Command(cmdPath)
실행파일 실행
os.Remove(binName)
파일 삭제 명령
ls | pbcopy
pbcopy
이 클립보드로 복사하게 해줍니다.
https://stackoverflow.com/questions/1753110/how-do-i-capture-bash-output-to-the-mac-os-x-clipboard
별거 아닌 것 같아도 삶의 질을 높이는 지식입니다.
console.trace
를 자주 사용하는데 go 언어에도 이런 비슷한 기능이 있는지 궁금했습니다.https://github.com/cipepser/monkey/blob/master/parser/parser_tracing.go
package name
import (
"fmt"
"strings"
)
var traceLevel int = 0
const traceIndentPlaceholder = "\t"
func indentLevel() string {
return strings.Repeat(traceIndentPlaceholder, traceLevel-1)
}
func tracePrint(fs string) {
fmt.Printf("%s%s\n", indentLevel(), fs)
}
func incIndent() {
traceLevel = traceLevel + 1
}
func decIndent() {
traceLevel = traceLevel - 1
}
func trace(msg string) string {
incIndent()
tracePrint("BEGIN " + msg)
return msg
}
func untrace(msg string) {
tracePrint("END " + msg)
decIndent()
}
func functionName() {
defer untrace(trace("functionName"))
}
go test -v -run TestOperatorPrecedenceParsing ./parser > testoutput.txt
글쓰기 주제
참고할 자료