상민과 나의 밥집 평가에 대한 CORRELATION 이 -0.8527이 나온다. -1에 가까우므로 반대 방향의 데이터가 예상된다, 즉 취향이 반대라는 얘기인데, 점수 메긴 숫자로 보면 취향이 반대 같아 보이진 않는다. 내가 평가안한 것(빈칸)에 대해서는 CORREL 함수가 제외하고 계산하는 것은 분명하다. 그리고 내가 평가한 것이 6개 이므로 자유도 5로 계산했을 때 수작업으로 계산해도 같은 값이 나온다.(당연하지 컴퓨터인데)

뭔가, 상관계수로 취향을 분석하는 것은 저렇게만하면 안될것 같다. 당연하지..모두 식당평가를 같은 4점, 3.9점을 주었고 나머지 둘이 달랐으니, 이 들을 관통하는그래프가 예상 밖이 되는데.. 아.. 이런 멍청한.

Network Card의 PPS를 측정하는 아주 간단한 스크립트

linux, NIC eth0 의 PPS를 1초마다 측정한다고 가정하면,

#!/bin/bash

while true
do
    echo $(cat /sys/class/net/eth0/statistics/tx_packets) $(cat /sys/class/net/eth0/statistics/rx_packets)
    sleep 1
done | awk '{DT=$1-TPREV; DR=$2-RPREV; if(TPREV) print strftime("%Y-%m-%d %H:%M:%S", systime()), "TX:", DT, "RX:", DR; TPREV=$1; RPREV=$2; }'

 

HHI 지수를 조금 체감하기 위해 숫자놀이를 해보자면,

일단, HHI 란 퍼센트로 표현한 점유율의 제곱 합 이다.

  • 1개의 회사가 전 시장을 다 장악하는 경우 100% 이므로, 제곱합은 그저 100의 제곱인 100000 이다. 이값이 HHI의 최대값을 나타낸다.
  • 2개의 회사가 시장을 반씩 양분하고 있는경우 50%의 제곱합이므로 2500 * 2 = 5000
  • 5개의 회사가 시장을 5등분하고 있는 경우 20%의 제곱합이므로 400 * 5 = 2000
  • 10개의 회사가 시장을 10등분하고 있는 경우 10%의 제곱합이므로 100 * 10 = 1000

어떤 산업이 1000~2000 정도의 HHI 지수를 가지고 있다는 것의 예는 이렇다.

어떤 회사의 최대 점유율이 20% 인 산업군을 하나 만든다면,

  • 20%, 20%, 20%, 10%, 10%, 10%, 10% = 400 + 400 + 400 + 100 + 100 + 100 + 100 = 1600

제 1 점유율이 30%인 산업군의 예는,

  • 30 10 10 10 10 10 10 10 = 900 + 100 * 7 = 1600

제 1 점유율이 40%인 산업군의 예는,

  • 40 5 5 5 5 5 5 5 5 5 5 5 5 = 1600 * 25 * 12 = 1600 + 300 = 1900

훔... 마지막의 경우 두 회사가 합병해서 10인 회사가 생긴다면

  • 40 10 5 5 5 5 5 5 5 5 5 5 = 1600 + 100 + 25 * 10 = 1700 + 250 = 1950

HHI 지수를 보건데, 시장을 독점한다면 그 값의 최대값은 10000 이다. 두 회사가 시장을 양분하고 있으면, 대략 5000 언저리, 2~5개의 회사가 치고 박고 싸우고 있으면 2000 ~ 5000, 5개 이상의 회사가 매우 시끄러우면 2000 이하.

잘 놀았습니다..

GS(링크)를 끌어다가 즐겨찾기에 떨어 뜨려 저장 후, 구글 검색 결과 창에서 누르면 주소를 정리해주는 북마클릿이다. 해당 내용은 아래와 같다. 만약 링크가 나오지 않는다면, 아무 북마크나 만들고 아래 내용으로 주소를 복사/붙여넣기를 하여 만든다.

