Blog Logo 블로그 주인장 필명: 노모
필요 시 부담 없이 메일주세요 ^^ ↓
Contact Email
카테고리
분류 전체보기 (127)
이 블로그는... (2)
(0)
먹을거 (9)
게임 (17)
지름 (9)
여행 (1)
정보 (57)
사진 (1)

setMuted function

According to the link below, twitch player inserted by javascript can be muted with the setMuted() function.

https://dev.twitch.tv/docs/embed/video-and-clips#synchronous-volume-controls



setMuted(false) works fine to unmute.

However, setMuted(true) does not work to mute.


setVolume(0.0) can be used instead of setMuted(true), but the volume is not recovered when player is unmuted.

Of course, before the player is muted using setVolume(0.0), the volume can be stored in a variable.

But it is not clear.




Functions that can be used instead of setMuted(true)

player can be muted by following function instead of setMuted(true).


player._sendCommand("setMuted", [true]);


I tested it on Chrome 71.0.3578.98 and it worked.

_sendCommand is a function in the https://player.twitch.tv/js/embed/v1.js file that you load to use embed twitch.

So, you do not need to write _sendCommand function.




Why setMuted(true) does not work

Below are some of the contents of https://player.twitch.tv/js/embed/v1.js 



_sendCommand function requires an eventName and a parameter as input variables.



But only when using the setMuted function, input variables are not passed exactly.

I do not know why this part is written in this way.

Leave a comment

CLOP

요즘 Twitch 에서 CLOP(http://www.foddy.net/CLOP.html) 라는 만들어진지 좀 된 플래시 게임이 유행이다.


게임을 해본 사람이라면 알겠지만 앞발(H or K) 키만 누르는 꼼수가 있는데,

앞발만 쓰는 경우 Lame Horse Mode Unlock 이라는 메시지가 뜨며

뒷발이 망가지고 게임 오버가 되도록 꼼수를 막는 장치를 게임 개발자가 만들어놓았다.



Lame Horse Mode가 되는 정확한 조건을 알고 싶어서 소스코드 분석을 해보았다.

여기서 웃긴 부분이, 뒷발이 망가지는 것을 유저한테는 Lame Horse Mode(절름발이 말 모드)라고 보여주는데

소스코드 내에서는 이러한 상황을 Loser Mode(패배자 모드) 라고 칭하고 있었다 -_-ㅋㅋ

분석 결과 뒷발이 망가지는 것에 대한 조건은 두 가지가 있고, 둘 모두가 만족되면 뒷발이 망가지게 된다.



뒷발이 망가지는 조건 (Lame Horse Mode가 되는 조건)

조건1 - 앞발을 누른 횟수에 대한 게이지

앞발을 누른 횟수에 대한 일종의 게이지(frontKeyCount)가 있고, 초기값은 0 이다.

앞발(H or K) 을 누르면 해당 게이지는 +1

뒷발(J or L) 을 누르면 해당 게이지는 -2 가 된다.


게이지가 100이 되면 Loser Mode 의 첫번째 조건이 충족된다.

(단, 뒷발을 아무리 미리 눌러놔도 해당 게이지는 -50 미만으로 내려가지 않는다)



조건2 - 앞발을 연속으로 누른 횟수

앞발을 연속으로 5번 초과하여 누른 경우(frontKeysInARow) Loser Mode의 두번째 조건이 충족된다.



뒷발이 망가지려면 조건1과 조건2가 동시에 만족되어야 한다.

따라서 게이지가 100을 넘은 상태에서, 앞발을 연속 5번 이상 누른 상태라면 뒷발이 망가지게 된다.

패배자가 된다!



결론: 뒷발이 망가지지 않으려면?

앞발을 연속 100번 이상 누르지 않는 것이 가장 좋다.

또한 앞발을 누른 횟수의 절반 만큼은 뒷발을 눌러줘야 한다.



팁:

찜찜한 경우 뒷발을 75번 미리 눌러놔주시면 게이지가 -50이 되어 안심!

이후 게이지가 100이 되는 최대 150번 까지 앞다리 얌시를 쓸 수 있다.



참고) 많이들 쓰는 콤보인 HJK 를 반복해서 누른다면

