Author: byun1114

  • 역슬래시 제거

    PostgreSQL에서 자료를 copy로 불러올 때 역슬래시가 들어가면 심각한 오류가 생긴다. escape 문자와 혼동이 되기 때문이다. 일부 테이블이 너무 크기가 작아서 확인해보니 아무래도 역슬래시와 관련되어 자료가 제대료 import 안된 것 같았다. 구글 검색을 해보니 제일 좋은 방법은 역슬래시 한 개를 두 개로 바꾸어 주는 것이다. 이를 해결하는 가장 편한 방법은 리눅스 sed를 이용하는 것이다. 역슬래시 문자가 있다면 용량이 조금 커지고, 없다면 동일한 용량의 파일이 생성된다.

    sed -e 's/\\/\\\\/g' a.csv > b.csv

    https://www.postgresql.org/docs/12/sql-copy.html

  • 정치학, 아리스토텔레스, 천병희 역

    서양 철학에서도 국가를 다루는 것이 있었다. 아리스토텔레스가 살았던 시기와 현재는 약 2400년 정도 간격이 있다. 유명한 철학자들의 출생년도를 비교해 보면 공자가 기원전 551년 정도 출생, 아리스토텔레스 기원전 384년, 한비자 기원전 280년 정도. 비슷한 시기라고 주장하면 비슷한 시기가 된다. 중국 못지 않게 고대 그리스도 수 많은 정치 체제가 존재하였으며, 그러한 정치 체제가 여러번 바뀌었다. 그 과정을 검토한 작품이라고 이해하면 되겠다. 이 책에서는 ‘정체’라는 표현이 지속적으로 등장한다. 처음에는 무슨 말인지 모르겠다가, ‘정치 체제’ 정도로 이해하면 될 것 같았다. 인상 깊은 구절은 다음과 같다.

    • 3권 1장
      의결권과 재판권에 참여할 권리가 있는 사람은 누구나 그 나라의 시민이다. 그리고 국가는 간단히 말해 자족한 삶을 영위하기에 충분할 만큼 많은 수의 시민들로 구성된 단체다.
    • 3권 5장
      시민에는 여러 종류가 있다는 것이고, 다른 하나는 국가의 공직에 참여하는 자들이야말로 진정한 의미의 시민이라는 것이다.
    • 3권 6장
      공공의 이익을 추구하는 정체는 절대 정의의 기준으로 판단하건데 올바른 정체고, 치자들의 개인적인 이익만 추구하는 정체는 모두 잘못된 것이고 올바른 정체가 왜곡된 것이다.
    • 3원 9장
      국가의 목적은 훌륭한 삶이며, 앞서 말한 것들은 이 목적을 위한 수단이다. 국가는 완전하고 자족적인 삶을 위한 씨족들과 마을들의 공동체다. 그리고 완전하고 자족적인 삶이란 행복하고 훌륭하게 사는 것을 뜻한다.
    • 3권 12장
      모든 학문과 기술의 궁극적인 목적은 좋음이다.
    • 4권 4장
      자유민의 최고 권력을 가지면 민주 정체고, 부자들이 최고 권력을 가지면 과두 정체라고 해야할 것이다.
    • 5권 1장
      여러 정체가 생겨난 것은 정의가 비례적 평등에 있다는데 다들 동의하면서도, 앞서 말했듯이 그것을 성취하는데 실패하고 있다는 점이다.
    • 5권 4장
      간과해서는 안 될 점은, 시민이든, 공직자든, 부족이든, 국가의 어떤 부분이나 집단이든 대게 국가를 더 강하게 해준 자들이 파쟁을 꾀한다는 것이다. 그리고 파쟁이 시작되는 것은, 이들이 얻은 명예를 남들이 시기하기 때문이거나, 아니면 이들이 자신들은 우월하다고 여겨 남들과 동등한 대접을 받는 것으로 만족하지 못하기 떄문이다.
      그러나 정체는 때로는 힘에 의해, 때로는 기만에 의해 바뀌곤 하는데, 힘은 처음부터 사용되거나 나중에야 사용된다. 기만도 두 가지가 있다. 그 중 한 가지는 처음에 시민들을 기만하여 그들의 동의를 얻어 정체를 바꾼 다음 나중에는 시민들의 의사에 반해 바뀐 정체를 유지하는 것이다. 다른 한 가지는 처음부터 민중을 설득하고 나중에도 설득을 되풀이하여 민중의 동의를 얻어 민중을 통치하는 것이다.
    • 5권 8장
      잘 혼합된 정체에서는 무엇보다도 시민들이 불법 행위를 하지 않도록 감시해야 하며, 특히 사소한 범범 행위를 경계해야 한다. 불법 행위는 부지불식간에 기어들어와 나라를 망치기 때문이다.
      정체를 염려하는 자들은 공포감을 불러일으킴으로써, 시민들이 정체를 지키느라 경계하여 야경꾼들처럼 경각심을 늦추지 않게 해야 한다. 한 마디로 멀리 있는 위험 요소가 가까이 있는 것처럼 보이게 해야 한다.
      입법이나 다른 제도를 통하여 공직을 재산 축재 수단으로 삼지 못하는 하는 것이다.
      공직자가 다른 방법으로 이익을 추구하지 않도로그 법이 평판 좋은 공직자들에게는 명예를 부여하도록 보장해야 한다.
      민주 정쳬에서는 부자들을 아껴주여야 한다.
    • 5권 9장
      국가의 요직에 취임할 자들은 세 가지 요건을 갖추어야 한다. 첫째, 기존 정체에 충성심이 있어야 하고, 둘째, 업무를 수행할 수 있는 고도의 능력을 갖추어야 하며, 셋째, 각자의 정체에 맞는 미덕과 정의감이 있어야 한다.
      어느 정체의 지지자들이건 저마다 자신의 정체가 옳다고 여기고는 극단으로 몰고 간다.
    • 5권 11장
      왕들의 특권이 제한될 수록 왕정은 필연적으로 더 오래간다.
      참주의 모든 조치는 세 가지 의도에서 비롯되기 때문인데, 피치자들 사이에서 불신을 조장하는 것, 피치자들이 활동 능력을 상실하게 하는 것, 피치자들이 기를 펴지 못하게 하는 것이 그것이다.
    • 6권 2장
      민주 정체의 토대는 자유이다. 일반적인 견해에 따르면 자유는 민주 정체에서만 누릴 수 있으며, 모든 민주 정체가 추구하는 목표는 자유를 누리는 것이라고 한다. 자유의 한 가지 원칙은 모두가 번갈아가며 지배하고 지배받는 다는 것이다.
    • 6권 3장
      그러나 평등과 정의와 관련하여 진리를 찾기가 아무리 어렵다해도, 사욕을 채울 힘이 있는 자들을 설득하는 것보다 쉬운 일이다. 평등과 정의를 추구하는 것은 언제나 약자들이고, 강자들은 그 어느 것도 거들떠보지 않으니 말이다.
    • 7권 2장
      따라서 훌륭한 입법자가 할 일은 국가나 민족이나 공동체가 어떻게 훌륭한 삶과 그들에게 가능한 행복에 참여할 수 있는지 고찰하는 것이다.
    • 7권 3장
      개인에게 최선인 삶이 국가와 인류에게도 최선의 삶임이 분명하다.
    • 7권 4장
      최적 인구는 자급자족적인 삶을 가능하게 해주되 시민들이 서로의 미덕을 알 수 있는 범위 내에서 최대 다수라고 정의할 수 있다.
      따라서 한 국가의 최적 인구수는 자급자족적인 삶을 가능하게 해주되 전체를 쉽게 개관할 수 있는 범위 내에서 최대 다수임이 분명하다.
  • 국부론(상), 애덤 스미스, 김수행 역, 비봉출판사

    매우 유명한 책이다. 애덤 스미스가 이 책의 초안을 작성할 때 친구에게 시간을 때우려고 글을 쓴다는 매우 겸손한 표현을 썼다고 한다. 엄청나게 두꺼운 책이고, 경제학에 관심이 적은 나로서는 별로 와닿지는 않지만 몇 가지 재미있는 가정을 해보면 어떨까 싶었다. 즉, 애덤 스미스에게 이러이러한 가정을 한 상태로 책을 다시 작성해 주세요 하면 좋을 것 같은 부분을 골라보았다. 처음에는 내용도 재미없고 두껍기만 하여서 (상)만 읽어보려고 하고, 그 다음에 읽을 책을 준비하였다. 그런데 집중해서 읽는 속도를 높여서 보니 (하)도 재미있을 것 같다.

    이 책에서는 농업에서 토지의 저생산성에 대하여 잠깐 다루고 있다. 프리츠 하버의 질소 고정법이 이 시기에 소개되었다면 어떤 전개가 이루어졌을지 궁금하다.

    장자 상속제에 대하여 나쁘게 보고 있다.

    (상)의 마지막 부분에 정말 잠깐 나오는데 온 세상이 하나의 국가이면 어떤 전개가 나올지 궁금하다.

    이 책에서는 길드 같은 조합에 대하여 나쁘게 보고 있다. 모든 사람의 최선의 이익 추구를 방해한다는 측면에서 그렇게 평가하였다. 그렇다면 강성 노조는 어떻게 바라볼지 궁금하다.

    거주 이전의 자유가 없음을 비판하고 있다. 이 시기에는 거주지를 옮기기 위해서는 교구의 승인이 필요한 것 같다. 그런데, 산업 시대에서 사람들이 도시로 집중되는 현상은 어떻게 일어났는지 궁금하다.

    보조금 제도는 이 시기에도 있었다.

    유럽의 식민지에서 가져오는 막대한 양의 은과 금이 경제에 나쁜 영향을 끼쳤다고 본 것 같다.

    정말 시세에 대한 여러 자료를 많이 수집한 것 같다. 단위는 전혀 와닿지가 않아서 금액 단위와 부피나 질량 단위에 대한 설명이 상세하게 제시되었으면 좋겠다는 생각이 들었다. 가치의 변화를 중시한 것 같다.

    내가 제대로 이해했는지 모르겠는데, 화폐의 가치가 그 금속의 가치보다 높아야 한다고 하는 것 같다. 예전에는 금속이 단단하지 못해서 시기가 지나면 동전을 다시 만들었고 이에 대하여 주조세를 낸 것 같다.

    국가의 어설픈 간섭보다 정말 자유로운 경제 활동을 보장하는 것을 중요시 여겼다. 그렇게 한다면 기근을 비롯한(어디선가에는 여유분이 있는 곳이 있고, 이 것을 가져올 수 있으므로) 일시적인 불평등을 해결할 수 있는 것으로 본 것 같다.

  • person_id 익명화

    CDM을 이용하는 사람이 생김에 따라서 person_id를 한 번 더 익명화하기로 결심했다. 매번 CDM에 자료가 추가되는 방법이면 난수를 생성하는 방법을 고민해야 할 것이다. 하지만, 수정하면서 자료를 추가하고 있기 때문에 매번 새로운 수를 만들어도 될 것 같았다. 수십만건의 난수를 효과적으로 만들기 위하여 여러 방법을 시도해 보았다. R이라면 sample(, replace = F)로 만들면 그만인데, SQL에서는 그런 명령어는 못 찾았다. 그래서 비슷한 개념으로 만들어 쿼리를 작성해 보았다. 

    CREATE TABLE mapping.person_anonymous_from AS SELECT DISTINCT person_id FROM cdm.person;
    ALTER TABLE mapping.person_anonymous_from ADD COLUMN temp_join_a bigint NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 );

    우선 person 테이블에서 고유한 person_id를 추출하여 테이블을 하나 만든다. 그리고 생성된 테이블에서 bigint 속성을 가지며 추가될 때마다 1씩 커지는 temp_join_a 컬럼을 만든다.

    CREATE TABLE mapping.person_anonymous_to AS (SELECT DISTINCT trunc(random() * 1e8 + 1) AS random_key FROM generate_series(1, 1e8));
    ALTER TABLE mapping.person_anonymous_to ADD COLUMN temp_join_b bigint NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 );

    random() 함수는 0~1의 실수값을 생성하기 때문에 정수값으로 변환한다. 병원 환자 수를 보니 1천만개 정도 만들면 몇 년은 충분할 것 같았다. 그래서 생성된 난수에 1천만을 곱하고 1을 더한 후 정수값으로 처리한 작업을 1천만번 반복한다. 이런 방법으로 난수를 만들면 중복이 생기기 때문에 고유한 값만을 선택하여 이 값을 다른 테이블에 random_key라는 컬럼 이름으로 만든다. 이 방법은 중복되지 않는 수를 생성하는데에는 좀 멍청한 것 같다. 1억개를 만들면 60% 정도만 남는다. 그리고 마찬가지로 temp_join_b 컬럼을 만든다.

    CREATE TABLE mapping.person_anonymous AS (SELECT a.person_id, b.random_key FROM mapping.person_anonymous_from AS a INNER JOIN mapping.person_anonymous_to AS b ON a.temp_join_a = b.temp_join_b);

    이렇게 만들어진 random_key의 순서는 충분히 임의적이라고 할 수 있다. temp_join_a에 맞추어 INNER JOIN의 형태로 결합하여 테이블을 만든다. random_key가 person_id보다 충분히 숫자가 크기 때문에 공통인 것만 선택을 하면 된다. 이러면 충분히 식별력이 없는 새로운 person_id를 만들어 낼 수 있다.

    PostgreSQL 문서에 의하면 distinct는 처음 나타나는 순서대로 정렬이 되는 것이라고 한다.