| 스피커 |
성적 증명서 |
| 웬디머프리 |
안녕하세요. 오늘 프레젠테이션에 참여해 주셔서 감사합니다. 다양한 경력 수준의 스크립트 작성자들이 마주하는 일반적인 상황에 대해 이야기해 드리고자 합니다. |
| |
저희는 여러분이 이러한 실수를 피할 수 있는 도구와 지식을 갖추도록, 현재 상황을 설명해 드리고자 합니다. 자, 시작해 볼까요? |
| |
기본적으로 열려 있지 않아서 로그에서 메시지를 확인하는 것을 잊기 쉽습니다. 하지만 로그에는 최근 스크립트 실행에 대한 유용한 정보가 포함되어 있습니다. JMP에서 이 예제를 자세히 살펴보겠습니다. |
| |
여기서 스크립트는 단순히 데이터 테이블을 열고 행 선택을 시도하는 것을 볼 수 있습니다. 이 스크립트를 실행하면, |
| |
치명적인 오류, 즉 스크립트가 오류로 인해 중단되는 상황에 대해서는 대화형 오류 메시지가 표시됩니다. 팝업 창은 JMP 15의 새로운 기능이며, 환경 설정에서 끌 수 있습니다. |
| |
해당 메시지를 닫으면 로그를 확인할 수 있으며 창에서 동일한 메시지를 볼 수 있지만 줄 번호도 볼 수 있습니다. |
| |
스크립트 파일 이름을 알려주시면 문제 영역을 파악하는 데 도움이 됩니다. 이 팝업 창에만 의존하지 마세요. 다른 중요한 메시지도 로그에 표시됩니다. |
| |
팝업 창이 뜨는 건 아니죠. 그럼 다른 예를 살펴보죠. |
| |
이 스크립트에서 작성자는 테이블을 열고, 분석을 만들고, 로그에 메시지를 인쇄하려고 시도하고 있습니다. |
| |
그리고 이 스크립트를 실행하면 분석이 생성되지 않았다는 것을 바로 알 수 있습니다. |
| |
그래서 다시 한번 로그를 확인해보죠 |
| |
그리고 데이터 테이블에서 찾을 수 없는 열이 있음을 알 수 있었지만 스크립트는 계속해서 로그에 메시지를 인쇄했습니다. |
| |
여기서 중요한 점은 항상 로그를 확인하는 것입니다. 특히 예상과 다른 결과가 발생할 때는 더욱 그렇습니다. 열 이름의 철자가 틀린 것처럼 간단한 문제일 수도 있습니다. |
| |
현재 데이터 테이블이라는 개념은 종종 활성 테이블이라고 설명됩니다. 하지만 이 테이블을 활성 또는 현재 데이터 테이블로 만드는 것은 무엇이며, 스크립트에 왜 중요한가요? |
| |
테이블을 열거나, 생성하거나, 다른 작업을 수행하면 해당 테이블은 현재 데이터 테이블이 됩니다. 하지만 스크립트 작성자가 예상치 못한 방식으로 런타임에 테이블이 현재 데이터 테이블이 되는 다른 방법도 있습니다. |
| |
JMP가 백그라운드에서 처리하는 작업입니다. 예를 들어, JMP가 수식을 계산하거나 창을 업데이트해야 할 수 있습니다. |
| |
이러한 백그라운드 프로세스로 인해 런타임에 활성화하려고 했던 테이블과 다른 테이블이 생성될 수 있습니다. 이로 인해 스크립트가 실패하거나, 더 심각한 경우에는 JMP가 잘못된 테이블을 사용했다는 사실조차 알아차리지 못할 수도 있습니다. |
| |
그래서 여기서 우리는 몇 가지를 제공했습니다. |
| |
데이터 테이블별 참조를 사용하여 스크립트를 작성하는 모범 사례를 소개합니다. 이를 통해 런타임에 어떤 테이블이 활성화되어 있든 올바른 테이블이 사용되도록 할 수 있습니다. |
| |
이 예제에서는 특정 데이터 테이블에 이변량 호출을 보내어 해당 테이블의 데이터가 분석에 사용되도록 하는 방법을 보여드립니다. |
| |
새 열을 특정 데이터 테이블에 대한 메시지로 사용할 수도 있는데, 이렇게 하면 새 열이 원하는 테이블에 만들어지고 현재 테이블로 이동하지 않습니다. |
| |
선택적으로 데이터 테이블 참조를 사용할 수도 있습니다. 여기서는 열 참조에 사용하는 방법을 보여드리고, 열 참조에 대해서는 나중에 더 자세히 설명하겠습니다. |
| |
함수에서 선택적 데이터 테이블 참조를 사용할 수도 있습니다. 각 행과 요약에 사용 가능한 두 가지가 있습니다. |
| |
또한, 프로덕션 스크립트에서 현재 데이터 테이블 함수를 사용하여 데이터 테이블 참조를 할당하는 것은 피하는 것이 좋습니다. 이 예제에서는 두 개의 데이터 테이블을 조인하고 해당 테이블에 대한 참조를 할당하려고 합니다. |
| |
조인에서 생성된 테이블입니다. 이제 join은 새로 생성된 테이블에 대한 참조를 반환합니다. 따라서 현재 데이터 테이블에 할당하는 대신, 조인이 생성될 때 참조를 할당하려고 합니다. |
| |
따라서 여기서 우리는 조인을 호출할 때 간단히 할당을 하고 이것을 실행할 때 |
| |
실제로 새로운 DT 변수가 희망 테이블을 참조하고 현재 테이블에 영향을 받지 않는다는 것을 알 수 있습니다. |
| |
JSL 변수를 사용하여 열을 식별하는 것은 일반적인 작업이며, 어떤 방법을 사용할지는 의도한 용도에 따라 달라집니다. |
| |
열 함수는 열 전체에 대한 참조를 반환합니다. 열 이름이 문자열이거나 문자열 변수인 경우 등 다양한 인수를 받습니다. |
| |
인덱스 또는 인덱스를 나타내는 숫자형 변수입니다. 특정 행의 열 값을 참조하도록 첨자를 사용할 수 있습니다. |
| |
열 함수를 사용할 수 있는 곳으로는 플랫폼 호출, 열에 메시지 보내기, 열에 변수 참조 할당하기 등이 있습니다. |
| |
as column 함수는 현재 행의 값에 대한 참조를 반환합니다. |
| |
지정된 열의. 이 함수는 열 함수와 동일한 인수를 모두 받지만, JMP에서 현재 행은 별도로 관리되지 않는 한 항상 0이라는 점을 이해하는 것이 중요합니다. |
| |
따라서 as column 함수를 사용하기 좋은 몇 가지 예는 수식, 각 행, select where입니다. 이 함수들은 각 행을 계산할 때 행을 제어하기 때문에, 각 행에 대해 자체적으로 계산을 수행합니다. 자, 이제 예를 통해 그 의미를 살펴보겠습니다. |
| |
여기서는 샘플 데이터 테이블을 엽니다. JSL 변수를 열 이름에 할당하고, select where 문에서 column 함수를 사용하려고 합니다. |
| |
이제 이 스크립트를 실행하면 선택된 행이 없음을 알 수 있습니다. 왜 그럴까요? select where 함수가 각 행을 평가하기 때문입니다. |
| |
아래 첨자 없이 column 함수를 사용하면 행이 선택되지 않습니다. 또한, column 함수는 열에 대한 참조를 전체 단위로 반환하므로, 전체 데이터 열은 결코 14가 될 수 없습니다. |
| |
따라서 해결책은 행 서브스크립트와 함께 column 함수를 사용하는 것입니다(그리고 이 행 서브스크립트는 select where가 평가되는 동안 현재 행을 의미합니다). 또는 as column 함수를 사용하여 행을 선택할 수 있습니다. |
| |
수식에서 JSL 변수를 사용하는 것은 몇 가지 이유로 문제가 될 수 있습니다. JSL 변수의 유효 기간은 현재 JMP 세션으로 제한되며, 변수 값이 변경되면 수식 결과도 변경될 수 있습니다. |
| |
수식 편집기에서 수식을 살펴보지 않는 한, 문제가 있다는 걸 깨닫지 못할 수도 있습니다. |
| |
그럼 예제를 살펴보겠습니다. 여기서는 데이터 테이블을 열고 합계를 구하려는 열 목록을 설정합니다. |
| |
새 수식 열을 만들고 sum 함수에서 JSL 변수를 사용하고 있습니다. 실행해 보겠습니다. 새 열이 생성되고 데이터가 채워진 것을 볼 수 있습니다. 그런데 수식 편집기를 살펴보겠습니다. sum 함수에서 JSL 변수가 사용되었다고는 말하지 않았네요. |
| |
그리고 그것을 무시하고 종속 열 중 하나를 변경했을 때, 열 수식이 자동으로 업데이트되지 않는다는 것을 발견했습니다. |
| |
그러면 JMP를 저장하고 닫고, 이 테이블을 저장하고 JMP를 닫겠습니다. |
| |
그리고 우리는 다시 시작할 거예요. |
| |
이제 해당 JSL 변수의 유효 기간이 이전 JMP 세션으로 제한되었다는 점을 기억하세요. 표를 열어서 어떤 일이 일어나는지 살펴보겠습니다. |
| |
변수...열 수식이 여전히 다시 계산되지 않는 것을 발견했습니다. 확인해 보면 JSL 변수가 여전히 남아 있지만, 이제 그 아래에 빨간색 선이 생겼습니다. 마우스를 그 위에 올려놓으면 "해결되지 않은 오류"라는 이름이 표시됩니다. |
| |
수식을 다시 계산하려고 하면 오류 메시지가 나타나고, 오류를 무시하면 모든 데이터가 누락된 것으로 변경됩니다. 그렇다면 이 문제를 어떻게 해결해야 할까요? |
| |
수식에서 변수를 사용하는 경우, 수식을 계산하기 전에 JMP가 변수를 해당 값으로 대체하도록 설정해야 합니다. substitute 함수를 사용할 수도 있지만, 오늘은 표현식 함수를 보여드리겠습니다. 테이블을 닫아 보겠습니다. |
| |
테이블의 새 사본을 열고 열 목록을 다시 작성해 보겠습니다. |
| |
이제 이 문제를 어떻게 해결할지 살펴보겠습니다. |
| |
따라서 eval 표현식 함수는 JMP에 인수에 있는 EXPR 함수로 래핑된 모든 변수를 평가하고 바꾸라고 지시합니다. |
| |
그런 다음 평가되지 않은 표현식을 반환합니다. 따라서 이 코드에서 JMP는 SAT 점수 표현식을 열 목록으로 대체합니다. |
| |
이 섹션만 실행해서 어떻게 되는지 확인해 보겠습니다. sum 함수에 변수 대신 합계를 구하려는 열 목록이 추가된 것을 확인할 수 있습니다. |
| |
하지만 실제로 열을 생성한 것은 아닙니다. 단순히 이 표현식을 반환했을 뿐입니다. 따라서 이를 평가하기 위해 eval 표현식 함수 주변에 eval 함수를 추가합니다. |
| |
이렇게 하면 JMP가 대체가 발생한 후 새 열 표현식 전체를 평가하게 됩니다. 따라서 이메일에는 "실행"이라고 적혀 있는데, eval 표현식에서 반환된 값을 실행하라는 내용입니다. 즉, 다음과 같습니다. |
| |
그러면 실행해 보겠습니다. 열이 생성되었고 예상한 대로 데이터가 표시되어 있는 것을 볼 수 있습니다. |
| |
그리고 우리의 공식에는 더 이상 변수가 없고, 대신 열 목록만 있습니다. |
| |
종속 열의 데이터를 변경하면 이제 수식이 자동으로 업데이트됩니다. |
| |
그럼 이제 저스틴에게 넘겨서 피해야 할 몇 가지 실수에 대해 이야기해 보겠습니다. |
| 저스틴 칠튼 |
좋아요, 사람들이 흔히 하는 또 다른 실수는 열 속성을 설정할 때인데, 구문이 조금 까다로울 수 있습니다. 자, 그럼 자세히 알아보기 전에, |
| |
열 속성 측면에서 열이 무엇인지 살펴보겠습니다. 기본적으로 열은 |
| |
이 속성 정보에 대한 저장소입니다. 구문 검사를 수행하지 않으므로 |
| |
입력한 내용이 정확해야 원하는 모든 것을 저장할 수 있습니다. 즉, 속성 사용자는 JMP 플랫폼, 열 속성 사용, 심지어 JSL 애플리케이션 등 특정 형식을 기대하기 때문입니다. |
| |
그러면 간단한 예를 살펴보겠습니다. |
| |
여기서는 테스트를 위해 '열 속성'이라는 테이블을 열어 보겠습니다. NPN1이라는 열 하나와 '테스트'라는 열 하나가 있습니다. 이 열에는 사양 제한과 액세스 속성이 있지만, |
| |
테스트할 사양 제한 속성을 추가합니다. 따라서 여기에 우리가 생각하는 것이 있습니다. |
| |
사양 제한 열 속성을 설정하는 올바른 구문입니다. 이 구문을 실행하면 오류가 발생하지 않지만 |
| |
기둥을 보세요. 그 기둥에는 사양 제한이 있습니다. |
| |
물론 가능합니다. 하지만 그게 옳지 않다는 걸 알 수 있죠. 저희가 사양 한계를 적용한 공정 능력 분석을 요청했을 때, |
| |
실행하면 NPN1에 대한 값은 나오지만, 테스트 열에 대한 값은 나오지 않습니다. 테스트 열의 사양 제한 속성에 저장된 값이 올바르지 않기 때문입니다. |
| |
따라서 이미 속성 사양 제한 설정 방법을 알고 있다면 이를 수행하는 한 가지 방법은 다음과 같습니다. |
| |
속성 메시지를 NPN1 열로 보내면 됩니다. NPN1은 우리가 올바른 열이라고 알고 있는 열입니다. 따라서 해당 줄 하나만 실행하면 올바른 구문을 얻게 됩니다. |
| |
이는 실제로 개별 인수 대신 목록 형태로 제공되어야 함을 보여줍니다. 따라서 get 속성에 익숙하지 않다면, 올바른 열로 이동하여 열 속성을 복사할 수 있습니다. |
| |
그런 다음 스크립트에 붙여넣으면 열 속성 추가와 몇 가지 설정 속성이 있는 것을 볼 수 있습니다. 열 속성 추가는 여러 설정 속성을 일괄 처리하는 방법일 뿐입니다. 이 부분을 제거하고 추가 액세스 권한도 제거할 수 있습니다. |
| |
속성입니다. 제거가 완료되면 이 set 속성을 사용하여 send 연산자를 사용하여 테스트 열로 전송할 수 있습니다. 이제 이 함수를 실행하면, |
| |
우리는...그것이...그것이 우리의 사양 한도를 덮어썼지만, 우리는 우리의 사양 한도를 사용하여 동일한 배포판을 실행함으로써 그것을 확인할 수 있습니다. |
| |
자, 여기서 두 열 모두에 대한 프로세스 능력 분석이 완료되었음을 확인할 수 있습니다. 이는 사양 제한을 구하는 방법의 한 가지 예일 뿐이며, JSL에서 적용하고 구문을 구해야 하는 모든 열 속성에도 동일하게 적용할 수 있습니다. |
| |
다음으로 이야기할 실수는 디스패치 명령을 조작하는 것입니다. 디스패치 명령이란 무엇일까요? |
| |
스크립트 창에 빨간색 삼각형 메뉴를 저장하거나 클립보드에 저장할 때 저장된 스크립트에 나타나는 내용입니다. |
| |
참조선 같은 것을 추가하거나 윤곽선 상자를 닫는 등 다른 것을 변경할 때 나타납니다. 이 명령은 JMP에서 그래프를 다시 생성할 수 있도록 내부적으로 개발되었습니다. |
| |
당신이 만든 사용자 정의로. 그리고 그것은 사용자가 계획하지 않은 것이었습니다. |
| |
동적 변수를 사용하여 이 부분을 사용자 정의합니다. 즉, 디스패치 명령의 일부 인수는 JSL 변수를 허용하지 않습니다. 이러한 상황이 발생할 수 있는 예를 살펴보겠습니다. 여기 스크립트가 있습니다. |
| |
테이블과 나중에 사용할 문자열 변수입니다. 그리고 이것이 스크립트 저장 창에서 반환되는 내용입니다. 따라서 이 코드를 실행하면, |
| |
측정 축에 대한 최소값, 최대값 및 증가값을 설정하는 디스패치 명령을 볼 수 있습니다. |
| |
여기서는 0에서 1.4까지 설정됩니다. 이제 디스패치 명령이 다음에 의존하고 있음을 알 수 있습니다. |
| |
여기에 윤곽선 상자 제목이 있는데, 이 윤곽선 상자 제목은 실제로 y 입력값을 기반으로 합니다. 예를 들어, 사용자로부터 동적 입력을 받고 이 변수만 있다고 가정해 보겠습니다. 이 변수를 y에 사용할 수 있습니다. |
| |
하지만 그러면 여기에 해당 열의 이름도 사용해야 합니다. 따라서 이 코드를 실행하면 0.4에서 1.2 사이의 올바른 축 설정이 적용되지 않는 것을 볼 수 있습니다. 즉, 전송한 내용이 처리되지 않았다는 뜻입니다. |
| |
이 문제를 해결하는 방법은 몇 가지가 있습니다. 첫 번째는 웬디가 몇 분 전에 말씀드린 평가 표현식 솔루션을 사용하는 것입니다. 여기 보시다시피, 동일한 평가 표현식이 있습니다. 실제로는 이전 예제에서 시도했던 연결(concatenation)을 래핑하려고 합니다. |
| |
여기. |
| |
따라서 eval 표현식은 이 전체를 평가하라고 합니다. 따라서 eval EXPR을 실행하면, |
| |
그것은 단지 그 전체를 우리의 연결된 문자열로 대체하고, 그런 다음 평가를 수행할 때 기억하세요. |
| |
그 표현식을 실행합니다. 따라서 여기에는 0에서 1.4까지 있습니다. 이것이 한 가지 방법입니다. |
| |
하지만 때로는 여전히 약간 까다로울 수 있습니다. 디스패치 명령을 어떻게 조작해야 할까요? 디스패치 명령을 계속 사용하고 있고 작동 방식을 알아야 하기 때문입니다. 가장 일반적인 방법은 이 디스패치 명령을 완전히 제거하는 것입니다. |
| |
그래서, 디스플레이 상자 구독이라고 부르는 것을 사용하겠습니다. 여기서는 제거된 디스패치 명령을 실행하고, 원래 축 설정을 그대로 유지하겠습니다. |
| |
그럼, 보기만 해도 어떻게 써야 할지 잘 모르겠는데, 일단 이 아이콘을 클릭해서 윤곽선 상자를 마우스 오른쪽 버튼으로 클릭합니다. |
| |
트리 구조를 편집하고 표시합니다. 이 윤곽선 상자 안에 표시되는 트리 구조가 표시되고, 이 윤곽선 상자 안에 있는 Axix 상자가 변경하려는 축 상자입니다. 따라서 이 윤곽선 상자 안에는 Axix 상자 1이 있습니다. |
| |
이제 스크립트를 작성해 보겠습니다. 이 보고서 함수를 사용하여 플랫폼 OBJ1의 보고서 레이어를 가져옵니다. |
| |
그런 다음 열 이름을 기반으로 우리가 알고 있는 개요 상자 제목을 얻기 위해 구독합니다. |
| |
그리고 그 안에서 우리는 가능한 한 구체적으로 설명하고 싶습니다. 그래야 JMP의 향후 버전에서 상황이 바뀌더라도 문제가 발생할 가능성이 줄어듭니다. |
| |
그러면 그 안에서 우리는 축 상자 1을 원하고, 그것이 우리가 그 축 상자를 얻는 방법이며, 그런 다음 우리는 디스패치 명령에서 동일한 정보를 가져와서 축 상자로 보내는 메시지로 변환하면 됩니다. |
| |
그리고 여기에서 축 설정이 0에서 1.4까지인 것을 볼 수 있습니다. |
| |
따라서 이 작업을 수행하는 또 다른 강력한 방법은 XPath를 사용하는 것입니다. XPath는 동일한 기능을 제공하지만, 조금 더 복잡할 수 있습니다. 하지만 상자에 대한 기본 데이터를 사용할 수 있기 때문에 향후 JMP 버전에서는 더 많은 유연성을 제공할 수 있습니다. |
| |
그래서 우리가 논의할 마지막 실수는 글로벌 네임스페이스만 사용하는 것입니다. |
| |
모르실 수도 있지만, 심볼을 어디에 저장할지 지정하지 않고 생성하면 전역 네임스페이스에 저장됩니다. 따라서 개인적인 용도로 무언가를 모의할 때 간단한 스크립트를 작성하는 데 유용합니다. |
| |
하지만 동료에게 보내는 스크립트나 커뮤니티에 게시하는 스크립트 또는 추가 기능에는 적합하지 않을 수 있습니다. |
| |
JMP에서 범위 지정 및 이름 조회가 어떻게 작동하는지 자세히 알아보겠습니다. 이 다이어그램의 아래쪽부터 시작합니다. 로컬 범위는 함수와 로컬 박스를 포함하여 여러 개의 범위가 될 수 있습니다. |
| |
따라서 그 위에, 기호를 찾지 못하거나 로컬로 이동하도록 지정하지 않은 경우(쓰기 또는 읽기 여부에 따라 다름) |
| |
그리고 파일당 하나씩 존재하는 here 범위가 있습니다. 그리고 JMP 세션에 대해 기본적으로 하나의 범위인 global 범위가 있습니다. 그리고 오른쪽에는 namespace 범위가 있는데, 이는 실제로 명시적으로 찾아야 하는 것입니다. |
| |
접근. 예를 들어 보겠습니다. 이 코드는 모든 심볼을 삭제하고, 어디에 넣어야 할지 지정하지 않았으므로 globals에 저장합니다. 따라서 x는 5입니다. 하지만 다른 사람이 "음, 나도..." 같은 스크립트를 가지고 있다면 어떨까요? |
| |
가지고있다 |
| |
사용하고 싶은 변수 x입니다. 어디에 넣을지는 지정하지 않겠습니다. 그래서 10으로 설정하겠습니다. |
| |
하지만 스크립트로 돌아와서 이것이 여러분이 설정한 어떤 변수이고 버튼에 대한 콜백이 있을 수도 있습니다... 버튼 |
| |
해당 변수에 의존하는 작업을 수행한 후 해당 변수를 사용하면 변수가 변경되는데 이는 바람직하지 않은 상황입니다. |
| |
그렇다면 이 문제를 해결할 수 있는 방법은 무엇일까요? 가장 쉬운 방법은 default to here(1)라는 이름을 사용하는 것입니다. 즉, 명시적으로 전역 범위로 이동하도록 지정하지 않는 한 아무것도 전역 범위에 포함되지 않습니다. 자, 그럼 살펴보겠습니다. |
| |
이것에 |
| |
예를 들어, 우리가 한 건 이 이름 default를 here(1)에 추가한 것뿐입니다. 이 이름은... 일반적으로 스크립트 맨 위에 위치하지만, 실제로는 어디에나 위치할 수 있습니다. |
| |
나는 내 기호를 정리하고 이 변수 x를 5와 같게 설정할 것입니다. 그러면 여기에 또 다른 성경이 있습니다. |
| |
즉, 내가 당신의 x에 접근하고 싶다는 뜻입니다. 하지만 실제로 이 x는 이 네임스페이스에서 이 x에 절대 접근할 수 없습니다. 그래서 |
| |
스크립트의 일부를 복사해서 X는 50과 같습니다. |
| |
오른쪽 스크립트의 X는 50인데, 왼쪽 스크립트의 X에는 아무런 영향도 미치지 않습니다. 이렇게 하면 다른 스크립트나 애플리케이션에서 심볼을 쉽게 분리할 수 있습니다. |
| |
다른 옵션은 사용자 지정 네임스페이스를 사용하는 것입니다. 이 방법은 조금 더 고급 방식이지만 매우 강력할 수 있습니다. 자, 다시 한번... 내 |
| |
기호를 추가한 다음 새 네임스페이스를 만들고, 네임스페이스 내에 변수 x를 설정하여 표시합니다. 그러면 값은 5가 됩니다. |
| |
그리고 여기 또 다른 대본이 있습니다. 아마 이게 당신의 대본 중 하나일 수도 있고, 당신은 그것을 알고 있을 겁니다. |
| |
myNS가 존재합니다. 그래서 시도해 볼 수 있고, 이것의 이름을 알고 있기 때문에 아무 문제 없이 접속할 수 있습니다. 하지만 악의적인 누군가가 당신 몰래 당신의 심볼을 바꿀 가능성은 훨씬 낮습니다. 그래서 |
| |
이 기호를 바꿔도 여전히 10이 유지되지만, 그냥 X만 하면 네임스페이스의 X 결과에는 아무런 영향도 미치지 않습니다. |
| |
웬디에게 다시 전달해 드리겠습니다. 웬디는 간과했던 몇 가지 자료에 대해 말씀해 주실 겁니다. |
| 웬디머프리 |
저스틴, 고마워요. JSL에 대해 더 자세히 알아볼 수 있는 자료들이 많이 있고, 그중 상당수는 무료입니다. JSL에 대해 더 자세히 알아볼 수 있는 일반적인 사이트들을 여기에 링크해 두었습니다. |
| |
또한, 기술 지원도 제공해 드리니 문의해 주시면 감사하겠습니다. 관련 서적도 몇 권 준비되어 있습니다. 물론, 저희가 제공하는 교육 자료와 여러분을 위한 교육 계획도 꼭 확인해 보시기를 권장합니다. |
| |
JMP 커뮤니티에서 이 프레젠테이션과 관련된 문서를 꼭 확인해 보세요. 오늘 논의할 시간이 부족했던 몇 가지 실수에 대해 추가로 다루었으니 참고해 주세요. 시청해 주셔서 감사합니다. |