H +1

J -2

K +1

이므로 게이지가 증가하지 않는다.

'게임' 카테고리의 다른 글

CLOP 뒷발이 망가지는 조건(Lame Horse Mode Unlock)  (0) 2019.01.26
Visitor 방문자 공략 (스포)  (1) 2018.07.09
위쳐3 지름  (0) 2017.05.06
마비노기 영웅전 복귀기 (1)  (0) 2015.01.31
앨리샤 교배의 부질 없음 특집  (0) 2011.02.12
마이트앤매직  (0) 2011.01.30
Leave a comment

Selenium 사용 중 페이지에 JavaScript 를 삽입하려다가…

Selenium 을 사용하다가 웹페이지 내에 JavaScript 를 삽입하고 싶은 경우가 생겼다. 내 경우에는 어떤 웹사이트에서 '더보기' 버튼을 눌러 내용을 계속 읽어오며 배열에 저장했는데, 내용이 많~이 쌓이면 느려지기 때문에 이미 내용을 읽은 element 는 없애버리고 싶었다.

이 외에도 나는 Selenium 과 관련된 라이브러리보다는 JavaScript 를 더 잘 쓰기 때문에, 적당히 섞어쓰면 코드 작성이 훨씬 편해질 것 같았다.


Selenium의 execute_script 함수를 쓰면 JavaScript 를 사용할 수 있기는 하지만 순수한 JavaScript 만 써야했다.

그래서 jQuery 를 사용하려고 <head>와 </head> 사이에 jQuery 를 동적으로 로드하는 스크립트를 삽입했다.


from selenium import webdriver
import time
import os

url = "https://play.google.com/store/apps/details?id=com.google.android.googlequicksearchbox"
CHROME_EXE_PATH = r'크롬 드라이버 파일 경로\chromedriver.exe'

# 브라우저 설정
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path=CHROME_EXE_PATH, chrome_options=options)
driver.implicitly_wait(1)

# 크롤링 대상 링크 접속
driver.get(url)

# jquery load
jScript = """
  var script = document.createElement('script');
  script.type = "text/javascript";
  script.src = "https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js";
  document.getElementsByTagName('head')[0].appendChild(script);
"""
jScript2 = "console.log('jquery:', typeof jQuery);"
driver.execute_script(jScript)
time.sleep(1)
driver.execute_script(jScript2)

os.system("PAUSE")
driver.quit()


문제 발생

그런데 특정 사이트에서 이러한 짓을 시도하면 아래와 같은 경고가 떴다.


Refused to load the script 'https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js' because it violates the following Content Security Policy directive: "script-src 'report-sample' 'nonce-krsKb/RLOrlIehvKJO965Q' 'unsafe-inline'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback.

Refused to load the script 'https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js' because it violates the following Content Security Policy directive: "script-src 'nonce-krsKb/RLOrlIehvKJO965Q' 'self' 'unsafe-eval' https://apis.google.com https://ssl.gstatic.com https://www.google.com https://www.gstatic.com https://market.android.com https://www.google-analytics.com/analytics.js https://www.googleapis.com/appsmarket/v2/installedApps/". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback.


Contents Security Policy, 줄여서 CSP에 의해 동적으로 스크립트가 삽입되는 것이 막혔다.

참고로 이러한 보안 설정을 위해 웹사이트 제작자는 페이지 내에 몇줄의 Meta Tag만 간단히 삽입하면 된다.


여튼 스크립트 삽입 시도 시 콘솔창에 위 그림과 같은 에러가 뜨는 경우 브라우저 설정에서 CSP를 꺼줘야 하며,
몇가지 방법을 찾아 시도해보았으나 적어도 내 환경(Selenium, Chrome, Python 3.5) 에서 잘 안 되는 경우가 많았다.


그 중 아주 잘 먹히는 방법을 찾아서 본 포스트에 좀 더 상세하게 정리해본다. 출처는 아래의 링크이다.

https://stackoverflow.com/questions/53304222/relaxing-chromes-csp-while-running-tests-webdriver-content-security-policy



