Skip to content

Instantly share code, notes, and snippets.

@dfdgsdfg
dfdgsdfg / readme.md
Last active April 13, 2026 01:27
프로그래밍과 논리

저도 잘쪼개고, 잘 붙이기 위해 노력합니다. 대충 이런식이네요

  • 점과 선으로 그래프 구조의 논리식을 세운다
    • 이 때 그래프는 프로그램이 자신을 참조하거나 입력으로 받는 람다식의 특성상 순환구조가 나타나게 된다
    • 이 때 그래프의 어떤 부분은 유향 비순환이고, 이것들은 대부분 쉽게 검증할수 있다. 그렇기에 이 것들을 최대한 끼고 살아야 한다
  • 클린아키텍쳐, 의존성 역전, 구상보다는 추상에 의존하기 등등 수단과 방법을 가리지않고 부분을 유향비순환으로 격리, 즉 "잘 쪼개고"를 한다
    • 이때 큰 구조는 최대한 단방향 의존성을 만들어 최대한 순환참조를 배제한다. 루프는 최대한 부분구조에 둔다
    • 하지만 화면에 그림을 그리는 컴퓨터 구조는 기본적으로 이미 루프이다. 계속해서 화면을 뿌리는동안 사용자 입력을 중간중간 끼워넣고 컴퓨테이션 하는 식이다. e.g. 게임 루프
    • 마찮가지로 동시성을 흉내내기위한 시분할이라던지, 비동기 연산등 컴퓨터, OS, 프로그래밍 언어 런타임등도 이벤트 루프등 루프를 활용한다
  • 이렇게 제공되는 환경은 어쩔 수 없으니 그 외에 순환구조를 해야만 한다면, 자료구조 자체를 불변구조로 사용해서 최대한 정보를 가역적으로 유지한다. 정보에 대한 컴퓨테이션이 특히 루프에서 비가역적일경우 디버깅은 지옥으로 빠진다. react.js, flutter, swift ui 등 많은 현대 ui 라이브러리에서 이런 방식이 사용된다
@dfdgsdfg
dfdgsdfg / readme.md
Last active April 13, 2026 01:28
프로그래밍과 논리
  • 이제 우리는 타입에 값을 넣는 행위 자체가 증명임을 알게됬다
    • 수학자는 연역적으로 명제를 다루지만, 개발자는 요구사항을 구성하여 증명한다
  • 여전히 수학에서 증명과 프로그래밍이 증명이라는 관점 사이에 여전히 거리감을 느낀다
    • 이를테면, 내 상상속에 수학 증명은 모든 x 에 대해 보장한다. 모든 짝수x는 2로 나누어 떨어진다
  • 하지만, 프로그래밍이, 내가 만든 어떤 논리식을 0과 1로 환원된 컴퓨테이션을 통해 증명하여, 런타임에서 죽지않는것을 보장하는 일이라면, 왜 어떤 입력 x에 대해서만 보장받고, 모든 입력 x에 대해서는 보장 받을수 없을까?
    • 단순한 유닛테스트의 경우 어떤 x를 논리식에 직접 대입하여 증명한다. 어떤 x가 모든 x임을 보장할수 있는가?
  • int, float, double 은 32bit, 64bit 의 한계에 묶여있다. 이것 자체가 모든 R, Z, N 집합에 보장되는 연산을 할 수 없다
    • float, double이 유한 개의 2의 거듭제곱 분모 집합으로 R을 모사하는 방식이기에 이 비유는 애초에 잘못된것이긴 하지만, 넘어가자
  • 우리는 타입과 컴파일러를 통해 특정 지역공간에서 모든 x를 보장받는다
  • 그리고-곱타입(class, struct, tuple), 또는-합타입(enum, sealed, union) 을 만들어서 단일 개체에 대한 참/거짓, 정합을 컴파일러의 도움을 받는다