javascript:location.href=location.href.split('?').map(x=>x.split('&').filter(a=>a.startsWith('http')||(['q','hl','tbm','start'].indexOf(a.split('=')[0])!=-1))).map(b=>b.join('&')).join('?')

구글 검색을 한 다음 나오는 페이지를 공유하고 싶으나, 그 URL에는 불필요한 정보가 실려 있다. 예를 들어 "real user monitoring"이라는 키워드를 검색한다고하면,

https://www.google.com/search?q=real+user+monitoring&oq=real+user+monitoring&aqs=chrome..9i57j69i64j69i60.475j0j9&sourceid=chrome&ie=UTF-8

real user monitor가 q에 있으며 그 외에 다른 내용이 추가 되어 있다. oq 는 old query 인 것 같고, aqs, sourceid, ie 등등이 있지만, 내가 넣은 키워드는 아니다.

https://www.google.com/search?q=real+user+monitoring&newwindow=1&sxsrf=LeKk03jPSDAZORglcmjxCXz04IBrb_OLA:1601697916568&ei=Ph3X7KYIs77wQOb2ZeQBg&start=10&sa=N&ved=ahUKEwiyxuraxZfsAhXOfXAKHZvsBWIQ8tMDegQIHRA2&biw=1664&bih=856

이것은 두번째 페이지를 선택했을때 나오는 URL이다. 여기에서는 의미 있는 인자로는 start=10으로 보인다. 또한 이미지 검색탭도 중요한 공유지점이므로 한 번 더 확인해 보면,

https://www.google.com/search?q=real+user+monitoring&newwindow=1&hl=ko&sxsrf=LeKk03rjnn29_rlZpdwCneoGI-E2l1abA:1601698337343&source=lnms&tbm=isch&sa=X&ved=ahUKEwic0ryjx5fsAhUQBogKHausBGsQ_AUoAXoECB0QAw&biw=1664&bih=856

tbm=isch 가 그 역할을 하는 것으로 보여진다. 따라서, 위 URL을 정리하는 간단한 스크립트를 만들수 있고, 북마크에서 해당 자바스크립트가 실행되는 URL로 만들어 두면 유용할 것이다. 단계는 다음과 같다.

  1. "?"로 나눈다.
  2. 나눈 각각을 "&"로 나눈다.
  3. 나눈 각각이 http로 시작하면 남긴다.
  4. 나눈 각각을 '='으로 나눈 첫번째 단어가 'q', 'hl', 'tbm', 'start' 이면 남긴다.
  5. 남은 각각을 역순으로 합친다.
location.href.split('?').map(
    x => x.split('&').filter(
        a => a.startsWith('http') || ( ['q','hl','tbm','start'].indexOf( a.split('=')[0] ) !=-1 )
    )
).map( b => b.join('&')).join('?')

이렇게 정리되는 주소로 재설정하는 것으로 마무리하여 북마클릿을 만든다.

지극히 사소한 개인 로그라서, 읽지 마시기를 권함.

집안 청소를 대략 두 달에 걸쳐 했다. 지난 8월 15일 전후로 아내의 휴가에 맞춰서, 여행 갈 일도 없는 코로나 시국에서 집 방 바꾸기나 해보자고 시작한 것이, 얼추 끝나는 것은 한 달이 걸렸으며, 그 한 달 이후로 꾸준히 뭔가를 바꾸고 있다.

  • 첫째가 쓰던 방을 내가 쓰고, 둘째가 쓰던 방을 아내가 쓰고, 큰 방은 둘째에게 줬다. 그리고 학교앞에서 자취하는 첫째는 가끔 오면 적당히 잔다.
  • 10수 년 전 동네 도서 대여점이 문을 닫을 때 우연히 지나가다가 책장을 헐값에 수거해 왔고(17개), 집안 곳곳에 배치를 해뒀으나, 집정리가 끝난 지금 7개를 대형폐기물 업체에 넘겼다. 수거해 온 이후 몇 년 전 2개는 버렸기 때문에, 집에는 8개가 남아 있다.