Selenium 에서 CSP를 disable 하는 확실한 방법

핵심은 CSP를 차단해주는 확장기능을 Selenium에서 사용하는 것이다.

  1. CSP 차단을 위한 Disable Content-Security-Policy 확장기능을 파일로 다운로드 받아야 한다.
    이를 위해 Chrome Extension Downloader 웹사이트에 접속한 후 extension 페이지 주소인
    https://chrome.google.com/webstore/detail/disable-content-security/ieelmcmcagommplceebfedjlakkhpden 을
    주소 입력란에 붙여넣기 하여 확장기능 파일을 다운로드 받는다.
  2. 다운로드 받은 파일의 확장자를 zip 로 바꾸고, 압축을 푼다.
  3. 압축 파일 내 background.js 파일을 텍스트 에디터로 연다.
  4. isCSPDisabled = false; 를 찾아서 isCSPDisabled = true; 로 바꾼다.
    이 작업을 해주는 이유는 해당 확장기능의 기본값이 'CSP 끄지 않음' 이고 확장기능 버튼을 클릭해줘야 CSP Disable이 되는데, 
    Selenium이 실행된 직후부터 바로 CSP Disable을 하기 위한 것이다.
  5. 다시 zip 로 압축한다.
  6. 확장기능을 불러오기 위한 코드를 작성한다.

테스트한 코드는 아래와 같다. 처음 코드에서 추가해준 것은 확장기능을 불러오는 라인 단 한 줄이다.

from selenium import webdriver
import time
import os

url = "https://play.google.com/store/apps/details?id=com.google.android.googlequicksearchbox"
CHROME_EXE_PATH = r'크롬 드라이버 파일 경로\chromedriver.exe'

# 브라우저 설정
options = webdriver.ChromeOptions()
options.add_extension('확장기능 ZIP 파일 경로\Disable-Content-Security-Policy_v1.0.6.zip')
driver = webdriver.Chrome(executable_path=CHROME_EXE_PATH, chrome_options=options)
driver.implicitly_wait(1)

# 크롤링 대상 링크 접속
driver.get(url)

# jquery load
jScript = """
  var script = document.createElement('script');
  script.type = "text/javascript";
  script.src = "https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js";
  document.getElementsByTagName('head')[0].appendChild(script);
"""
jScript2 = "console.log('jquery:', typeof jQuery);"
driver.execute_script(jScript)
time.sleep(1)
driver.execute_script(jScript2)

os.system("PAUSE")
driver.quit()

실행 결과는 아래와 같다.


이제 페이지가 이동되지 않았다는 전제하에 jQuery 를 Selenium의 execute_script 함수에서 자유롭게 쓸 수 있다.

'정보 > Python' 카테고리의 다른 글

Selenium 에서 CSP를 disable 하는 확실한 방법 (Python)  (0) 2019.01.06
Leave a comment

최종 업데이트: 2018-12-28


나는 ANSYS 학생용을 설치하면서 어떠한 문제를 겪어본 적이 단 한번도 없다. 그런데 블로그 글을 보고 ANSYS 학생용 설치 문제로 메일을 주는 분들이 꽤 많은 것을 보면 ANSYS 설치 과정 중 문제가 자주 발생하는 것 같다.


모르는 사람에게 메일을 보낼 정도면 대부분 어지간히 스스로 문제 해결을 시도해보다가 해결이 안 되는 경우에 보내는 것이기 때문에, 문제가 바로 해결이 되는 경우는 많이 없었다. 몇가지 문제들에 대하여 명확한 해결책은 아니지만 그래도 나름 시도해볼 수 있는 방법들에 대해 정리해보았다. 안타깝지만 확실한 해결책은 아니다. 혹시 각자가 겪은 문제가 있거나, 아래의 문제에 대하여 해결한 본인의 방법이 있다면 댓글을 남겨주기 바란다.



체크리스트

오류 케이스에 대해 설명하기 전에, ANSYS 학생용 설치를 위해 반드시 지켜야하는 체크리스트를 먼저 적어본다.

