i5 맥북프로 macOS Ventura에서 ubuntu:22.04 도커 이미지를 이용해 개발 환경을 세팅하였습니다. 그런데 다음 명령어를 실행해 qemu 에뮬레이터를 실행했을 때 다음과 같은 에러메시지가 발생합니다. 오류 1: ALSA lib confmisc.c ... qemu-system-arm -M realview-pb-a8 -kernel navilos.axf -S -gdb tcp::1234,ipv4 ALSA lib confmisc.c:767:(parse_card) cannot find card '0' ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or direct..

소프트웨어가 먼저인가, 아니면 하드웨어가 먼저인가? 컴퓨터가 어떻게 작동하는지 알고있다면 하드웨어가 먼저라고 얘기해볼 수 있다. CPU, 메모리 시스템이 없으면 현존하는 거의 모든 소프트웨어는 사용할 수가 없기 때문이다. 현대의 소프트웨어는 하드웨어의 존재를 가정하고 돌아간다. 멀리 생각하지 않아도 이 사실을 알 수 있다. IT에 관심이 있다면 애플이 M시리즈 칩을 내놨을 때 소프트웨어가 호환되지 않아 사용할 수 없다는 이야기를 많이 들었을 것이다. 소프트웨어가 인텔 CPU의 x86 구조를 가정하고 있기 때문에 ARM이 개발한 M시리즈 칩에서는 사용할 수 없던 것이다. 따라서 결론은? 하드웨어가 없으면 소프트웨어는 있을 수가 없다. 따라서 하드웨어가 먼저다. 그렇지만 따지고보면 소프트웨어가 없는 하드웨어..

WSGI의 탄생 PEP 3333 – Python Web Server Gateway Interface v1.0.1 | peps.python.org 파이썬 초창기에 다양한 웹 프레임워크가 등장했다. (Zope, Webware, SkunkWeb, ...) 지금의 상황과 다르지 않게 파이썬 프로그래머들은 웹 어플리케이션을 작성하기 위해 웹 프레임워크를 선택해야 했는데, 문제는 웹 프레임워크와 웹 서버 사이에 표준이 존재하지 않았다. 결국 선택한 웹 프레임워크가 사용하는 웹 서버만 사용할 수 있는 문제가 발생했다. (반대로도, 웹 서버를 선택하면 선택할 수 있는 웹 프레임워크의 폭이 크게 줄었다.) 이 문제를 해결하기 위해 파이썬 커뮤니티는 웹 서버와 웹 프레임워크 사이에 간단하면서도 모두를 아우를 수 있는 인터..
Python은 정적 타입 시스템이 없는 인터프리터 언어입니다. 그리고 주류 언어들과 비슷하게 개체 지향(객체 지향, object-oriented) 언어입니다. 그래서 Python에서는 모든 것은 개체입니다. C#, Java와 같은 개체 지향 언어에서도 개체를 중요하게 생각하고, 프로그램의 디자인의 기본 단위를 개체로 둡니다. Python의 오브젝트와 C#, Java의 오브젝트는 무엇이 다른 걸까요? len() vs. Length 만약 C#(혹은 Java)에서 콜렉션의 길이를 구하려면 어떻게 해야할까요? C#이라면 클래스에서 Length나 Count같은 속성(Property)를 정의해 놓았을겁니다. 그래서 x.Length 처럼 길이를 구해야합니다. Python의 경우는 조금 다릅니다. len(x)로 모든 ..

프림 알고리즘은 Minimum Spanning Tree을 구하는 알고리즘이다. Minimum Spanning Tree (MST)는 그래프를 덮으면서 (spanning) 비용이 가장 적은 (minimum) 트리다. 여담으로 최소비용 신장트리라는 말도 있는데, 말이 너무 어렵다. 최소비용 덮는트리 정도가 적당하지 않을까 생각한다. 프림 알고리즘은 그리디(greedy) 알고리즘이다. MST를 구성하는 노드를 고를 때, 프림 알고리즘은 항상 최선의 선택을 한다. 여기서 최선의 선택이란 항상 비용이 가장 적은 노드를 선택하는 것을 말한다. 그리고 비용이 가장 적은 노드를 구하기 위해서 최소 힙을 사용한다. Python 구현 V를 노드(Node, or Vertex) 리스트, s를 시작 노드라 하자. 각 노드는 인접..

문제 가설 매우 크고 복잡한 JSON 데이터가 있다고 하고, 이 JSON 데이터 중에서 필요한 것은 전체 데이터 크기에 비해 작다고 해봅시다. 이 경우 전체 JSON 문자열을 JSON 데이터로 파싱한 후, 데이터를 탐색하는 것은 계산자원 낭비가 있습니다. 왜냐하면, 메모리가 어떻게 사용되는지 생각해보면, JSON 문자열을 메모리 공간으로 불러오고 JSON 문자열을 읽으면서, 파싱하면서 해당하는 JSON 값을 생성합니다. (동적 메모리 할당) 그럼 JSON 문자열 + 생성된 JSON 구조만큼의 메모리를 써야합니다. 게다가 실행 중에 동적 메모리 할당이 일어나서 성능에 좋지 않습니다. (동적 할당은 아주 비쌉니다) 요즘엔 비동기 구현이 널리 사용되면서 한 프로세스의 메모리 공간(가상 메모리)을 공유하는 경우..
2023 봄학기 정보보호개론의 세 번째 과제입니다. 두 소수의 범위가 최대 2 ** 16으로 제한된 상황에서, RSA의 키 생성, 암호화, 복호화, 그리고 크랙을 구현해야 합니다. 키 생성은 에라토스테네스의 체, 크랙은 페르마 인수분해 공격법을 사용하면 빠른 코드를 작성할 수 있습니다. 이 글에서 소개할 내용은 구현을 하며 놓쳤던 부분들을 되짚어가며 최적화한 코드들입니다. 과제는 OCaml 코드로 작성해야 하는데, 다음 학기 치팅을 방지하기 위해서 Python 코드로 바꿔 설명했습니다. 그래서 Idiomatic Python이 아니더라도 적당히 이해해서 넘어가주시길. 메모리 할당 없애기 개선 전 코드 def choose_e(phi: int) -> int: es = [e for e in range(2, ph..

제목에 낚였다면 미안합니다. 최근 레딧과 트위터가 O(1) 시간 안에 소수를 판별하는 함수를 구현했다는 트롤로 떠들썩했다. 한 줄짜리 아주 간단한 함수인데, 항상 입력된 정수가 소수가 아니라고 반환한다. 모든 경우에 소수가 아니라고 하니 완전히 틀린 구현이잖아! 라고 생각할 수 있다. 그런데 정말 그럴까? 어떤 수가 커질수록 소수일 확률은 작아진다. 실제로 Prime Number Theorem에 따르면 어떤 수보다 작은 소수의 개수는 n / log n 으로 근사할 수 있다. 그렇다면 이 함수의 정확도는 100 - ((n / log n) / n) * 100 = 100 - (100 / log n) 가 되는데. n이 커짐에 따라 정확도가 100으로 수렴한다 (...) 이것이 의미하는 것은 테스트셋이 커질수록 ..
- Total
- Today
- Yesterday