첫째의 방

  • 이제는 내 방
  • 첫째의 방에 딸려 있던 부속방엔 피아노가 있었고, 각종 안쓰던 옛날 물건들이 그곳에 있었던 죽은 공간이었다. 피아노를 조금 밀고, 잡동사니를 드러내고 80cm 넓이의 작은 책상을 하나 사서 그곳에 내 공간을 만들었다.
  • 피아노 방으로가는 길을 만들기 위해 싱글침대를 길게 써야 했으며, 그러기 위해선 큰 책상을 분해하여 접어 두었다.
  • 싱글침대를 길게 쓰면서 생긴 한쪽 벽은 거실에 있던 다섯 개의 도서 대여점 책장을 이동시켜 배치했고, 거실의 벽면이 드디어 벽지를 자연스럽게 드러내고 있다. (거실 한쪽 벽이 그간 너무 가려 있었다)
  • 피아노 방에 책상을 조그맣게 들여 자리를 잡아 안정감은 있으나, 뒤에서 누가 오는느낌이 쎄해서(왜?) 거울을 하나 배치함.
  • 동네 꼬마녀석들이 노는 소리가 너~무 시끄럽다. (얼른 자라서 조용하게 놀아라.)

둘째의 방

  • 이제는 아내의 방
  • 이 방은 공부하는 2층침대를 두어 침대와 책상이 한 공간을 쓸 수 있게 되어 있었다.
  • 머리에 뭔가가 있는 느낌이 싫다해서 책상공간에는 시스템 책장들을 다 몰아 넣고, 조금 떨어져 나온 곳에 조그만 사각형 책상을 방 가운데 두어 사용한다.
  • 도서대여점 책장 두 개를 넣어 큰 방에 있던 책들과, 거실에 있던 문학전집 (200권)을 가지고 들어갔고, 원래 아늑한 곳이 더 아늑해졌다.
  • 시스템 책장은 책장이라기보다는 사물함에 가깝다.

큰 방

  • 이제는 둘째의 방
  • 2in1 에어콘 하나가 들어 있는 방인지라, 원격 수업이 잦은 둘째가 집에 있을 때 사용하라고 둘째 공간을 만들었다.
  • 첫째의 옷과 간단한 책장도 여기에 배치하여 가끔 왔을 때 사용할 수 있게 하려는게 목적인 방이 됐다.

주방

  • 집이 오래되다보니, 렌지후드가 말썽이다. 스위치 박스가 잘 안눌렸는데, 수리신청을 하여 수리완료.
  • 렌지후드 철망이 둘인데, 그 중 하나 교체 했고 불을 켜면 나머지 것과 너무 비교 된다. 그 동안 수시로 세척해 왔는데도 관리가 너무 어렵다.
  • 전자레인지, 에어 프라이어 위치 변경하여 조리 공간 확보.

그 밖

  • 현관 센서등이 고장나서 새로 주문하여 교체
  • 화장실 앞에 센서등 하나 (충전식) 설치했다가 불량이라 교환신청.
  • 거실 중앙 형광등 갈아 끼움
  • 베란다 창고 털어 안쓰는 블라인드 버림
  • 워킹 트레드밀 버림

아직 남은 것이라면, 내 방 옷장정리... 등등등.

모든 게 멈추었다.

급한 불 앞에선 불끄는 것외엔 집중할 여유가 없다. 불끄다 잠시 눈돌려서 할 수 있는 것이라고는 눈에 들어오는 것에 시선을 잠시 고정시켜 따라가는 것일 뿐.

문득문득 나이듦이 머리를 들고, 잃어버린듯한 기회에 대한 아쉬움도 머리를 들고, 할 수 있을 것 같은 자신감은 외면을 한다.

 

지킬 박사와 하이드씨

지킬이 정상이고 하이드가 살인자, 우리 말 어감상 지킬이 강해 보이므로 이름을 한국식으로 바꾼다.

박재권과 하익두씨라고 하면 좀 더 강한 것 같기도 하고...