위에 있을 수록 반드시 지켜야하는 우선 순위가 높고, 지키지 않은 경우 문제가 발생할 소지가 있다.

  1. Windows 계정명은 반드시 영문 명 이어야 한다.
  2. 현재 로그인 한 Windows 계정의 사용자 폴더 경로는 영문이어야 한다.
    예) 사용자 이름이 KIMCHULSOO 인 경우 사용자 폴더 경로는 C:\Users\KIMCHULSOO 이어야 한다. 당연한 것 같지만 이를 확인하는 이유는 사용자 이름이 처음에 한글이었다가 나중에 영문으로 변경한 경우 사용자 폴더 경로는 그대로 한글으로 남아있을 수 있기 때문이다.
  3. 과거에 다운로드 받았던 설치 파일을 이용한 경우 - ANSYS 학생용은 설치파일 내에 라이선스가 포함된 빌트인 라이선스 이므로, 라이선스 기간이 만료되어 설치 후 제대로 실행되지 않을 가능성이 있다. 최신의 설치 파일을 이용하자.
    라이선스 파일은 설치 경로를 바꾸지 않았다면 18 버전 기준 C:\Program Files\ANSYS Inc\ANSYS Student\Shared Files\Licensing\student.lic 에 위치하며, 해당 파일을 노트패드와 같은 텍스트 편집기로 열면 라이선스 기간을 확인할 수 있다.
  4. 과거 컴퓨터 시간을 먼 미래로 돌렸던 적이 있다면 문제가 발생할 수 있는 소지가 있다.
  5. 설치 파일이 위치한 경로는 모두 한글이어야 한다.
    예) C:\ANSYS\ANSYSACADEMICSTUDENT_WINX64 와 같은 경로는 괜찮지만
    C:\유틸\ANSYS\ANSYSACADEMICSTUDENT_WINX64 과 같이 경로 중간에 한글이 포함되어서는 안된다.
  6. 설치 파일은 반드시 관리자 권한으로 실행해주어야 한다.



오류케이스

1. 설치 과정의 마지막에서 다음의 메시지가 나타나는 경우 - The installation completed with warnings/errors. Review any .err or .log files in: C:\Program Files\ANSYS Inc\ANSYS Student


Successfully created file associations.

RSS is enabled


Performing licensing configuration via the following command...

"C:\Program Files\ANSYS Student\Shared Files\bin\winx64\tclsh.exe" "C:\Program Files\ANSYS Student\Shared Files\Licensing\licadmin\scripts\LicAdminMain.itcl" -silentinstallclient -release "18.0" -lang en-us 


Licensing configuration has completed.


The installation completed with warnings/errors. Review any .err or .log files in:

C:\Program Files\ANSYS Inc\ANSYS Student


주요 추정 원인

Windows 계정명이 한글인 경우


해결 방법

포맷 후 Windows 계정 명을 영문으로 생성, 새로운 Windows 관리자 계정을 영문 명으로 생성 후 해당 계정에서 재설치, Windows 계정 명을 영문으로 변경 후 사용자 폴더 경로 변경 등


상세 설명

위 메시지가 나타난 후 다음의 경로 (C:\Program Files\ANSYS Inc\ANSYS Student) 로 가보면, install.err 라는 이름의 파일이 생성되어 있을 것이다. 해당 파일을 노트패드와 같은 텍스트 편집기로 확인하여 문제의 원인을 파악할 수 있다.


위 오류가 발생했을 때 내가 제보받은 모든 경우의 원인은 Windows 계정명이 한글이라서 였다.

해당 파일을 열어보았을 때 아래와 같이 나타난다면 그렇다.


   ###### Error #######

   Error executing configuration script 'C:\Users\유저명AppData\Local\Temp\ans_install_tmp2904\config\AnsConfigCommon.tcl'

   '"C:\Users\유저명\AppData\Local\Temp\ans_install_tmp2904\tcl\bin\winx64\tclsh.exe" "C:\Users\유저명\AppData\Local\Temp\ans_install_tmp2904\config\AnsConfigCommon.tcl"  -installdir "C:\Program Files\ANSYS Inc\ANSYS Student" -rev 192 -dotrev 19.2 -scripttosource "C:\Users\유저명\AppData\Local\Temp\ans_install_tmp2904\config\ConfigCommon.tcl" -sourcedir "C:\Users\유저명\AppData\Local\Temp\ans_install_tmp2904" -os_lang en-us -install -configureForSubscriptionLicenceMode ' terminated after 1 attempts with the following error(s): 

   Unknown error

