전체 글

    웹브라우저에서 푸시 알림받기

    HTML5 Notification API 웹브라우저 → 클라이언트로 알림기능을 전송할 수 있는 기능을 html에서 API로 제공한다. 사용 방법은 크게 두단계로 권한 허용 메시지 전송 으로 끝. 알림 권한 허용 Notification.requestPermission(); 위 메소드를 호출하면 브라우저에 알림창이 뜨면서 사용자에게 현재 페이지에서 알림을 허용할지를 물어본다. var permission = Notification.requestPermission(); console.log(permission) 이렇게 해서 어떻게 나오는지 보면 허용시 Promise.PromiseResult 메소드값이 granted로 나온다. 차단하면 denied로 바뀌어 나옴. //알림 권한 요청 function getNoti..

    웹소켓 in Flask

    웹소켓을 쓰는 상황? HTTP - 클라이언트 웹 브라우저 요청에 의해 서버가 응답하고, 이를 가지고 다시 클라이언트를 갱신 - 매 요청시마다 페이지 전체를 갱신하는 "동기적" 문제 발생. 즉, 통신할 때 마다 페이지 전체를 새로 랜더링해야하는것. AJAX - 동기적 문제 해결을 위해 클라이언트 XMLhttpRequest 객체의 요청에 의한 서버 응답을 받아 페이지를 갱신하지만, 페이지를 이동하거나 전체를 갱신하는것이 아닌 페이지의 일부를 구성하는 DOM을 갱신할 수 있게됨. 그러나 여전히 요청에 의해 서버의 응답을 받아 페이지를 갱신한다는 문제점은 여전함. 웹소켓을 이용하면 클라이언트의 별도 요청없이도 서버에서 보내는 데이터를 받아 페이지에 표현할 수 있음. 클라이언트의 요청 - 서버의 데이터 응답 의 ..

    JS-autocomplete 사용시 발생한 버그

    Unsigned Complete autocomplete를 이용해 위와 같이 자동으로 리스트가 출력되는 코드를 만들어놓고, 나열되는 목록 중 하나를 클릭하면 해당 내용대로 datatable에 있는 데이터를 필터링하게끔 코드를 짜놨었다. //autocomplete 클릭했을떄 자동으로 테이블 변경 $(document).on('click','.ui-menu-item',function(){ var idx= $(this).parent(".ui-menu").attr('id').slice(-1)-1 console.log(idx) gtable.column(idx).search($(this).text()).draw(); }); 이렇게 하면 ul의 id인 "ui-id-10" 안의 맨 끝 숫자를 받아와 자동으로 테이블의 co..

    flask에서 sql을 사용하는 방식

    flask에서 sql을 사용하는 방식 크게 두가지 정도 있는듯. query_engine에 포함시켜 쿼리를 날리고 결과를 받는 방식 정의된 model 자체를 받아 사용하는 방식 query_engine 방식 #query_engine.py def TaskQuery(): sql = "SELECT * FROM task_list" lresult = db.engine.execute(sql) return lresult ~~~ #task_view.py result = query_engine.TaskQuery() ~~~ return render_template('/task/taskOverView.html',data=result) query_engine에 사용할 쿼리문을 정의하여 sql 쿼리 실행 결과를 받아와 사용하는 방..

    Flask에서 MD 문서 랜더링 + 디렉토리 하위경로 dict로 파싱해서 Jinja에서 출력하기

    디렉토리 하위 경로를 dict 형태로 파싱하기 최종 목표 : md 문서가 있는 디렉토리 경로를 읽어와 웹페이지에서 마크다운 문서를 랜더하는것. 디렉토리 받아서 하위 경로 DICT + list 형태로 자동 파싱해주는 코드 만들기 def readdir(dir): tdir = {} ret = {} tdir['dir'] = [] for file,key in dir.items() : if key == None : tdir['dir'].append(file) else : ret = readdir(key) ret['fname'] = file tdir['dir'].append(ret) return tdir def dirparser(rootdir): dir = {} res = os.walk(rootdir) rootdir..

    Jquery/Bootstrap 잡기술 : DataTables 확장모듈 커스텀, 클릭-모달창 생성 이벤트 대응, 상위-하위요소 접근 등

    부트스트랩 dataTables 확장모듈 커스텀 SearchFilter 에 자동으로 생성되는 lable 태그에 float-right 속성을 추가하고 싶음 jquery.dataTables.js 파일 var filter = $('', { 'id': ! features.f ? tableId+'_filter' : null, 'class': classes.sFilter } ) .append( $('' ).append( str ) ); var filter = $('', { 'id': ! features.f ? tableId+'_filter' : null, 'class': classes.sF..

    플라스크 & 파이썬 - 경로확인, 파이썬 설치 패키지 확인, 플라스크 환경변수 설정 및 실행, 플라스크 SCSS 모듈,

    파이썬 경로 확인 import sys sys.executable 플라스크 환경변수 설정하고 실행 set FLASK_APP=폴더이름 flask db init flask db migrate flask db upgrade python -m flask run 파이썬 설치 패키지 확인 및 내보내기 pip freeze > requirements.txt flask scss 사용 pip install flask-assets pip install scss from flask_assets import Environment, Bundle # SCSS assets = Environment(app) assets.url = app.static_url_path scss = Bundle('sb-admin-2.css',filters=..

    [hooking] 7. D3D Hooking : Dummy Device

    DirectX의 동작 방식 DirectX를 이용하기 위해선 d3d를 초기화 하고 d3d 디바이스를 생성하는 작업이 우선되어야 한다. 정석적인 d3d 개발의 순서는 다음과 같다 생성하고자 하는 윈도우 클래스 등록 윈도우를 생성하고 화면에 표시 생성된 윈도우의 핸들을 가져와 Direct3D를 초기화 메시지 루프 및 루프 종료시 초기화한 D3D를 메모리에서 해제 프로그램 종료 여기서 우리는 이미 생성된 윈도우에 후킹을 걸었으므로 1~2의 과정은 불필요하다. 현재 후킹을 걸어놓은 윈도우의 핸들(HWND)만 가져오면 된다. 4번의 메시지 루프는 openGL 이나 GDI때 사용했던 그 메시지를 가리키는게 맞다. OS가 윈도우 프로세스에 보내는 메시지에 따라 동작시키는 부분이다. 현재 우리는 후킹을 진행하여 Ends..

    [hooking] 6. D3D hooking : 실습

    D3D 후킹 한번 해보려다 온갖걸 다 해보고 다시 돌아왔다. 다음과 같은 순서로 D3D 후킹이 진행된다. 코드 패턴찾아 Vtable로부터 EndScene 함수 주소 찾아오기 Detour 함수 이용해 코드 패치 trampoline으로 점프하여 후킹함수 실행 후킹함수 실행하여 원하는 동작 수행 Trampoline - 원본함수로 돌아가 EndScene 함수 마저 실행됨 EndScene의 Vtable 주소 가져오기 이전 문서에서 찾은 헥스코드 패턴을 이용해 vtable 주소값을 얻어올 것이다. C7 06 ?? ?? ?? ?? 89 86 ?? ?? ?? ?? 89 86 ?? ?? ?? ?? DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMa..

    [Hooking ] 5. TLS + TLS CallBack

    D3D 후킹 관련 코드를 찾다보니 아래와 같은 예제 코드를 볼 수 있었다. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved ) { switch( fdwReason ) { case DLL_PROCESS_ATTACH: { DisableThreadLibraryCalls(hinstDLL); StartD3DHooks(); return true break } case DLL_PROCESS_DETACH: { MessageBox(NULL,L"detach dll!", L"ok", MB_OK); break } } return TRUE; } 일단 예제에서 소개하는 코드를 보면, DisableThreadLibraryCalls() 라는 함수가..