이 블로그 검색

2020년 10월 19일 월요일

frei0r - 오픈소스 이미지 콤포지션(트랜지션) 상세설명.(1) - Mixer2 Part1 alpha...

    Frei0r

    Frei0r은 Natron이나 kdenlive같은 비디오 에디터에서 사용되는 composition,transition, merge 툴이다. 

    adobe의 트랙 매트 (track matte)효과를 kdenlive에서 어떻게 구현할지를 생각하다가 이것으로 구현할 수 있을 것 같아 찾다가, 너무 이름이 직관적이지 않아 쓸 때마다 헛갈릴 것 같아 정리를 해놓는다. 



    Mixer2 

    Mixer2는 8비트 unsigned int형의 자료를 사용하여 각 픽셀의 색상정보를 저장한다. Mixer3을 봐야 알겠지만, 더 큰 자료형을 사용하는 부분이 구현이 되어있지 않다면, frei0r은 사용하지 않는 것이 좋을 것이다.  

    코드 호출이 어떻게 되는지를 몰라서, 일단은 A를 윗 레이어, B를 아래 레이어로 생각하고 글을 쓴다.    kdenlive에 넣어서 테스트 해보니, A가 아래 B가 위로였다. natron에서는 다를 수 있으므로 1번 2번으로 전부 다시 고쳤다. 

     
    •  ᅟAddition (더하기)
    더하기 효과는 간단하다. 윗 이미지와 아래 이미지의 rgb값을 더 한다. 최대 값은 255로 한다. 

    알파의 값은 두 알파의 최소 값으로 한다. 

    고로 항등 image에 해당하는 윗 이미지는 (0,0,0,255)로 이루어진 이미지이다. 

    2번 레이어의 알파는 min연산이다보니, 중간 값을 이용하기 보다는, 이진의 마스크 효과를 사용할 수 있고, 윗 레이어를 통해 닷지 효과처럼 사용한다.  

    그리고 중요한 점 중 하나는, 윗레이어(마스크)와 아래레이어(배경)의 교환 법칙이 성립한다는 것이다. 많은 효과들이 교환 법칙이 성립하지만, 아닌 것들도 많다. gimp의 이미지 합성 툴 가운데에도 그런 것이 있다. 

    그룹레이어를 사용하지 못하는 경우에 교환 법칙이 성립하는 것을 유용하게 사용할 수 있고, (서로는 순서가 상관 없지만 그 각각도 위아래가 따로 있으므로 )노드 방식의 이미지 에디터에서 연결순서가 바뀌어도 같은 경과가 나오기에 유용하다. 이제 아래부터는 그냥 교환법칙이 성립한다로 끝내도록 한다. 


    • Addition_alpha (알파더하기)
    Addition_alpha는 대표적인 잘못이름지어진 콤포지션 효과이다. 
    이름만 들으면, 마스크의 알파 값이 더해질 것 같은 이름이지만 전혀 다른 효과를 가진다. 

    1번의 rgb에다가  pre-multiplied RGB(이하 pRGB) 값을 더하는 효과이며,
    결과값은 완전 불투명이다. 

    마치 이미지 에디터에서의 더하기라고 생각하면 된다. 레이어를 투명하게도 하지만, 브러쉬 툴의 알파를 이용해서 여러번 덧칠한다거나 하는 느낌을 주지 않을까??

    • Alphaatop( alpha atop)

    매우 복잡하다. 

    일단, 결과값의 알파는 2번의 알파와 같다. 

    결과의 알파가 0이라면, 리소스 낭비를 줄이기 위해 모든 결과값을 0으로 한다. 이후에도 알파값을 먼저 계산하면 다 그러해서 설명하지 않는다. 

    0이 아닐 때는,  다음과 같은 계산을 거친다. 

    w1 = alpha2

    w2 = 255 - alpha1

    rgb_dst = [(prgb1 * w1 ) + (prgb2*w2)]/ alpha_dst

    rgb_dst = rgb1*alpha1 + rgb2* [(1-alpha1)]

    직관적으로 이해하기 어렵다. 

    2번의 알파값이 그대로 작동하므로 알파마스크처럼 사용되며, 

    1번의 알파값에 따라, 1,2번의 색상의 rgb 사잇값을 사용한다. 

    • alphain 

    결과값의 알파는 1,2번 알파의 곱이다.  

    결과값의 RGB는 1번의 RGB값을 결과값의 RGB값으로 하도록 되어 있다. 

    rgb_dst = (rgb1*alpha1/255) * alpha2 / alpha_dst
    그렇다면 prgb_dst = rgb1*alpha1*alpha2가 될 것이다. 
    막상 약분이 된다고 하면, 
    rgb_dst = rgb1이다. 약간의 차이는 uint8 연산이다보니 여기저기서 계단 현상이 일어난다. 이것이 중요한 부분일지는 모르겠다. 

    어쨌든 대충 alpha_dst= alpha1*alpha2 
                      rgb_dst ≃ rgb1

    최신 깔끔한 구현에는 그냥 두번째 알파채널 또는, 레이어마스크 처럼 작동하지 않을까?

    단순한 알파마스크로 색상은 아무변화를 주지 못하며, 흰색일수록 불투명하다. 

    • alphainjection (오래된 api라 1,2번이 다를 수 있음)
    1번의 rgb값의 평균값을 결과값의 알파값으로, 2번의 rgb를 그대로 사용한다. 

    fill/key로 분리해서 전송하는것과 같다고 보면 된다. 

    물론 rgb의 평균값이 yuv채널의 y값과 다르기 때문에 생각한 것과는 다를 수 있다. 

    matte의 경우에는 루마 값을 알파값으로 사용한다. (kdenlive) 
    (matte는 frei0r이 아니다.  mlt framework sse!! code)

    alphainjection이 kdenlive에서는 없는 것처럼 보인다. 


    • alphaout
    alphaout은 alphain과 거의 같으나, 알파 대신 (255-alpha) 값을 사용한다. 반대로 작동한다. 시작효과를 끝에다가 붙인다면, 시작과 끝이 맞아서 아름답지 않을까?

    • alphaover
    무언가 수식만 봐도 미친 것 처럼 보인다. 편의상 0-1의 실수형 색상이라고 할 때, 결과값 알파는 다음과 같다. 

    alpha_dst = alpha1*alpha1 + alpha2*alpha2*(1-alpha1)
    alpha1과 alpha2의 제곱사이의 사잇값이다. 1번이 불투명할 때는, 약간의 변화를 2번의 알파가 주며, 알파2의 제곱이 알파1보다 작을 때는 오히려 더 투명하게 된다. 

    결과값 RGB는 다음과 같다.   

    rgb_dst= (rgb1 * alpha1 + pRGB2*(1-alpha1) )/ alpha_dst

    이건 써봐야 알 것 같기는 한데,  같은 수식을 그대로 적용한다. 

    1번에 있는 투명한 부분이 매우 밝게 강조 된다. 나누기 연산이 있으면 일단, 뭔가 특별한 상황에서만 써야지 결과값이 맛이 많이 간다. 



    • alphaxor
    alpha간 xor연산을 할 것 같지만 아니다. 또는 구현을 내가 몰라서일 수도 있다. (뭐 근데 xor연산을 다른 방법으로 하는건 좀 이상하다. 미치지 않고서는)

    결과값 alpha = alpha1*(1-alpha2)+ alpha2*(1-alpha1)
    모두 투명하거나 불투명하다면, 불투명하게, 
    하나만 투명할 때 투명하게 결과가 나온다. 

    비트 단위의 xor이 아닌 불투명도라는 정도에 대한 xor이다. 

    색상은 다음과 같다. 

    rgb_dst= (pRGB1 * (1-alpha2) + pRGB2* (1-alpha1) )/ alpha_dst

    pRGB에 대해 불투명한 레이어 쪽이 더 부각되도록 되어 있다. 

    교환 법칙이 성립한다.





    2020년 10월 5일 월요일

    남이 Natron으로 만든 Lower Third를 연습하다가 템플릿처럼 사용하는 방법을 알게 되었다.

     Natron은 node 기반 opensource vfx application이다. 

    vfx 및 드로잉 툴들은 어느정도 발전이 되었다면, node기반 또는 레이어 기반의 형태로 나아간다. 

    Node기반 툴들은 Davinci resolve,(NLE) Blackmagic Fusion(VFX)이라는 걸출한 유료프로그램이 있고, Blender라는 NLE, 3D modeling, Node vfx를 지원하는 툴도 있다. 

    Natron은 무료이며 일단 openfx기반이라 다양한 행위를 할 수 있다고 하는데, 그게 무슨 장점인지는 모르겠다.  

    Natron은 일단 Fusion이라는 툴을 써본 결과로 말하자면, 아무것도 배우지 않은 백지 상태에서는 차이를 알 수 없다.  왜냐 ... Layer기반을 쓰다가 이걸 처음 만지면, 어떻게 하는지 알수가 없기에... 그러하다.  뇌에서 Layer가 아닌 모든 것들이 다 공통으로 묶인 것으로 여겨진다. 

    Natron Youtube Lower third 강좌를 따라해보니, Natron은 결과물 출력으로 단일영상 또는 이미지시퀀스로  처리한다.  

    여기까지 따라하니, 내 이름을 특정 Text대신 쓰고난 이후에, 

    다양한 상황에서 쓰기 어렵다는 생각이 들어, 템플릿으로 쓸 방법을 찾는다. 

    일단 Natron Project파일은 xml기반이라, 노가다를 하고, nodejs를 사용하면, 텍스트 기반이니 당연히 가능하다.  

    일단 여러 검색을 해보니, Natron을 터미널에서 사용해, 출력물을 얻는 방법이 있음을 알게 되었다. 

    외부 툴을 사용하지 않고, Natron만 가지고 이것을 하고 싶다. xml은 구조화는 잘되어 있지만 인간이 접근하기 좋은 규격은 아니다. 

    Natron은 python script를 사용할 수 있고, 잘못검색을 하면, python을 프로젝트 파일처럼 사용하는 부분만 보게된다. 


    좀 더 신경을 쓰면, 프로젝트파일을 불러오고, onload시 python을 불러오는 옵션이 있다.

    -b는 터미널에서  바로 출력물을 얻겠다. 

    -l(L이다. ) 이 해당하는 python 스크립트이다. 

    natron -b Natron.project.ntp -l python1.py 

    이 두 명령으로 python1실행으로 내부가 변한 상태의 출력물을 얻을 수 있다. 

    저 python1.py의 구조가 이제 중요하다. 


    내부 노드에 어떻게 접근을 할 수 있을까?

    Natron은 일단 프로젝트 파일을 불러온 후 프로젝트 xml을 잘 정리해서 app1이라는 클래스에 모든 정보를 넣는다. 그리고 노드이름으로 간단히 접근할 수 있다. 

     1  
     2 node = app1.Text1
     3  
     4 node.text.set("hello World")

    내 경우는 위 처럼 2줄짜리 프로그램으로 글자를 바꿀 수 있게 된다. 

    뭐 더 고친다면 소속까지 한 줄 더 작성하는 정도이겠다. 

    자이제 natron 명령으로 여러명의 개인 소개용 Lower Third를 만들도록하자. 

    bash까지 사용하면 못할게 없고, sed 명령어를 사용해 쉽게 작업할 수 있다. 

    (sed를 사용하면, 애초에 매우 쉽다. )


    자료리스트

    konkuk으로 시작하는 친구들은, writer까지 작업이 되어있어서 편리하다. 원본이랑 사실 별차이 없다. 

    300프레임에 25MB정도씩 나와서 생각보다 무겁지만 재미있는 작업이 될 것이다. 

    csv파일로 로고파일주소, Text1 내용  Text_2 내용 등을 만들어 놓으면, 여러사람에 대해 설명하는 작업을 해서 재미있게 할 수 있을 것이다. 


    열심히 썼지만, 문제가 있는데, Natron은 저 움직이는 이미지 작업 자체가 더럽다. 뭐... 개인적으로 3D Text의 두깨 기능이 지원이 안되서, 배우는건 Natron으로 하고, 실지로는 Blender를 쓰지 않을까... 


    돈있으면, after effect용 템플릿을 구하면 된다. 


    이 글에서 가장 중요한건, app1이라는 클래스 이름이다. 

    우분투 리눅스에서 모니터 오버클락하기.

     

    리눅스에서 디스플레이 해상도 등과 관련된 패키지는 xrandr이다. 


    xrandr을 통해 다양한 display mode를 체험할 수 있다. 


    지금 현재 사용하고 있는, 모니터는 DELL 2312HM으로 홈페이지상 스펙으로는  1920x1080  60이 한계인 것으로 나타난다. 


    처음 xrandr을 누르면, 이 이하의 설정가능한 다양한 해상도 등이 나온다. 

    1080x1024 75.02 60 

    640x480 75 59.94 

    등이 나오는데, 이 값들은 일종의 디스플레이 업계의 약속된 추천해상도라고 할 수 있다. 


    윈도우 시스템의 경우는 드라이버에 따라서, 굉장히 다양한 해상도 설정이 가능한 경우가 있는데, 이 해상도들은, 일종의 업계 호환해상도라고 할 수 있다. 


    이 호환 해상도에 해당하는 것이 바로 gtf, cvt라는 것이다. (위키에 검색해보시오)


    여기에는 그래픽카드에서 모니터로 신호를 보낼 때, 어떤 주파수로 신호를 보내고, 어디서부터 어디까지인지 신호를 보낼지에 대한 일종의 약속이다. 이 신호는 결국 픽셀정보를 직렬로 보내다보니 직사각형의 화면정보를 열별로 나누어 보내게 되고,  어디부터 시작인지 어디가 끝인지, 열의 시작과 끝이 어디인지 및 몇가지 정보전달을 위한  위한 메타데이터를 필요로 하게되고 이러한 값들이 직사각형 정보덩어리의  테두리 여백으로 들어가게 된다. 

    기본 규약은 어차피 자동으로 처리가 되므로 필요한 것은 저 호환 해상도에 해당하는 gtf와 cvt이다. 

    리눅스의 경우 gtf를 누르면 다음처럼 나오고,

    원하는 해상도를 입력하면 다음처럼 나온다. 

    cvt의 경우도 마찬가지이다. 




    이렇게 얻은 정보를 가지고 xrandr를 사용하여 추가하여 사용할 수 있다. (싱글모니터는 요렇게하지만 듀얼부터는 몇자를 더적어야)

    Modeline 뒷 정보를 다음처럼,
    xrandr --newmode "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
    xrandr --addmode "1920x1080_60.00"

    xrandr --mode "1920x1080_60.00"



    이제부터 모니터 오버클럭이야기를 해보자. 


    원래부터 지원되는 해상도임에도 불구하고 저렇게 입력하면, dvi single link나(대부분 와이드 해상도 면... 맞아...) 오래된 hdmi 버전을 쓰는 모니터는 먹통이 된다.   저 첫번째 숫자부분이 165를 넘어가면 먹통이 된다. (내 테스트는 164도 먹통이었음 163.xx까지는 잘 되었음. 이 현상은 케이블 먹통이라 하자.) 

     당연히 약속이 잘되어 있는 친구들이, 메타데이터가 덜 필요하다. 약속만 되어 있으면, 봉화 몇개로도, 전쟁유무가 파악되는 법 ...  

    예비약속이다보니, 더 많은 정보가 필요하다.  


    이 예비약속들만으로는 되지 않는다. 윈도우 처럼 넘실거리는 수많은 모니터 해상도 지원은 가능하지만, 오버클럭은 불가능하다. 

    아날로그 시대에 비해 디지털 시대에 HD가 붙기 시작하는 친구들은 해상도가 더 큰 편이다보니, 메타데이터를 잘 접어서 구석에  넣는 방법이 생겼다. 

    (이 문장은 내 개인 추측이다. 틀렸을 수 있다. )

    그 방법을 cvt-rb 방식이라 한다. 

    https://en.wikipedia.org/wiki/Coordinated_Video_Timings#Reduced_blanking 

    우분투에서는 cvt-rb 방식을 apt로 받는 cvt에서 지원을 한다. 


    보면 알겠지만, 갑자기 165MHz까지 가기에는 많이 남게된다. 

    그런데 안타깝게도, 이 규약은 원래 나올 때, 60Hz의 배수만을 지원하기 위해 나왔다. (아마 표준 나오고 빠른 모니터가 너무 빨리 나왔을때 나온걸로 보인다)

    그러다보니 이툴은 60-120hz사이의 다른값들을 쓰기에 부적절하다. 뭐 구글에 linux monitor overclock이라 검색하면 수정된 cvt와 더 다르게 구겨넣는  방식인 cvt-rb2까지 지원하는 녀석이 깃헛에 있음을 알 수 있다. 

    wget http://www.uruk.org/~erich/projects/cvt/cvt.c

    $ curl https://raw.githubusercontent.com/kevinlekiller/cvt_modeline_calculator_12/master/cvt12.c --output cvt12.c

    Compilation:

    $ gcc cvt12.c -O2 -o cvt12 -lm -Wall

    앞 친구는 60hz 배수를 써야하는 규약을 무시하고 중간 친구들을 만들어주고, 뒷친구는 cvt-rb2까지 지원을 하는 친구인데 뒤에걸 일단 쓰는 걸로 하자. 뒤에 것은 c 옵션으로 강제조항이 있다. 

    그 방법을 통해 60까지 지원하는 h2312hm을 


    Modeline "1920x1080_73.86_rb2"  164.99 까지 올렸다. 

    일단 강제조항을 써서 얻은 cvt-rb는 dell이 나름 메인스트림 회사라 지원을 제대로 안한다. 이상한 회사라면 지원했을 수도 있어서 .. 75성공했을텐데... 


    일단 dvi-d sigle-link에서는 이 이상 올릴 수가 없다. 

    일단 저위에 그림처럼, 24라는 표준 깜빡임의 배수로 설정할 예정이다만, 저정도로 가득채워서 올릴 수 있다. 


    나중에 display port를 지원하는 그래픽카드가 있으면 좀 더 노력을 해보겠다. 


      이러한 방식으로 linux에서는 디스플레이 오버클럭을 한다. 

    모니터가 지원을 안하고 힘들어 할 수 있지만, 보통은 여유를 가지고 지원을 해주므로,  refresh 속도를  더 올려보자. 

    내 모니터는 75정도에서 한계점을 가진게 맞는지... 1280 720에서 여유가 많이 있음에도 120 90은 실패했다. 

    여러번의 시도를 거치면 적당한 해상도에서 최대 refresh값을 얻을 수 있지 않을까... 리눅스는 노가다다. 



    2020년 9월 24일 목요일

    Image Compositing 정리. 1 (Screen, Multiply) 스크린, 곱하기


    Screen은  검은색 배경으로 된 VFX를 합성할 때 사용되고는 한다. 

    공식상, 검은색의 레이어는 원본의 색을 그대로 노출하고, 흰색의 레이어는 완전히 (RGB  각 값도 마찬가지)  아래의 값을 지워버린다. 

    RGB, 원색 레이어를 통해 해당 색의 보색에 대한 필터로 작용할 수 있다. 

    중간단계에서 보이는 부분이 재미있는데, 레이어의 색상으로 부터 최대값까지 색상을 압축하면서, 뒷면의 색상차는 그대로 보여줄 수 있다. 

    24bit(8bit rgb) 이기 때문에 계단 현상은 생길 수 있으나, 뒷배경을 보이면서 오버레이어의 밝기 까지 보여 줄 수 있기 때문에 아주 유용하게 사용된다. 

    인터넷에 있는 번개, 폭발 연기 등의 프리소스를 사용하여 오버레이어의 콤포지터를 Screen으로 사용하도록 하자. 


    곱하기 효과는 Screen과는 반대로 작용한다. 흰색일 때는, 베이스 컬러를 그대로 보여주고, 검정색일 때는 검은색이 되어버린다. 

    레이어의 색상을 최대값으로  검정색으로부터 베이스의 색상을 압축하여 표현된다.

    R,G,B 의 원색을 사용하여 특정 채널만 뽑는데만도 사용할 수 있다. 

    배경이 흰색이 소스를 합성할 때 사용하면 좋다.  그러나 배경이 흰색인 소스의 합성은 주로 Y-채널을 조작해  Alpha로 사용하는 Luma Key를 많이 사용한다.    이건 뭔가 사람의 눈과 관련이 있을 것으로 보인다. 빛이 비춰 밝아진 물체를 구분하기는 쉽지만, 특정 부분만 어두워 지는것을 구분하는 일이 더 적어 질 것 같기는 하다. 

    2020년 8월 25일 화요일

    NFC Tag로 Wifi 공유하기. (Android, NFC Tools)



    NFC Tools 어플리케이션을 킨다. 


    Write Tab에가서 Add a record로 들어간다. 아래로 스크롤하여 

    Wi-Fi network를 누른다. 


    돋보기 버튼을 누른다. 근처에 있는 모든 네크워크가 뜨므로 오른 쪽 상단에 

    Wi-Fi가 양쪽으로 나가는 아이콘을 클릭한다. (제목 우측:Available Wi-Fi networks)

    잠시후 가까이에 있는 Wi-Fi 즉 내가 작업할 놈이 최상단에 뜰 것이다. 


    그것을 누르고 Authentication 은 가정용에서는 WPA/WPA2-Personal을

    고르면 되고, password는 그대로 가져와서 쓰면 된다. 


    그리고 OK를 누르고 나간면 Write / 약 100bytes  와 같은 버튼이 있다.


    그것을 누르고 빈 NFC Tag에 가져다 댄다.  

    그러면 Wi-Fi에 관한 모든 정보가 기입된다. 



    모든 작업이 완료되었다. 안드로이드 기기간에는 약속된 NFC Tag기능이 있는데 그 중 하나가 Wi-Fi Network을 추가 하는 것이다.  


    이제 다른 사람의 핸드폰 또는 본인의 핸드폰에서 해당 비밀번호를 초기화 한후 비접촉 방식으로 접속해보자. 


    나 같은 경우는, NTAG213이라는 제품을 사용하다보니 최대 144바이트를 쓸 수 있어서 비밀번호 원문이 그대로 Tag에 노출된다. 

    Wi-Fi 비밀번호를 만들 때, 중복되지 않는 임의의 비밀번호를 생성한다면 노출이 된다해도 나중에 수정하면 된다. 다만 다른데서 쓰는 비밀번호를 그대로 쓰고 싶다면 다른 방법을 사용해보자. 


    다른 툴을 사용하면, 비밀번호를 Hash 값으로 바꿀 수 있다. 나 같은 경우는 wpa_passphrase를 사용하는데 이것을 통하면, 65자리의 Hash가 얻어진다. 

    요렇게 했을 때, 원문 비밀번호는 노출이 되지 않으나(무작위 대입방법에는 취약하니 영어만 쓴다거나 하면 안된다. 그냥 랜덤값 쓰고 본인도 NFC 터치로만 연결하자. )


      애매하게 150byte정도를 쓰는데 이건 내 ssid가 긴 문제인 것 같다만, (어차피 터치로 할거니 짧듯 길든 무슨 상관...) 


    NTAG 213은 144바이트 밖에 안되서 제약이 많으므로 NTAG215(504bytes) 나  NTAG216(888bytes)를 애초에 구매를 해서 사용하는 방법을 쓰면 좋다. 


    215도 ebay에서 213보다 비싸지만 약간의 차이이니 이것을 추천한다. 나도 213이 너무 작아서 다음에 구입 예정이다. 


    213은 머리 맡에 가져다 대면, 손전등이 켜지게 하거나, 블루투스 오디오를 바로 연결하게 하는 등 보안과 상관 없는 간편작업에 쓰면 좋을 것이다.

    비밀번호는 원문공개를 항상 조심하자. 몇년전에 한국물리학회홈페이지에서 비밀번호 찾기를 했는데, 원문이 그대로 와서 식겁했다. 그 때 이미 불법이었는데... 그러고서도 몇년동안 그대로였는데, 여기는... 비밀번호가 털렸는지 확인조차 제대로 안되었을 것 같아서.. 걱정을 많이 했는데 여러분도 그럴 필요는 없으니, 대충 쓰는 비번은 중요한 비번과 겹치지 않게 잘 하자. 

    2020년 8월 24일 월요일

    Linux Desktop 에서 F13-F24키 셋팅하기.vim 으로 파일 수정.

    오래전 PC가 아주 비싸던 시절에는 당연히 키보드가 비싸도 티가 안났고, 대량생산을 통해 단가를 낮출 필요가 없었다.

    어차피 전체 영역에서 키보드가 얼마나 차지하겠는가. 그러다보니 참 다양한 키보드가 존재한다. 

    google에 IBM keyboard F24라고 검색을 해보라. 크고 아름다운, 2줄 기능키가 등장한다. 거기다가 들어본 적도 없는, 수많은 특수 키들이 좌측에 자리잡아 있는 것을 볼 수 있다. 

    그런데 현실은? 인기있는 키보드 몇말고는 50달러 이상 가는 것도 잘 없다. 

    그러면 뭔가 표준스러운 한가지 모델로 모두가 통일해서 공장에서 대량생산을 하는 방법으로 간다. 고로 역사적으로 사라진 수많은 키들이 있다. 

    그 중의 하나가 F13-F24키이다. Apple키보드의 경우에는 F13-F15가 프린트스크린 스크롤락 멈춤 자리에 가 있는 경우도 있고 심지어 넘패드 윗쪽으로 F16-F18,F19  3개 또는 4개가 있는 경우가 있지만, 뭐 여전히 마이너 하고, F15까지 있는 키보드는 모양 자체는 별차이가 없다. 

    애플키보드라는 놈이 있다보니, 종종 그래도 쓸 수 있는 키보드다. 고로  F키의 경우는 아직도 GUI 개발용 라이브러리에서 대부분 지원한다. 지원하지만 아무것도 맵핑 되어 있지 않을 뿐이다. 

    그러면 어떻게 이 들을 사용할 수 있을까, 소위 윗글쇠라 부르는 ⇧Shift (ISO Level 2 Key) 를 사용할 수 있다. 위키피디아를 보니, Modern windows keyboard(??)의 경우는 그렇게 사용한다고, 한다. 


    수많은 어플리케이션들이 범람하다보니, ctrl, alt, win,shift 조합을 매우 많이 하게된다. 이미 우리가 알고 있는 키들은 내가 사용하지 않더라도 누군가가 사용할 컴퓨터에서는 이미 사용되고 있을 수 있다.   

    이럴 때는 어떻게 하나... ISO_LEVEL 3 Shift Key를 사용하면 된다. 보통은 AltGr키라고 많이 부르는데, 문자영역에서 Shift외의 더 많은 키가 필요할 때 많이 사용된다. 영어 키보드에서 다양한 유럽어 키보드로 바꿔야 할 때 많이 사용한다. 독일어만 해도, 모양이 다른건 ß나 öäë 정도 말고는 필요하지 않지만, 대소문자로 나뉘어 있으므로 shift키는 쓸 수 없으니 잘 안쓰는 오른쪽 alt를 변형헤서 사용하는 방법 중 하나이다. 

    아니면, Scroll Lock키를 사용해도 된다. (다 그런지 모르겠는데 Scroll락 키는 있지만 그냥 일반 키처럼 작동하고, LED도 스위치로도 따로 조정하지 않으면 작동을 안했다. )  

    리눅스 윈도우 매니저가 엄청나게 가볍지만 않다면, 설정에 들어가 키보드 설정에서 할 수 있다.  아마 이미 왼쪽 CapsLock을 ctrl로 쓰는 등으로 할 줄 알거라 생각한다. 

    AltGr을 쓰려면 위에서 방법을 찾아보고 없으면,  keyboard profile에 AltGr이 들어간 친구를 열심히 찾으면 된다. 그러면 오른쪽 Alt는 AltGr로 작동한다. 관련 글은 다음에 쓰도록 하고, 이 키를 통해 altgr F1을 F13으로 사용해 보도록 하자. (내가 쓰는건 US. International AltGr. with Dead Key 였던가)

    분명히 root를 사용하지 않고 쓰는 방법이 있을텐데 그건 나중에 찾아서 고치도록 하고, 나는 다음처럼 사용한다.

    /usr/share/X11/xkb/symbols/srvr_ctrl 파일을 열어 다음처럼 수정한다. 

    vim 명령을 사용하면 단숨에 가능.

    :g/^\s*symbols/s/F\(\d\+\), .*F\(\d\+\), .*F\(\d\+\), .*F\(\d\+\),/\="F". submatch(1).", F".submatch(2).", F".(subm
    atch(3)+12).", F".(submatch(4)+12).","/

    symbols로 시작하는 줄에서 F숫자, 4개의 조합으로 이루어진 것을 모아다가, 첫번째꺼는 그대로, 3번째 4번째는 12를 더하도록 만들었다.   이걸 사용하고 level3를 사용할 수 있는 상태로 만들었다면,

    level3+F1 은 F13으로 작동한다. apple키보드를 기본베이스로 하지 않는이상 아무작동도 없으므로 단축키로 쓰기 알맞다 

    13   type="CTRL+ALT",
    14   symbols[Group1]= [ F1, F1, F13, F13, XF86_Switch_VT_1 ]
    15     };
    16  
    17     key <FK02> {
    18   type="CTRL+ALT",
    19   symbols[Group1]= [ F2, F2, F14, F14, XF86_Switch_VT_2 ]
    20     };
    워낙은 X-window상에서 ctrl+alt+F{1..12}로 가상터미널을 여는 키로 쓰러고 만들어 놓은건데

    들어와서 Level3과 Level4가 Level1,Level2와 동일하게 F1,F1,F1,F1로 되어 있는것을 12씩 더해서 수정해 놓은 것이다. 

    위와 같이 설정하면 ISO Level 3 Shift키를 누를경우 F13등을 사용할 수 있게 되고.  Shift키까지 누를경우도 문제 없이 조합하여 사용가능하다. 

    단축키 설정이야 항상 내맘대로 할 수 있는 방법이 있지만, 겹치지도 않아야 하고 재사용하기 쉬어야 하기 때문에, Level 3 Shift와 펑션키를 이용하면 아주 좋다. 

    일단, 맥이 아니므로 이미 사용되는 경우가 없다. 펑션키는 크기 3부분으로 4개씩 분류가 되어있어 사용이 용의하다. 예를 들면 트리플 모니터를 쓰는데 각 모니터별로 회전을 시킨다거나, Blender 등에서 XYZ축의 회전값을 0,90,180,270로 즉시 변환한다거나 하는 식으로 사용할 수 있을 것이고, 재사용때 잊어 먹어서 못쓰는 경우도 보기 어렵게 잘 할 수 있다. 

    뭐 어떻게 쓰는건 자유지만, 지금 막 바꾸어서 머리속으로 말고는 막 자랑하기는 어렵다. 


    AltGr키는 지금 Compose라는 키랑 더불어 오른쪽 alt ctrl을 바꾸어 사용하고 있는데, 매우 유용하다. 이걸 더 어떻게 활용할까 하다가 F키가 24까지 있다는 소문에 조금 확장해 보았다. 

    새로 글을 파겠지만, 현재 어떻게 쓰고 있냐면, AltGr+g 를 누르거나 순차적으로 compose,g를 누르면  <dead_greek>키가 작동하고, 이상태에서 알파벳키를 누르면 해당하는 그리스어 알파벳이 나오도록 하였다.
    (어떻게 설정했는지는 모르겠지만, 이 그리스어 알파벳이 kile이라는 Latex 작성 툴에서 \alpha와 같은 방식으로 바로 나온다. ..  .. )

    αβδεφγηκ  이거 말고도 다양한 dead키가 있는데, 위에 점이 있거나 모자가 있거나 한 단어들을 입력할 수 있고, 이거 전부 내가 마음대로 설정할 수 있어서 제대로 다루고, 설정을 그대로 잘 옴기면 평생 키보드 재미있게 쓸 수 있다. 다음에 따로 작성한다. 

    2020년 6월 12일 금요일

    랑그릿사2 스펠 정리.

    스펠 데미지 정리 

    LvMRngMLv
    1
    2+1
    3
    4+1+1
    5
    6+1
    7
    8+1+1
    9
    10+1

    Reference : https://strategywiki.org/wiki/Langrisser_II/Spells

    랑그릿사의 마법시스템은, 마법 사용자의 레벨만 가지고 따진다. 
    위저드가 더 강한마법을 쓴다거나, 나이트가 마법이 약하다거나 그런건 없다.

    이 레일이란 말은 Tier까지 포함한 말이다. 

    표에서 나오는 것 처럼, LV이 4, 8에 도달할 때 마다 범위마법의 범위가 1씩 늘어난다. 마법 사거리까지 포함하는지는 나중에 확인 후 고친다. 

    또 마법LV인 MLV이 2,4,6,8,10에 도달할 때, 1씩 늘어난다. 

    또  Tier에 따라서 +1씩 또 늘어난다고 한다. 하지만 지금 참조한 페이지는 통합 되어 있다. 

    예를 들어 워락은 나이트,+0, 실버나이트 +1, 하이랜더 +2 나이트마스터 +3
    이런 식이다.  

    소환수들과 용병들은, 개발자가 제대로 고려를 하지 않아서, 데몬로드 같은 친구들은 1티어라... 마법 범위가 그 모양이다. 그래도 이 친구들도 레벨은 가지고 있으니, 최종 레벨이 되면 약간의 보너스는 얻는다. 
     Spell    Formula   Range  Cost Special (MDmg)
    매직에로우0 + MLv*2  5 1 
     Blast20 + MLv  2 10 
     Fireball3+ MLv  4/3 2 
     Meteor10 + MLv  10/2 8 
     Thunder5 + MLv  7 4물위의 적 +1 보너스 
     Tornado4 + MLv*2  0/3 2비병에게 +1보너스 
     Blizzard4 + MLv*2  0/4 3 
     Earthquake10 + MLv*2  0/5 12 공중유닛 무피해.

    매직에로우는 파이어볼보다 강할 수 있다. 다만 그래봐야 큰 차이는 나지 않는다. 

    블라스트는 매우 강력한 대신, MLv에 따른 차이가 거의 없다. 

    파볼은 가장 기본적인 범위 마법이지만, 매직에로우보다 기본 데미지가 강하다.  뭔가 게임 설계가 잘못 되었다. 

    메테오는 강력한 기본데미지를 가지고 있는 범위 마법이다. 

    썬더는 물위에 유닛에게 더 많은 데미지를 주는 부대단위 마법이다. 극초반에는, 파이어볼보다 더 많은 데미지를 줄 때가 있다. 

    토네이도는 시전자 중심으로 사용하는 마법이다 보니, MLv추가 공식이 조금 다르다. 배우기 어려운 것이 단점이다.  범위가 블리자드보다 조금 작고, 비병에게 추뎀이 들어가서 뭔가 또 설계가 잘못되었다는 것을 알 수 있다. (마나소모가... 작음.)

    블리자드는 토네이도보다 마나는 많이 쓰지만,  같은 데미지를 준다. 이상한 마법이지만, 쉽게 배울 수 있다. 설계미스인 것 같은 느낌이다. 

    어스퀘이크는 메테오와 같은 기본데미지에 시전자 중심 마법특징인 추가데미지를 가진 마법이다. 사용시 노포병은 죽었다고 봐야한다. 


    실제 적용 

    실전에는 저 데미지가 그대로 들어가는 것이 아닌, 각 유닛의 마법 방어력, 레지스트 마법, 착용 아이템에 따라 데미지가 변화되어 적용된다. 

    유닛별 기본 마방인 MDF
    그리고 보너스 MDF

    최종 마법 방어력은 다음과 같다 . 

    total MDF = MDF + bonus MDF  x 2 
    이 값이 100을 넘으면, 마법에 완전 면역을 얻게된다. 

    만약 [0,100) 사이의 값이라면 다음과 같은 공식을 적용한다. 

    =Max( Integer((( 100 - (total MDF) ) * MAT ) / 100 ) + MDmg , 1 ) 

    면역이 아니라면 무조건 1의 데미지는 입는다. 위에 Integer는 내림연산으로 정수값만 얻는 것이다. 마법 저항력이 1이라도 있으면, 데미지를 1은 줄일 수 있다. 

    버그로 인해, 아뮬렛을 착용한 지휘관은 100을 넘어도 아래식만 적용해 1의 데미지를 입는다. 


    변수 

    Resist Spell : 비용2 사거리 8 부대단위, MDF+25


    2020년 5월 26일 화요일

    VIM 환경을 위한 fcitx 설정. ESC를 누르면, 비활성화 되도록,


    fcitx는 비활성화 상태가 1번 IM이다.

    데스크탑에서는 "미국 영어(국제, AltGr DeadKey포함)"으로
    랩탑에서는 "미국 영어" 또는 "한국어 104key"로 설정한다.



    두번째 칸은 원하는 한글입력기로 설정한다. 나 같은 경우는 신세벌 P2방식이다.
    (갈마들이를 이용해, 공세벌식 비스무리한걸 숫자키 영역 침범 없이 해결)




    한글을 입력하다 보면, vim에서 사용하는 i, o,v, y, p 같은 키들을
    노말모드에서 사용하려고 할 때,

    한글이 나와서 낭패를 보는 일이 많다.


    이것을 해결하는 방법은 여러개가 있다.

    1. vim상에서 자체적으로 한글입력을 탑재하게 하여 입력모드시에만
        IM이 작동하도록

    2. vim에서 esc버튼을 누르면, xim에 IM disable message를 보내도록 하는 방법

    3.  사용하는 IM자체적으로 ESC를 누르면 그렇게 되도록.


    아래는 삽질의 결과물들이다.  그냥 2번으로 하자.  vim8이나 nvim을 쓰면서,  python3-dbus 와 같은 패키지가 필요할 것이다. 쉘에다가 바로 보내는 것도 해봤는데, 화면에 글자가 안보이는 등 이상한 결과들이 나온다. 그리고 먼가 filter로 사용할 때 말고는, 제대로 작동이 되는지도 의문이 생겨서 python으로 dbus call을 하도록 한다.

    .vimrc에 다음과 같이 입력한다.


    흠 특수문자들이 날아가서 그림으로 보이도록 하겠다. 를 쓰면 작업이 많음.


    아래쪽은 삽질의 기록이다.

    2020년 2월 11일 화요일

    한눈에 보는 Blending mode 색섞기. (on GIMP)



    Top Layer


    Bottom Layer


    일단 다음처럼 두개의 레이어를 만들고, 여러 효과를 넣어본다.
    편의상 여기서는 integer 8bit 로만 나타내며 0-255로 표현한다.
    gimp 최신버전 코드를 깟는데 float로 계산한다.

    가장 많이 쓰는 Screen 과 overlay 그리고 Multiply(곱)
    Screen
    Overlay

    Multiply












    in이 top이고 layer가 바닥이다. 
    comp[c] = in[c] * layer[c];

    0-1값으로 생각하면 쉽게 어두워짐을 알 수 있다.  이 다음부터는 그림만가지고 이야기한다.

    그림은 많이 쓰이는 순서이지만 설명은 Multiply부터 하는 것이 쉽다.



    comp[c] = 1.0f - (1.0f - in[c]) * (1.0f - layer[c]);
    Screen은 반전 후 곱한 색상을 반전하는 것과 같다.  반대로 좀 더 밝아 짐을 볼 수 있다.


    Overlay부터는 top layer와 bottom layer가 서로 동등하지 않다. 일단 normal모드 부터 동등하지 않으므로 이상한 것은 아니다.
    if (in[c] < 0.5f)
          val = 2.0f * in[c] * layer[c];
    else
         val = 1.0f - 2.0f * (1.0f - layer[c]) * (1.0f - in[c]);
    
    무언가 복잡하다.  Screen과 Multiplay의 중간 느낌이다.
    아직 메뉴얼은 그대로지만 photoshop으로 대동단결 했다.
    Hard light에서 복사해오자.

    Top Layer를 흰색에서 회색, 회색에서 검정 두부분으로 나누어,  어두운곳은 Multiply효과를  밝은 곳은 Screen효과를 준다. 
    중간영역의 대비가 커진다. 그 결과 색상이 강해지고, 경계가 날카로와 진다.


    다음은 LightenOnly와 DarkenOnly이다.
    각값에서 밝은 값과 어두운 값을 취한다.
    comp[c] = MAX (in[c], layer[c]);
    comp[c] = MIN (in[c], layer[c]);






















    다음은 Burn과 Dodge이다.

    Dodge
       256 x B / { (255-T} +1 }
    comp[c] = safe_div (in[c], 1.0f - layer[c]);


    Burn
    255- 256x (255-B)/{ T+1}
    comp[c] = 1.0f - safe_div (1.0f - in[c], layer[c]);
    Dodge의 반대로 작용한다.

    Linear burn
    그냥 덧셈이다. clipping이 될 수 있다. 
                comp[c] = in[c] + layer[c] - 1.0f;
    
    

    다음은 조명 계통이다.  
    Hard light, soft light, vivid light pin light 등이다. 

    Hard light
     255 - (255-2(T-128)) x (255-B) /256   if T > 128
      2 x T x B                                             if T <=128

    Top Layer를 흰색에서 회색, 회색에서 검정 두부분으로 나누어,  어두운곳은 Multiply효과를  밝은 곳은 Screen효과를 준다. 
    중간영역의 대비가 커진다. 그 결과 색상이 강해지고, 경계가 날카로와 진다.
     if (layer[c] > 0.5f)
    {
         val = (1.0f - in[c]) * (1.0f - (layer[c] - 0.5f) * 2.0f);
         val = MIN (1.0f - val, 1.0f);
     }
     else
    {
          val = in[c] * (layer[c] * 2.0f);
          val = MIN (val, 1.0f);
    }
    
     Overlay와 동등한 식이지만, 기준이 bottom layer이다. in <-->layer를 하면, 같다. xy축을 바꾸면 바로 알 수 있다. 
    Soft light
    이름과 달리 Hard light와는 별관련이 없다.  Screen Mode와 매우 유사하다.

    멏몇 버전의 GIMP에서는 Screen과 같다. ( 계속 다시 옜날로 가는 경우가 있나보다. )

    스크린된 Pixel을 S라고 하자. 

    S= 255 - (255-T) x (255-B) / 255

    {  (255-B)xT + S} x B / 255   이다. 다만 홈페이지에 오류가 있는 것으로 보인다. 앞항도 255로 나누어야한다. 

    무언가 식만 보고 이해하기는 어렵다. 그리고 제대로 적용될지 확신할 수 없기에 쓰면 안될 것으로 보인다. 나머지는 gimp의 코드를 까봐야할 것 같다. 
    일단 여기까지 작성하자. 

    gfloat multiply = in[c] * layer[c];
    gfloat screen   = 1.0f - (1.0f - in[c]) * (1.0f - layer[c]);
    gfloat val      = (1.0f - in[c]) * multiply + in[c] * screen;
    
    
    상위 픽셀에 따라, multiply와 screen을 얼마나 섞을지 정한다. 


    Vivid light
    if (layer[c] <= 0.5f)
    {
         val = 1.0f - safe_div (1.0f - in[c], 2.0f * layer[c]);
         val = MAX (val, 0.0f);
    }
    else
    {
         val = safe_div (in[c], 2.0f * (1.0f - layer[c]));
         val = MIN (val, 1.0f);
    }
    

    Overlay처럼 구간을 나누어, dodge와 burn을 적용한다.

    Pin light

    이것은 lighten과 darken을 조합하는 것 같다.
     if (layer[c] > 0.5f)
                    val = MAX(in[c], 2.0f * (layer[c] - 0.5f));
                  else
                    val = MIN(in[c], 2.0f * layer[c]);
    



    Linear light

    if (layer[c] <= 0.5f)
         val = in[c] + 2.0f * layer[c] - 1.0f;
    else
         val = in[c] + 2.0f * (layer[c] - 0.5f);
    
    그렇다.




    더하기 .

    comp[c] = in[c] + layer[c];






    빼기, 차이 






    2019년 9월 28일 토요일

    히어로즈 메뉴얼 정리된거 보다가 혹했으나 아닌 내용.


    망각 마법이 걸린 유닛은 근거리 패널티가 없는 유닛도 생긴다고 적혀 있으나, 컴플리트 버전, hota1.5.4에서는 그렇지 않다는 것을 확인함.

    타이탄한테 걸어보았으나... 그런거 없었음.

    관련 글보니 영문커뮤니티에 관련 내용이 있으나, 거긴 법사할배로 한 내용이라 알아볼 예정.

    2019년 9월 10일 화요일

    음 ??? 도대체 USB-MIDI 인터페이스는 왜 만든거야??"?

    https://www.gearslutz.com/board/electronic-music-instruments-and-electronic-music-production/1112683-do-usb-midi-interfaces-send-midi-faster-than-midi-spec-2.html

    단순히 입출력을 한 선으로 처리하려고 한건가...


    사람들이 USB랑 DIN 인터페이스 속도차이를 가지고 막 이야기를 하고 있는데


    usb-midi 스펙 작성자가 나와서 결론을 내주는데...



    daw상에서 미디로 떠있는 친구들은 호환성을 위해서 31.25kbit이상의 패킷 전송을 안한다고 해버리는구만...




    뭐 그래서인지... DAW상에서 MIDI가 아니라 그냥 장치이름으로 바로 인식해서 쓰여지기는 하더만... 이게 무슨 짓거리인지...

    USB를 쓰는 이득이 없는데 왜 USB???

    MIDI 2.0에서는 이게 개선되는것은 맞는건가???



    아니면 작성자도 제대로 모르는건가???

    과연 DIN MIDI 정도의 속도로 MIDI Wind Instrument의 데이터를 처리할 수 있나??

    뭐여

    2019년 7월 8일 월요일

    카카오스토리에서 댓글 삭제 당했다.

    원본을 볼 수 없어서 모르겠지만

    자동차 음주 뺑소니 사건에 대한 내용이겠지...

    에휴...

    2019년 6월 28일 금요일

    2019년 6월 27일 - 뉴스.

    양현석은 어떻게 내사종결될 것이라는 사실을 알고 있었을까???

    블러핑일까? 경찰에서 내부정보가 새고 있는 것일까???
    http://imnews.imbc.com/replay/2019/nwdesk/article/5381596_24634.html

    27일 양현석은 조사 받으러 나갔고, 버닝썬 관련 법원 출석이 있었지만 28일 새벽인 현재 YG나 버닝썬관련 기사가 daum 연예 많이 본 뉴스 1-30위까지에 '최종훈 정준영 직업은 무직 '으로 4위에 올라간 것 말고 없다. 

      여기는 차트를 볼 때도, 의심이 갔는데, 조회수를 만지는 어떤 방안을 가지고 있는게 아닐까라는 생각을 한다. 주어는 daum kakao일 수도 YG일 수도 있고 주어가 심지어 없을 수도 있다.

    송송 커플 이혼 조정 이야기 

    태양의 후예를 안봤고, 송중기 나오는 드라마는 본 적 없고, 송혜교 나오는건 순풍산부인과 밖에 없어서, 관심이 좀 덜 했는데, 하루 종일 언론에서 때려대니까? 강제로 관심이 가게 된다. 이거 뭐임??? 
      거기다, 박보검까지 시끄럽다. 아 박보검 나온 것도 본적이 없다. 

    정준영 최종훈 법원 출석 

    C.N.Blue 이종현하고, 빅뱅 승리는 왜?? 같이 법원에 출석하지 않았을까??

    승리는 조사라도 받았다는 보도가 한달전에 있었지만, 이종현은 군검찰에 수사를 받았는지? 검찰에 수사를 받았는지에 대한 기사가 없다. 

    아니 북한 통통배가 강원도로 내려와서, 시끄러운 와중에도, 언론을 잠재우는 카드로 이종현을 사용하지 않은 것을 보면, 그냥 조용히 군 안에서 문제를 지우려는게 아닐까 의심이 든다. 

    한국당, 女당원 '바지 내리고 엉덩이춤' 논란..여야 "저질 행태"  

    흔한 자유당이 자유당한 사건이다. 

    가장 많이 본 글