Exit Code: 1

couldn't read file "C:\Users\O¿i, A?Ao¾Æ(알 수 없는 깨진 글자)\AppData\Local\Temp\ans_install_tmp2904\config\AnsConfigCommon.tcl": no such file or directory


위에 유저명으로 표시한 글자의 텍스트 인코딩이 잘못되어 깨지면 글자가 빨갛게 표시한 것처럼 깨져서 나오게 된다. 이 경우 해당 경로에 존재하는 파일을 제대로 읽어오지 못하여 발생하는 문제로 추정된다.


해결 방법은 기존에 설치된 ANSYS를 클린 삭제한 후, 영문명의 Windows 관리자 계정을 새로 만들어서, 해당 계정에 새롭게 ANSYS를 설치하는 것이다. 다만 이 경우 새롭게 영문명의 Windows 계정에 로그인하여 설치를 시도해도 동일 메시지가 나타나며, 계속 이전 관리자 계정에 설치를 시도하는 경우가 있었다고 하는데 그 이상 분석해보지는 않았다.


Windows 계정을 새롭게 만들지 않고 계정명만 영문으로 바꾸는 경우, 사용자 폴더 경로는 여전히 기존 사용자 이름인 한글로 남아있게 된다. C:\Users 또는 C:\사용자 에서 폴더 명을 확인하면 된다. 따라서 이 경우 별도의 방법을 통해 사용자 폴더 이름을 변경해주어야 하는데 방법은 사람에 따라 상당히 복잡하게 느껴질 수도 있다. 구글에서 '사용자 폴더 이름 변경' 이라고 검색하면 많은 글을 확인할 수 있으니 참고하여 변경하면 된다.


포맷하여 윈도우를 재설치 한 후, 계정명을 영문으로 만들면 깔끔하게 해결된다.






2. Workbench 실행 후 툴박스에 툴이 보이지 않는 문제




주요 추정 원인

한글 언어 Windows 의 사용 / 기본 ANSYS Student 가 아닌 ANSYS AIM Student 등 다른 Edition 을 설치한 경우


해결 방법

Windows 언어를 English 로 변경 / ANSYS Student 버전 설치


상세 설명

영문 Windows가 아닌 타 언어 Windows 의 경우, Toolbox 를 불러오지 못하는 문제가 생길 수 있다고 한다. (물론 나를 포함하여 대부분의 경우에는 아무런 이상이 없다.) 오래 걸리는 일은 아니니, Windows 언어를 English 로 변경하고 다시 시도해보자.

포맷 없이 확실하게 해결된 사례는, ANSYS AIM Student 버전의 경우 라이선스 인식을 제대로 하지 못하는 경우가 있다고 한다. 만약 ANSYS AIM Student 를 설치해였는데 해당 버전이 반드시 필요한 경우가 아니라면 기본 ANSYS Student 버전을 설치하면 된다.






3. System clock has been set back 이라는 메시지가 포함된 라이선스 오류가 뜨는 문제



Failover feature 'ANSYS Academic Teaching Introductory' specified in license preference is not available.
Request name aa_t_i does not exist in the licensing pool.
System clock has been set back.

Feature: aa_t_i

FlexNet Licensing error:-88,309


문제 설명

라이선스 기간이 특정 일자까지 정해진 툴의 경우, 사용자가 라이선스 기한이 지난 후 Windows 시간을 과거로 돌려 사용하는 것을 방지하기 위한 조치가 되어있다. ANSYS의 FlexNet 라이선스 툴의 경우도 마찬가지이다. 따라서 시스템 시간을 과거로 돌린 적이 있는 경우 위 에러가 발생할 소지가 있다. 하지만 내가 목격한 대부분의 경우 원인을 파악하기 어려운 상황에서 발생하였으며, 답은 포맷뿐이었다.