객체의 생성이란 무엇인가, 플라톤의 이데아처럼 어딘가에 존재하는 것으로부터 현실에 필요한 속성을 부여하며 만들어지는 것인가, 아니면 옆에 있는 다른 객체를 복사하여 속성을 원하는 대로 고쳐쓰는 것인가?

개발자가 철학적인 사고를 하기 쉬운 것들은 이런 사고가 설계에 도움이 되기 때문아닌가?

c/c++의 struct, class를 생각하면, 텅빈 설계도 같은 것에서 메모리를 차지하면 만들어지는 것은 플라톤의 이데아 같은 것이 생각나고, prototype 객체를 우선만들고 복사한 다음 속성을 변경하여 쓰는 Javascript 같은 것은 후자와 같은 모양 아닐까?

몇 년 된 간단한 생각을 일단 적어 둠.

과거에 BASIC을 배울 땐 서브루틴과 함수가 분리되어 있었다. 포트란도 그러했다. 그러다가 C 언어를 배울 땐, return 유무에 따라 성질이 달라질 뿐 모두 함수로 통합이 됐다. 그러다가 JavaScript를 배울 땐, _객체_로서 함수 개념을 배우게 된다. 이 말은 함수와 자료가 통합되었다라고 말할 수 있다.

Javascript가 구현하는 함수객체는

function func1 ( ) {
  /* code */
}
  • func1()으로 쓰면 { ... } 안의 내용이 실행된다.
  • func1.abc = "def" 로 쓰면 func1를 객체 취급하여 'abc'라는 키를 추가한다.

이런 발상의 전환이 통합의 구체적인 모습이다.

  • func1.apply
  • func1.call
  • func1.bind

이런 함수는 func1 이라는 함수 객체가 만들어질 때 추가되는 속성이라고 생각하면된다.

짧은생각

Javascript와 python에서 제공하는 배열/리스트에서 특정 값의 위치를 찾는 비슷한 명령어로 각각 indexOf, index 라는 메소드가 있다. 이 둘은 찾지 못했을 때의 특성이 다른데,

  • Javascript: -1 을 return 한다.
  • Python: ValueError 예외를 발생한다.

언어를 다루다보면 이 둘은 묘한 선택의 순간을 만드는데, 전자는 매번 return 값을 확인해야하고, 후자는 앞 뒤로 예외 처리 구문을 넣어야한다.

Javascript/Java/C++ 계열에 익숙하다보면 정상적인 처리를 해야하는 상황을 예외를 발생시켜 점프하는 것에 약하지만 부담을 느낀다. 스택을 되돌리는 백그라운드 작업에 원하는 모든 리소스 해제는 잘 일어나는 것일까랄지, 단순히 값 하나만 비교하면 되는데 굳이 예외를 위해 백그라운드로 일어나는 작업을 컴파일러에게 맡겨야하나라든지 아무래도 부담스럽다.

Python 쪽에서는 없는 인덱스로 -1을 return 하는 순간 list[-1] 접근하는 것은 마지막 원소에 접근하는 방법이 되므로 아무래도 오류가 아닌 값처럼 인식될 수 있다. Javascript에서도 Array.slice(음수값)으로 python의 음수값 처럼 사용가능하지만 어쨌거나 기본적인 인덱스 연산으로는 접근이 불가능하므로 -1을 return 해도 큰 문제는 없다. python의 인덱스 연산은 -1에 대해 정상 작동하기 때문에 예외를 일으키는 방법밖엔 선택지가 없어 보인다.

추신

이 생각은

 50 function get_attrs(filter) {
 ...
 60   var attrs = [ 
 61       {name:"charset-configured", value: "utf-8"},
 62       {name:"charset-supported", value: "utf-8"},
          ....
 70   ];
 ...
 85   return attrs.filter(function (attr) {
 86     return ~filter.indexOf(attr.name)
 87   })
 88 }

이런 코드를 읽다가 86줄의 -1 에 대한 negate (~) bit operation을 보다가 꼬리를 문 생각임.

+ Recent posts