@dfdgsdfg
dfdgsdfg / main.dart
Last active August 18, 2023 09:04
Flutter CJK underline bug workaround
// This code is distributed under the MIT License.
// Copyright (c) 2019 Remi Rousselet.
// You can find the original at https://github.com/rrousselGit/provider.
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
// This is a reimplementation of the default Flutter application
// using provider + [ChangeNotifier].
void main() {

JS에 커링이 과연 얼마나 잘어울리냐하는 흥미로운 논의가 꽤 있었는데요,

대표적으로 포문을 연 Brian Lonsdorf 의 Hey Underscore, You're Doing It Wrong! 이 있죠. https://www.youtube.com/watch?v=m3svKOdZijA https://www.slideshare.net/drboolean/underscore-18211797

사실 로다쉬나 언더스코어/백본을 통해 막 함수형의 장점이 아카데믹이 아닌 커뮤니티에도 받아들여지고 있었는데 이때부터 커링이라든지, 람다JS나 Fantasy Land등 나름 함수형 고급 주제들이 실 개발자에게도 받아들이기 시작된거 같아요

아무튼, 실질적으로 좀더 살펴볼 거는 알렉스의 Currying is not idiomatic in JavaScript 인데, 커링의 대안으로 어차피 커링이 파셜 애플리케이션에서 쓸거니 bind(null, target)과 같이 bind를 응용하거나 bind(null, target)의 신타스틱 슈거를 만드는 방안등이 논의되긴 했지요. http://2ality.com/2017/11/currying-in-js.html

### Keybase proof
I hereby claim:
* I am dfdgsdfg on github.
* I am dididi (https://keybase.io/dididi) on keybase.
* I have a public key whose fingerprint is D0D3 959B 60B8 5953 605A 0EED 3B6E FDE9 1892 F7E4
To claim this, I am signing this object:
Verifying my Blockstack ID is secured with the address 1NyB9pZbKtpDZLKekBJBU83gE1yJ5fdhFu https://explorer.blockstack.org/address/1NyB9pZbKtpDZLKekBJBU83gE1yJ5fdhFu
@dfdgsdfg
dfdgsdfg / md2docx.sh
Last active February 28, 2019 03:21
Pandoc md to docx every file in folder bashshell
#!/usr/bin/env bash
echo "=========================="
echo "YOU NEED TO INSTALL PANDOC"
echo "=========================="
SRC_DIR='./src'
DIST_DIR='./dist'
files=($(find ${SRC_DIR} -type f -name '*.md'))
@dfdgsdfg
dfdgsdfg / readme.md
Last active January 7, 2019 01:46
closure is capable

https://news.ycombinator.com/item?id=18767592 http://ahungry.com/blog/2018-12-26-Clojure-is-Capable.html

  • 클로저 좋았다. 하지만 큰 프로젝트에 결국 스칼라씀. 타입없이 큰 시스템을 운영 못하겠음
    • -클로저 몇년간 프로덕션에서 사용했음
      • 클로저 스팩 리팩토링 QA에 좋음. 꼭 써라
      • 매크로는.. 왠만하면 쓰지말자. 강력하다는거 나도 알아
      • Homoiconicity, 코드가 데이터는 어떤 랭귀지에서도 좋지
      • 타입? 클로저에서 필요하며 만들어 쓰고 있다. > 78 digits long string type
@dfdgsdfg
dfdgsdfg / readme.md
Created December 28, 2018 04:13
바닐라 자바스크립트에서 함수형

흐흐흐 바닐라 자스에서 언어에 순응하는? 함수형 해보겠다고 여기 저기 기웃거렸는데, 결과적으로 하스켈식은 안되고, 동적 타입인 클로저에 프렉틱스를 많이 보는걸로 결론을.. 리치하키 아저씨한테 한표 겁니다. 거기에 자스의 이터레이터, 제네레이터를 좀더 활용하면서 지연평가도 흉내내고 프로미스 에이싱크 어웨잇으로 비동기도 처리하고 합성하고 이뮤타블 자료형 쓰고 디스 피하고 이정도가 바닐라 자스에서 최선으로 보이네요 거기에 펑셔널 리엑티브를 위해 스트림 정도만 사용하면 바닐라 자스에서 할수있는건 다 한듯. rxjs도 아니고 요렇게 아예 콜백을 기반으로 간단한 스트림 정도 있으면 https://github.com/staltz/callbag-basics

좀더 기대한다면 표준에 추가되는 파이프 오퍼레이터나 옵져버블 이런건데 그건 표준 들어오는거 보면서 해도 될듯하고요 하스켈식으로 하려면 이런게 있긴한데.. 런타임 비용도 높고, 컴파일에 뭐 잡아주는것도 아니고.. 동적언어에서 이렇게 까지?? 싶은..

이런류같이 dev 모드에서는 object.freeze로 얼리고 prod에서는 그냥 생짜로 쓰는 형태로 어느정도 흉내내는게 제일 나은거 같더라고요 아니면 js proxy를 사용한 요런거요