주요 추정 원인

1. Windows 시간을 과거로 돌린 적이 있는 경우

2. 현재 Windows에 설정된 시스템 시간이 실제 시간과 다를 경우
3. 컴퓨터 내에 현재 날짜보다 미래 날짜를 가진 파일이 존재할 경우
4. 메인보드 BIOS 에 저장된 시간과 Windows 시간이 다를 경우


문제 해결을 위한 체크리스트

아래의 방법들은 체크리스트이지 해결 방법이 아니다. 이유는 아래와 같이 하면 해결된다고는 하는데, 아직까지 아래의 방법으로 해결한 경우를 본 적이 없기 때문이다. 확실한 답은 포맷뿐이다.


1. 시스템 시간 현재 시간으로 바꾸기
원인: 현재 Windows에 설정된 시스템 시간이 실제 시간과 다른 경우
라이선스 일자가 만료되었음에도 시간을 돌려 라이선스를 유효하게 사용하려 하는 것으로 판단하여 에러가 발생할 수 있다.

해결 방법: 제어판-시계 및 국가-인터넷 시간 에서 time.windows.com 등의 사이트와 시간이 동기화 되어있는지 확인한다.
만약 동기화 되어있지 않다면 설정 변경 버튼을 누르고 인터넷 시간 서버와 동기화를 체크, 지금 업데이트 하여 현재 시스템 시간을 수정한다.



2. 미래 날짜를 가진 파일의 날짜 바꾸기
원인: 컴퓨터 내에 현재 날짜보다 미래 날짜를 가진 파일이 존재할 경우,
ANSYS 가 해당 파일을 참고할 때 시간이 뒤로 돌려진 것으로 감지하여 에러가 발생할 수 있다.

해결 방법: 내 컴퓨터 or 내 PC 를 연 후 상단 메뉴의 보기-옵션-폴더 옵션으로 들어간다. (윈도우 버전 따라 다를 수 있음)
폴더 옵션-보기-숨김 파일, 폴더 및 드라이브 표시 를 체크한다.
보호된 운영 체제 파일 숨기기(권장) 를 체크 해제한다.

내 PC의 검색 창(검색창이 없다면 Ctrl+F 키를 누름)에 아래를 붙여넣어 검색 결과가 나오는지 확인한다.
수정한날짜:‎18-‎11-‎23 .. 48-‎11-23
만든날짜:‎18-‎11-‎23 .. 48-‎11-‎23

검색 결과가 없다면,
수정한날짜:‎18-‎11-‎23 .. 99-‎11-‎23
등 범위를 좀 더 늘려 확인해보자.

만약 현저히 미래 시간에 해당하는 수정된 날짜 or 만든 날짜에 해당하는 검색 결과가 나온다면, 해당 파일들이 시스템 파일이 아니라 필요없는 파일인 경우 삭제하거나 중요한 시스템 파일인 경우 시간을 현재 시간으로 바꾸어 주어야 한다. 이를 구분하기 어려우므로 검색된 모든 결과를 현재 시간으로 바꾸어 주는 것이 좋다.


만약 이러한 파일을 찾았다면, 해당 파일의 시간 변경을 위해 아래의 링크로 접속하여 프로그램을 설치한다.

https://www.petges.lu/download/

설치 완료 후, 앞에서 검색한 결과에서 검색 결과를 모두 선택한 뒤 우클릭 하면 우클릭 시 뜨는 메뉴에 기존에는 없었던 'Change Attribute' 라는 메뉴가 보이게 된다. 해당 메뉴를 클릭하여 선택하고, 새로 뜬 창에서 'Modify date and time stamps' 를 체크하여 현재 시간으로 설정하고, OK 버튼을 눌러 나가면 수정이 완료된다. 마지막으로 해당 파일들의 날짜가 제대로 바뀐 것을 확인하자.



3. 메인보드 BIOS 시간 변경
원인: 컴퓨터 하드웨어인 메인보드에는 컴퓨터가 꺼져있는 동안 흐른 시간을
시스템 시간에 반영하기 위해 시간 정보가 저장되어 있고, 메인보드에 있는 수은전지에 의해 시간이 유지된다.
해당 시간 정보가 실제 시간과 다를 경우, 역시 위의 에러가 나타날 수 있다고 한다(고 카더라).

해결 방법: 바이오스 설정 페이지 접속 방법은 메인보드 제조사(ASUS, Gigabite 등) 마다 다르다.
보통 컴퓨터가 부팅됨과 동시에 DEL 키를 연타하면 메인보드의 BIOS 설정 화면으로 들어갈 수 있지만, 자세한 정보는 '본인 메인보드 제조사(ASUS, Gigabite 등, 보통 부팅될 때 나타나므로 알 수 있다) + BIOS 설정' 등의 키워드로 검색해보자.

bios 시간 설정, cmos 시간 설정 등으로 검색하여 시간 변경 방법을 숙지하고, 본인의 메인보드 제조사의 BIOS 설정 화면에 들어가서 BIOS에 저장된 시간이 실제 시간과 현저하게 다를 경우 현재 시간으로 변경 후 저장하여 나간다.
다만 현재 시간과 완벽하게 일치시키기 어려운 경우, 과거 시간이 아닌 현재 실제 시간보다 2~3분 뒤의 '미래 시간' 으로 변경해주자.


1~3 체크 이후
1~3 의 체크를 완료하고 문제가 없거나, 혹은 문제를 수정하였다면 ANSYS를 바로 실행 또는 재설치 한 후 실행하여 동일 에러가 발생하는 지 확인한다. 하지만 대부분의 경우, 1~3의 경우에 해결되지 않는다. 이 경우 포맷을 하면 해결된다 -_-;;





Leave a comment

iframe 내에서 작동하는 Userscript 를 코드를 작성하다가, 브라우저 확장기능 별로 iframe 내에서 Userscript 의 호출 여부가 다르다는 것을 알게되었다. 무엇보다 Firefox 의 Greasemonkey 에서는 iframe 내에서 require로 jquery를 불러와도 사용이 안 되는 경우가 있어서 다른 확장기능에서는 어떤지 테스트를 해보고 싶었다. 어떤 웹사이트에서 테스트 했는지는 비밀이다. 모든 웹사이트에서 아래와 같은 상황이 생기는 것은 아닐 것이다.



테스트한 웹사이트 구조

1. main frame ( url.com )

 └ 2. iframe ( url.com/iframe.php )

   └ 3. iframe ( about:blank, 즉 iframe의 src 값이 존재하지 않음. 동적으로 생기므로 생성까지 약간의 딜레이 존재함 )


최상단에 main frame 이 있고, 그 안에 첫번째 iframe 이 있고, 그 안에 src가 존재하지 않는 iframe 이 존재하는 구조이다.

마지막 iframe 은 외부 css, js 의 영향을 받지 않기 위한 목적으로 iframe 의 형태를 취한 것이라 src 값이 존재하지 않는다.



테스트한 Userscript 코드

// ==UserScript==
// @name        iframeTest
// @namespace   iframeTest
// @description iframe 테스트용 코드
// @include     *.url.com*
// @version     0.0.1
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js
// @run-at      document-start
// ==/UserScript==
/*jshint multistr: true */

console.log('now : ',window.location);

if (typeof jQuery == 'undefined') {
  console.log('jquery가 존재하지 않음');
  console.log(document.getElementsByTagName('head'));
  var script = document.createElement('script');
  script.type = "text/javascript";
  script.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js";
  document.getElementsByTagName('head')[0].appendChild(script);
  console.log('jquery:', typeof jQuery);
}
else{
  console.log('jquery가 존재함');
  console.log(window.jQuery);
  console.log($(document).find('head').html());
}

// 1초 뒤에 확인
setTimeout(function(){
  console.log('jquery:', typeof jQuery);
},1000)


결과 정리

① Firefox - Greasemonkey

run-at 값에 뭘 주느냐에 따라 결과가 다르다.

  1. document-start 의 경우
    main frame 과 첫 번째 iframe 에서 Userscript가 호출된다.
    main frame 에서는 모든 기능이 정상적으로 동작한다.
    첫 번째 iframe 에서 스크립트가 호출된 직후에는 jquery 가 존재한다고 표시된다. 하지만 1초 뒤에 다시 체크해보면 jquery 가 undefined 상태가 된다. 내가 테스트 한 웹사이트에서만 이런 증상이 발생할 것 같기는 한데, 동일한 구조를 갖는 다른 웹사이트에서 테스트 해보지는 않았다. 여하튼 이러한 경우 jquery 함수를 사용하면 오류가 발생하며, jquery 를 사용하려면 Metadata block의 require 에 의존해서는 안 되고 별도의 호출 코드를 삽입하고 setTimeout 으로 딜레이를 주는 등 귀찮은 작업을 추가적으로 해야 한다.
  2. document-end 의 경우
    main frame 에서만 호출된다. jquery 사용에 문제 없다.
  3. document-idle 의 경우
    main frame 과 첫 번째 iframe 에서 호출된다. jquery 사용에 문제 없다.

② Firefox - Violentmonkey

모든 프레임에서 Userscript가 호출된다. run-at 값에 따라 결과가 달라지지 않는다. jquery 사용에 문제 없다.

③ Chrome - Tampermonkey

main frame 과 첫 번째 iframe 에서 Userscript가 호출된다. run-at 값에 따라 결과가 달라지지 않는다. jquery 사용에 문제 없다.


Chrome 의 Violentmonkey 에서는 테스트해보지 않았지만 큰 문제는 없을 것 같다.


2019-01-18 추가:

@include 를 *.url.com* 이 아니라 * 로 설정하여 모든 웹사이트에서 동작하도록 설정하면, Tampermonkey 에서도 두 번째 iframe 에서 호출됨을 확인하였다. 그 외 about:blank 등의 키워드는 먹히지 않았다.



최상단 프레임에서만 Userscript 를 동작시키고 싶은 경우

참고로 iframe 내에서 Userscript가 호출이 되는 것은 전혀 문제가 되지 않는다.
만약 내가 최상위 프레임에서만 Userscript 를 동작시키고 싶다면 아래와 같은 방법이 있다.
  1. Metadata block에 @noframes 를 삽입한다.
  2. 코드 내에서 window.top === window.self 가 true 이면 main frame, false 이면 Iframe 이다. 코드 최상단에서 iframe 인지 여부를 체크하고, iframe의 경우 return 하여 코드를 중지시키면 된다.
  3. location.href 을 체크, iframe 에 해당하는 주소인 경우 return 시킨다. (iframe 주소에 해당하는 리스트를 작성 필요가 있다)

만약 iframe 내에서 Userscript가 호출되지 않는다면?

cross-origin 정책을 위반하지 않는 경우에 최상단 프레임에서 아래와 같이 코드를 작성하면 iframe 내부에 접근할 수 있기는 하다.
//첫번째 iframe 내부 접근
$('#iframe_id1').contents().first();

//두번째 iframe 내부 접근
$('#iframe_id1').contents().first().find('#iframe_id2').contents().first();
그렇지만 iframe element가 동적으로 생성되는 경우 생성되었는지 여부를 매번 체크해주어야 하고, 첫번째 iframe이 갱신되면 두번째 iframe 을 다시 찾아줘야 되니까 귀찮다. 무엇보다 이벤트를 바인드 하는게 제일 귀찮다(생각하는 대로 매번 잘 안 된다!!!!).


따라서 iframe 내에서 Userscript가 호출되기만 하면, 코드를 각 프레임 별로 작성하고
window.top 이나 location.href 으로 현재 어떤 frame에 있는지 여부를 파악한 다음
해당 프레임에 맞는 코드만 실행시키고 아니면 return 시키면 되므로 코드 작성이 간단해진다.
프레임 간에 변수를 주고 받는 것도 큰 문제는 없는듯하다.


결론

Firefox의 경우 Violentmonkey 확장 기능을 사용하는 것이 최고다.

Greasemonkey 는 Firefox Quantum 업데이트 이후 구려졌으므로 쓰지말자.

Leave a comment
≪ Previous : 1 : 2 : 3 : 4 : 5 : ··· : 26 : Next ≫