tag:blogger.com,1999:blog-37622855628645882352024-03-14T11:06:47.158+09:00Programming Log모두 제가 작성한 포스트 입니다. 퍼가실땐 내용을 퍼가시지 마시고 링크를 걸어주시면 감사하겠습니다.1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.comBlogger503125tag:blogger.com,1999:blog-3762285562864588235.post-49195136513556478612024-01-20T17:34:00.002+09:002024-01-20T17:40:44.013+09:00[Git] system config 파일 접근 오류 (fatal: unable to read config file, hint: Waiting for your editor to close the file... fatal: Invalid path)<p> </p><p><br /></p><p><b style="background-color: #f4cccc;">- system config 를 사용할 시 오류가 발생하는 경우</b><br /><br /></p><div style="background-color: black;"><span style="color: white;"><br /></span></div><div style="background-color: black;"><div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">git config --system -l</span></div><div><span style="color: #9fc5e8;">fatal: unable to read config file '/home/1004lucifer/git/etc/gitconfig': No such file or directory</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">git config --system --edit</span></div><div><span style="color: #9fc5e8;">hint: Waiting for your editor to close the file... fatal: Invalid path '/home/1004lucifer/git/etc': No such file or directory</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div></div><div><span style="color: white;"><br /></span></div><div><span style="color: #fce5cd;"><b># 다음과 같이 작업이 가능하다.</b></span></div><div><br /></div><div><div style="color: white;">[1004lucifer@rhel8 git]$</div><div><span style="color: #6aa84f;"># 현재위치 확인 (Git 설치된 디렉토리)</span></div><div><span style="color: white;">[1004lucifer@rhel8 git]$ </span><span style="color: #fcff01;">pwd</span></div><div style="color: white;">/home/1004lucifer/git</div><div style="color: white;">[1004lucifer@rhel8 git]$</div><div><span style="color: white;">[1004lucifer@rhel8 git]$ </span><span style="color: #fcff01;">ls -l</span></div><div style="color: white;">total 0</div><div style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 154 Jan 20 02:06 bin</div><div style="color: white;">drwxr-xr-x. 3 1004lucifer 1004lucifer 22 Jan 20 02:06 libexec</div><div style="color: white;">drwxr-xr-x. 8 1004lucifer 1004lucifer 90 Jan 20 02:06 share</div><div style="color: white;">[1004lucifer@rhel8 git]$</div><div><span style="color: #6aa84f;"># etc 디렉토리를 생성해 준다.</span></div><div><span style="color: white;">[1004lucifer@rhel8 git]$ </span><span style="color: #fcff01;">mkdir etc</span></div><div style="color: white;">[1004lucifer@rhel8 git]$</div><div><span style="color: white;">[1004lucifer@rhel8 git]$ </span><span style="color: #fcff01;">ls -l</span></div><div style="color: white;">total 0</div><div style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 154 Jan 20 02:06 bin</div><div style="color: white;">drwxrwxr-x. 2 1004lucifer 1004lucifer 6 Jan 20 03:17 etc</div><div style="color: white;">drwxr-xr-x. 3 1004lucifer 1004lucifer 22 Jan 20 02:06 libexec</div><div style="color: white;">drwxr-xr-x. 8 1004lucifer 1004lucifer 90 Jan 20 02:06 share</div><div style="color: white;">[1004lucifer@rhel8 git]$</div><div><span style="color: white;">[1004lucifer@rhel8 git]$ </span><span style="color: #fcff01;">cd etc</span></div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div><span style="color: #6aa84f;"># etc 디렉토리안에 gitconfig 파일 생성 (system config 파일)</span></div><div><span style="color: white;">[1004lucifer@rhel8 etc]$ </span><span style="color: #fcff01;">touch gitconfig</span></div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div><span style="color: white;">[1004lucifer@rhel8 etc]$ </span><span style="color: #fcff01;">pwd</span></div><div style="color: white;">/home/1004lucifer/git/etc</div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div><span style="color: white;">[1004lucifer@rhel8 etc]$ </span><span style="color: #fcff01;">ls -l</span></div><div style="color: white;">total 0</div><div style="color: white;">-rw-rw-r--. 1 1004lucifer 1004lucifer 0 Jan 20 03:17 gitconfig</div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div><span style="color: #6aa84f;"># system config 파일 환경변수를 추가해 준다. (경로는 본인PC의 경로에 맞게..)</span></div><div><span style="color: white;">[1004lucifer@rhel8 etc]$ </span><span style="color: #fcff01;">vi ~/.bash_profile</span></div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div><span style="color: white;">[1004lucifer@rhel8 etc]$ </span><span style="color: #fcff01;">cat ~/.bash_profile</span></div><div style="color: white;"># .bash_profile</div><div style="color: white;"><br /></div><div style="color: white;"># Get the aliases and functions</div><div style="color: white;">if [ -f ~/.bashrc ]; then</div><div style="color: white;"> . ~/.bashrc</div><div style="color: white;">fi</div><div style="color: white;"><br /></div><div style="color: white;"># User specific environment and startup programs</div><div style="color: white;">export PATH=$PATH:/home/1004lucifer/git-binary/bin</div><div style="color: white;">export GIT_EXEC_PATH=/home/1004lucifer/git-binary/libexec/git-core</div><div><span style="color: #6fa8dc;">export GIT_CONFIG_SYSTEM=/home/1004lucifer/git/etc/gitconfig</span></div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div style="color: white;"><span style="color: #6aa84f;"># 추가한 환경변수를 현재 쉘에 바로 적용</span></div><div><span style="color: white;">[1004lucifer@rhel8 etc]$ </span><span style="color: #fcff01;">source ~/.bash_profile</span></div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div><span style="color: #6aa84f;"># 에러 발생하지 않음 확인</span></div><div><span style="color: white;">[1004lucifer@rhel8 etc]$ </span><span style="color: #fcff01;">git config --system -l</span></div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div style="color: white;"><br /></div></div></div><p><br /></p><p>참고<br />- <a href="https://1004lucifer.blogspot.com/2023/12/git-how-to-install-git-in-offline.html" target="_blank">https://1004lucifer.blogspot.com/2023/12/git-how-to-install-git-in-offline.html</a></p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-39510941859347877582024-01-16T23:35:00.000+09:002024-01-16T23:35:01.941+09:00[Gradle] 오프라인 환경에서의 Gradle 셋팅<p><br /></p><p>실습 환경 : RedHat Linux Enterprise 8.6</p><p><br /></p><p><br /></p><h1 style="text-align: left;">증상</h1><p>오프라인 환경에서 gradle 실행 시 아래와 같이 Gradle 파일을 다운로드 하지 못하며 수행이 정상적으로 되지 않는다.</p><div style="background-color: black;"><div><span style="color: white;"><br /></span></div><div><div><span style="color: white;">[1004lucifer@rhel8 TestGradle]$ </span><span style="color: #fcff01;"><b>ls -al</b></span></div><div><span style="color: white;">total 28</span></div><div><span style="color: white;">drwxrwxr-x. 5 1004lucifer 1004lucifer 145 Jan 16 08:18 .</span></div><div><span style="color: white;">drwx------. 19 1004lucifer 1004lucifer 4096 Jan 16 08:21 ..</span></div><div><span style="color: white;">-rw-rw-r--. 1 1004lucifer 1004lucifer 297 Jan 16 2024 build.gradle</span></div><div><span style="color: white;">-rw-rw-r--. 1 1004lucifer 1004lucifer 539 Jan 16 2024 .gitignore</span></div><div><span style="color: white;">drwxrwxr-x. 3 1004lucifer 1004lucifer 21 Jan 16 2024 gradle</span></div><div><span style="color: white;">drwxrwxr-x. 5 1004lucifer 1004lucifer 56 Jan 16 2024 .gradle_bak</span></div><div><span style="color: white;">-rwxr-----. 1 1004lucifer 1004lucifer 8070 Jan 16 2024 gradlew</span></div><div><span style="color: white;">-rw-rw-r--. 1 1004lucifer 1004lucifer 2763 Jan 16 2024 gradlew.bat</span></div><div><span style="color: white;">-rw-rw-r--. 1 1004lucifer 1004lucifer 35 Jan 16 2024 settings.gradle</span></div><div><span style="color: white;">drwxrwxr-x. 4 1004lucifer 1004lucifer 30 Jan 16 2024 src</span></div><div><span style="color: white;">[1004lucifer@rhel8 TestGradle]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 TestGradle]$ </span><span style="color: #fcff01;"><b>./gradlew</b></span></div><div><span style="color: white;">Downloading https://services.gradle.org/distributions/gradle-8.2-bin.zip</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">Exception in thread "main" java.net.UnknownHostException: services.gradle.org</span></div><div><span style="color: white;"> at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)</span></div><div><span style="color: white;"> at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)</span></div><div><span style="color: white;"> at java.net.Socket.connect(Socket.java:607)</span></div><div><span style="color: white;"> at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:288)</span></div><div><span style="color: white;"> at sun.net.NetworkClient.doConnect(NetworkClient.java:175)</span></div><div><span style="color: white;"> at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)</span></div><div><span style="color: white;"> at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)</span></div><div><span style="color: white;"> at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264)</span></div><div><span style="color: white;"> at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)</span></div><div><span style="color: white;"> at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:203)</span></div><div><span style="color: white;"> at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)</span></div><div><span style="color: white;"> at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)</span></div><div><span style="color: white;"> at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:189)</span></div><div><span style="color: white;"> at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1572)</span></div><div><span style="color: white;"> at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1500)</span></div><div><span style="color: white;"> at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:268)</span></div><div><span style="color: white;"> at org.gradle.wrapper.Download.downloadInternal(Download.java:100)</span></div><div><span style="color: white;"> at org.gradle.wrapper.Download.download(Download.java:80)</span></div><div><span style="color: white;"> at org.gradle.wrapper.Install$1.call(Install.java:83)</span></div><div><span style="color: white;"> at org.gradle.wrapper.Install$1.call(Install.java:63)</span></div><div><span style="color: white;"> at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:69)</span></div><div><span style="color: white;"> at org.gradle.wrapper.Install.createDist(Install.java:63)</span></div><div><span style="color: white;"> at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:107)</span></div><div><span style="color: white;"> at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:63)</span></div><div><span style="color: white;">[1004lucifer@rhel8 TestGradle]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 TestGradle]$</span></div></div><div><br /></div></div><p><br /></p><p><span style="color: white;">offline, 1004lucifer</span></p><p><br /></p><h1 style="text-align: left;">GRADLE_USER_HOME 확인</h1><p>GRADLE_USER_HOME 환경변수를 따로 지정하지 않은경우 ~/.gradle 디렉토리가 기본으로 지정이 된다.</p><p>디렉토리가 없는경우 ./gradlew 를 한번 수행하면 해당 디렉토리가 자동으로 생성된다.</p><p>GRADLE_USER_HOME/wrapper/dists 디렉토리 확인 시 Gradle에 셋팅된 버전의 디렉토리명이 있다.</p><div style="background-color: black;"><div><span style="color: white;"><br /></span></div><div><div><span style="color: white;">[1004lucifer@rhel8 dists]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 dists]$ </span><span style="color: #fcff01;"><b>pwd</b></span></div><div><span style="color: white;">/home/1004lucifer/.gradle/wrapper/dists</span></div><div><span style="color: white;">[1004lucifer@rhel8 dists]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 dists]$ </span><b><span style="color: #fcff01;">ll</span></b></div><div><span style="color: white;">total 0</span></div><div><span style="color: white;">drwxrwxr-x. 3 1004lucifer 1004lucifer 39 Jan 16 08:21 gradle-8.2-bin</span></div><div><span style="color: white;">[1004lucifer@rhel8 dists]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 dists]$ </span><span style="color: #fcff01;"><b>cd gradle-8.2-bin/</b></span></div><div><span style="color: white;">[1004lucifer@rhel8 gradle-8.2-bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 gradle-8.2-bin]$ </span><b><span style="color: #fcff01;">ls -al</span></b></div><div><span style="color: white;">total 0</span></div><div><span style="color: white;">drwxrwxr-x. 3 1004lucifer 1004lucifer 39 Jan 16 08:21 .</span></div><div><span style="color: white;">drwxrwxr-x. 3 1004lucifer 1004lucifer 28 Jan 16 08:21 ..</span></div><div><span style="color: white;">drwxrwxr-x. 2 1004lucifer 1004lucifer 67 Jan 16 08:21 bbg7u40eoinfdyxsxr3z4i7ta</span></div><div><span style="color: white;">[1004lucifer@rhel8 gradle-8.2-bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 gradle-8.2-bin]$ </span><b><span style="color: #fcff01;">cd bbg7u40eoinfdyxsxr3z4i7ta/</span></b></div><div><span style="color: white;">[1004lucifer@rhel8 bbg7u40eoinfdyxsxr3z4i7ta]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bbg7u40eoinfdyxsxr3z4i7ta]$ </span><span style="color: #fcff01;"><b>ls -al</b></span></div><div><span style="color: white;">total 0</span></div><div><span style="color: white;">drwxrwxr-x. 2 1004lucifer 1004lucifer 67 Jan 16 08:21 .</span></div><div><span style="color: white;">drwxrwxr-x. 3 1004lucifer 1004lucifer 39 Jan 16 08:21 ..</span></div><div><span style="color: white;">-rw-rw-r--. 1 1004lucifer 1004lucifer 0 Jan 16 08:21 gradle-8.2-bin.zip.lck</span></div><div><span style="color: white;">-rw-rw-r--. 1 1004lucifer 1004lucifer 0 Jan 16 08:21 gradle-8.2-bin.zip.part</span></div><div><span style="color: white;">[1004lucifer@rhel8 bbg7u40eoinfdyxsxr3z4i7ta]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bbg7u40eoinfdyxsxr3z4i7ta]$</span></div></div><div><br /></div><br /></div><p><br /></p><p><br /></p><p><br /></p><h1 style="text-align: left;">GRADLE_USER_HOME 에 Gradle 파일 추가</h1><p>https://services.gradle.org/distributions/gradle-8.2-bin.zip 에서 다운로드 받은 파일을 해당 디렉토리에 추가한다.<br />(Gradle 버전에 따라 다운로드 URL과 디렉토리명이 다르다.)</p><div style="background-color: black;"><div><span style="color: white;"><br /></span></div><div><div><span style="color: white;">[1004lucifer@rhel8 bbg7u40eoinfdyxsxr3z4i7ta]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bbg7u40eoinfdyxsxr3z4i7ta]$ </span><span style="color: #fcff01;"><b>mv ~/gradle-8.2-bin.zip ./</b></span></div><div><span style="color: white;">[1004lucifer@rhel8 bbg7u40eoinfdyxsxr3z4i7ta]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bbg7u40eoinfdyxsxr3z4i7ta]$ </span><b><span style="color: #fcff01;">ll</span></b></div><div><span style="color: white;">total 125676</span></div><div><span style="color: white;">-rw-rw-r--. 1 1004lucifer 1004lucifer 128689645 Jan 16 08:18 gradle-8.2-bin.zip</span></div><div><span style="color: white;">-rw-rw-r--. 1 1004lucifer 1004lucifer 0 Jan 16 08:21 gradle-8.2-bin.zip.lck</span></div><div><span style="color: white;">-rw-rw-r--. 1 1004lucifer 1004lucifer 0 Jan 16 09:09 gradle-8.2-bin.zip.part</span></div><div><span style="color: white;">[1004lucifer@rhel8 bbg7u40eoinfdyxsxr3z4i7ta]$</span></div></div><br /></div><p><br /></p><p><br /></p><p><br /></p><h1 style="text-align: left;">Gradle 정상 수행 여부 확인</h1><div style="background-color: black;"><div><span style="color: white;"><br /></span></div><div><div><span style="color: white;">[1004lucifer@rhel8 TestGradle]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 TestGradle]$ </span><span style="color: #fcff01;"><b>./gradlew</b></span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">> Task :help</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">Welcome to Gradle 8.2.</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">To run a build, run gradlew <task> ...</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">To see a list of available tasks, run gradlew tasks</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">To see more detail about a task, run gradlew help --task <task></span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">To see a list of command-line options, run gradlew --help</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">For more detail on using Gradle, see https://docs.gradle.org/8.2/userguide/command_line_interface.html</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">For troubleshooting, visit https://help.gradle.org</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">BUILD SUCCESSFUL in 2s</span></div><div><span style="color: white;">1 actionable task: 1 executed</span></div><div><span style="color: white;">[1004lucifer@rhel8 TestGradle]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 TestGradle]$</span></div></div><br /></div><p><br /></p><p><br /></p><p><br /></p><h1 style="text-align: left;">PS.</h1><p>gradle-wrapper.properties 파일의 distributionUrl 값을 로컬에 있는 gradle-8.2-bin.zip 파일의 경로를 잡아주는 방법이 있는데..</p><p>gradle-wrapper.properties 파일 자체도 Git에 관리가 되는 소스의 일부이다보니 되도록 해당 파일을 수정하지 않는 방향으로 기술했다.</p><p>distributionUrl 값을 변경하고 gradlew 를 수행한경우 GRADLE_USER_HOME/wrapper/dists/{Gradle_Version}/ 디렉토리 하위에 값이 다른 디렉토리가 생성이 된다.<br />distributionUrl 값에 따라서 Gradle 수행 zip 파일의 위치가 달라지며 distributionUrl 값을 다시 원복 시 정상적으로 수행이 되지 않는 증상이 발생한다.</p><p><br /></p><p><br /></p><h1 style="text-align: left;">참조</h1><p>- <a href="https://smdroid.tistory.com/8" target="_blank">https://smdroid.tistory.com/8</a><br />- <a href="https://docs.gradle.org/current/dsl/org.gradle.api.tasks.wrapper.Wrapper.html" target="_blank">https://docs.gradle.org/current/dsl/org.gradle.api.tasks.wrapper.Wrapper.html</a></p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-40124681089337655542023-12-25T23:58:00.004+09:002024-01-20T16:19:28.377+09:00[git] git: 'remote-http' is not a git command 이슈 해결방법 - Git Sub Command Path 지정 (GIT_EXEC_PATH)<p> </p><p><br /></p><p><span style="font-size: x-large;"><b>증상</b></span></p><div style="background-color: black; color: white;"><br /></div><div style="background-color: black;"><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: #6aa84f;"># Git 명령어 정상 동작 하지만..</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">git</span></div><div><span style="color: white;">usage: git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]</span></div><div><span style="color: white;"> [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]</span></div><div><span style="color: white;"> [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]</span></div><div><span style="color: white;"> [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]</span></div><div><span style="color: white;"> [--config-env=<name>=<envvar>] <command> [<args>]</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">These are common Git commands used in various situations:</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">... (생략)</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">collaborate (see also: git help workflows)</span></div><div><span style="color: white;"> fetch Download objects and refs from another repository</span></div><div><span style="color: white;"> pull Fetch from and integrate with another repository or a local branch</span></div><div><span style="color: white;"> push Update remote refs along with associated objects</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">'git help -a' and 'git help -g' list available subcommands and some</span></div><div><span style="color: white;">concept guides. See 'git help <command>' or 'git help <concept>'</span></div><div><span style="color: white;">to read about a specific subcommand or concept.</span></div><div><span style="color: white;">See 'git help git' for an overview of the system.</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: #6aa84f;"><b># Git의 Sub Command 동작하지 않음.</b></span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">git remote-http</span></div><div><span style="color: white;">git: 'remote-http' is not a git command. See 'git --help'.</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><br /></div><p><br /></p><p><br /></p><p><br /></p><p><span style="font-size: x-large;"><b>원인</b></span></p><p><b style="background-color: #f4cccc;">- 처음 Git 컴파일 설치 시 설치했던 경로와 현재의 Git 디렉토리 경로가 다른경우</b><br /> 1. 다른 PC에서 Git 실행파일을 가져와서 설치한경우<br /> 2. 소스 빌드 설치 후 생성된 바이너리 Git 경로가 변경된 경우</p><p><br /></p><p><span style="color: white;">1004lucifer</span></p><p><br /></p><p><b><span style="font-size: x-large;">해결방법</span></b></p><p><b style="background-color: #d9ead3;">Git 설치된 디렉토리 구조에서 libexec/git-core 디렉토리를 찾아서 Git 환경변수를 아래와 같이 셋팅해 준다.</b></p><div style="background-color: black; color: white;"><br /></div><div style="background-color: black;"><div><span style="color: white;"><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div style="color: black;"><span style="color: #6aa84f;"># Git Sub Command 실행경로 셋팅값 확인</span><span style="color: white;"> </span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">git --exec-path</span></div><div style="color: black;"><span style="color: #3d85c6;">/home/1004lucifer/git/libexec/git-core</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div style="color: black;"><span style="color: #6aa84f;"># 실제 Git이 설치된 경로와 다름</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">pwd</span></div><div style="color: black;"><span style="color: #3d85c6;">/home/1004lucifer/git-binary/bin</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">cd ../</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-binary]$ </span><span style="color: #fcff01;">ll</span></div><div style="color: black;"><span style="color: white;">total 0</span></div><div style="color: black;"><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 154 Dec 22 09:17 bin</span></div><div style="color: black;"><span style="color: white;">drwxr-xr-x. 3 1004lucifer 1004lucifer 22 Dec 22 09:17 libexec</span></div><div style="color: black;"><span style="color: white;">drwxr-xr-x. 8 1004lucifer 1004lucifer 90 Dec 22 09:17 share</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-binary]$</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-binary]$ </span><span style="color: #fcff01;">cd libexec/</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 libexec]$ ll</span></div><div style="color: black;"><span style="color: white;">total 12</span></div><div style="color: black;"><span style="color: white;">drwxr-xr-x. 3 1004lucifer 1004lucifer 8192 Dec 22 09:17 git-core</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 libexec]$ </span><span style="color: #fcff01;">cd git-core/</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-core]$ </span><span style="color: #fcff01;">ll</span></div><div style="color: black;"><span style="color: white;">total 3231864</span></div><div style="color: black;"><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git</span></div><div style="color: black;"><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git-add</span></div><div style="color: black;"><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git-am</span></div><div style="color: black;"><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git-annotate</span></div><div style="color: black;"><span style="color: white;"><br /></span></div><div style="color: black;"><span style="color: white;">... (생략)</span></div><div style="color: black;"><span style="color: white;"><br /></span></div><div style="color: black;"><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git-whatchanged</span></div><div style="color: black;"><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git-worktree</span></div><div style="color: black;"><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git-write-tree</span></div><div style="color: black;"><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 4096 Dec 22 09:17 mergetools</span></div><div style="color: black;"><span style="color: white;">-rwxr-xr-x. 2 1004lucifer 1004lucifer 14104232 Dec 22 09:17 scalar</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div style="color: black;"><span style="color: #6aa84f;"># 실제 Git Sub Command 위치한 경로를 확인</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-core]$ </span><span style="color: #fcff01;">pwd</span></div><div style="color: black;"><span style="color: #3d85c6;">/home/1004lucifer/git-binary/libexec/git-core</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div style="color: black;"><span style="color: #6aa84f;"># Git의 GIT_EXEC_PATH 환경변수를 설정 (경로는 본인 경로 맞게..)</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-core]$ </span><span style="color: #fcff01;">vi ~/.bash_profile</span></div><div style="color: black;"><span style="color: #e69138;">export GIT_EXEC_PATH=/home/1004lucifer/git-binary/libexec/git-core</span></div><div style="color: black;"><span style="color: white;"><br /></span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div style="color: black;"><span style="color: #6aa84f;"><b># Git Sub Command 정상 동작 확인</b></span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-core]$ </span><span style="color: #fcff01;">git remote-http</span></div><div style="color: black;"><span style="color: white;">error: remote-curl: usage: git remote-curl <remote> [<url>]</span></div><div style="color: black;"><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div></span></div><br /></div><p><br /></p><p>참고<br />- <a href="https://1004lucifer.blogspot.com/2023/12/git-how-to-install-git-in-offline.html" target="_blank">https://1004lucifer.blogspot.com/2023/12/git-how-to-install-git-in-offline.html</a></p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-13015926828068427622023-12-23T00:13:00.010+09:002024-01-20T17:33:56.950+09:00[Git] How to install Git in an offline environment (오프라인 Linux 환경 Git 설치 방법)<p> </p><p><br /></p><p><a href="https://git-scm.com/download/linux" target="_blank">https://git-scm.com/download/linux</a></p><p><b><u style="background-color: #ead1dc;">Git Downlaod 페이지에서는 Linux 용 바이너리 파일을 제공하지 않는다.</u></b><br />아래의 URL에서 Source를 다운 받아서 직접 컴파일/빌드를 수행해서 실행 가능한 Git 바이너리를 제작해야 한다.<br />- <a href="https://mirrors.edge.kernel.org/pub/software/scm/git/" target="_blank">https://mirrors.edge.kernel.org/pub/software/scm/git/</a><br />- <a href="https://github.com/git/git/tags" target="_blank">https://github.com/git/git/tags</a></p><p><br /></p><p><br /></p><p><span style="font-size: x-large;"><b>실습 환경</b></span></p><p><b>OS :</b> (RedHat Enterprise Linux) RHEL 8.6 (or CentOS)</p><p><b>Git Source Version :</b> v2.43.0</p><p><br /></p><p><br /></p><p><br /></p><p><span style="font-size: x-large;"><b>조건 (<span style="color: red;">중요!!!</span>)</b></span></p><p><span style="background-color: #f4cccc;">- <b>아래의 두가지 조건을 충족해야만 오프라인 설치가 가능하다.</b></span><br /> 1. (root) sudo 권한 사용가능<br /> 2. (Local) Yum_Repository 사용가능</p><p><b style="background-color: #fce5cd;">- 위 조건이 충족되지 않으면 인터넷이 연결된 다른 PC에서 아래와 같이 Git 소스 컴파일 후 생성된 Git 바이너리 파일을 압축하여 가져와야 한다.<br /> (1~3번의 작업을 Online 가능 Linux에서 작업 수행)</b></p><p><br /></p><p><br /></p><p><span style="font-size: x-large;"><b>1. Git 소스 파일 업로드 및 압축해제</b></span></p><p>Git 소스파일은 아래의 경로에서 다운로드 가능하다.<br />- <a href="https://github.com/git/git/tags" target="_blank">https://github.com/git/git/tags</a></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimGxc1jDoszktFTzHNcYldeY-CtPrnvb78dZ52RErf_KhttnFFVqpol_Wjrx7-eiMeFK_alNGTxrtP2WYqRMJpM_nkkfMv4LbagBtwDTVJ63naCWT-blkx78ilLQJzNmWtVfP1LbYQy1UYb-PcBnUKnIuvW-ZavpLfmEUr-TJGELqlZBMzvC5xWR6ekWA/s334/git_01.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="243" data-original-width="334" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimGxc1jDoszktFTzHNcYldeY-CtPrnvb78dZ52RErf_KhttnFFVqpol_Wjrx7-eiMeFK_alNGTxrtP2WYqRMJpM_nkkfMv4LbagBtwDTVJ63naCWT-blkx78ilLQJzNmWtVfP1LbYQy1UYb-PcBnUKnIuvW-ZavpLfmEUr-TJGELqlZBMzvC5xWR6ekWA/s16000/git_01.png" /></a></div><p><br /></p><div style="background-color: black; color: white;"><br /></div><div style="background-color: black;"><div style="color: white;">[1004lucifer@rhel8 ~]$</div><div><span style="color: #6aa84f;"># 현재 위치 확인</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$ </span><span style="color: #fcff01;">pwd</span></div><div style="color: white;">/home/1004lucifer</div><div style="color: white;">[1004lucifer@rhel8 ~]$</div><div><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div><div><span style="color: #6aa84f;"># git-2.43.0.tar.gz 압축 해제</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$ </span><span style="color: #fcff01;">tar zxvf git-2.43.0.tar.gz</span></div><div><span style="color: white;">git-2.43.0/</span></div><div><span style="color: white;">git-2.43.0/.cirrus.yml</span></div><div><span style="color: white;">git-2.43.0/.clang-format</span></div><div><span style="color: white;">git-2.43.0/.editorconfig</span></div><div><span style="color: white;">git-2.43.0/.gitattributes</span></div><div><span style="color: white;">git-2.43.0/.github/</span></div><div><span style="color: white;">git-2.43.0/.github/CONTRIBUTING.md</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">... (생략)</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">git-2.43.0/xdiff/xprepare.h</span></div><div><span style="color: white;">git-2.43.0/xdiff/xtypes.h</span></div><div><span style="color: white;">git-2.43.0/xdiff/xutils.c</span></div><div><span style="color: white;">git-2.43.0/xdiff/xutils.h</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$ </span><span style="color: #fcff01;">ls -l</span></div><div><span style="color: white;">total 10744</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Desktop</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Documents</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Downloads</span></div><div><span style="color: white;">drwxrwxr-x. 28 1004lucifer 1004lucifer 16384 Nov 19 20:28 </span><span style="color: #3d85c6;">git-2.43.0</span></div><div><span style="color: white;">-rw-rw-r--. 1 1004lucifer 1004lucifer 10967997 Dec 22 08:31 </span><span style="color: #3d85c6;">git-2.43.0.tar.gz</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Music</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Pictures</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Public</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Templates</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Videos</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div></div></div><div style="background-color: black; color: white;"><br /></div><p><br /></p><p><br /></p><p><span style="font-size: x-large;"><b>2. 필요한 패키지 설치</b></span></p><p>- 필요한 패키지를 모두 설치하지 않으면 빌드가 되지 않거나 일부기능(sub command)가 누락되어 빌드가 될 수 있다.</p><div style="background-color: black; color: white;"><br /></div><div style="background-color: black;"><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div><div><span style="color: #6aa84f;"># 필요한 패키지 설치</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$ </span><span style="color: #fcff01;">sudo yum install gcc make autoconf curl-devel expat-devel gettext-devel openssl-devel perl-devel zlib-devel</span></div><div><span style="color: white;">[sudo] password for 1004lucifer:</span></div><div><span style="color: white;">Updating Subscription Management repositories.</span></div><div><span style="color: white;">Unable to read consumer identity</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">This system is not registered with an entitlement server. You can use subscription-manager to register.</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">Last metadata expiration check: 48 days, 6:31:53 ago on Sat 04 Nov 2023 03:00:58 AM EDT.</span></div><div><span style="color: white;">Dependencies resolved.</span></div><div><div><span style="color: white;">==================================================================================================================================================</span></div><div><span style="color: white;"> Package Architecture Version Repository Size</span></div><div><span style="color: white;">==================================================================================================================================================</span></div><div><span style="color: white;">Installing:</span></div><div><span style="color: white;"> autoconf noarch 2.69-29.el8 InstallMedia-AppStream 711 k</span></div><div><span style="color: white;"> expat-devel x86_64 2.2.5-8.el8 InstallMedia-BaseOS 57 k</span></div><div><span style="color: white;"> gcc x86_64 8.5.0-10.el8 InstallMedia-AppStream 23 M</span></div><div><span style="color: white;"> gettext-devel x86_64 0.19.8.1-17.el8 InstallMedia-BaseOS 331 k</span></div><div><span style="color: white;"> libcurl-devel x86_64 7.61.1-22.el8 InstallMedia-BaseOS 834 k</span></div><div><span style="color: white;"> make x86_64 1:4.2.1-11.el8 InstallMedia-BaseOS 498 k</span></div><div><span style="color: white;"> openssl-devel x86_64 1:1.1.1k-6.el8_5 InstallMedia-BaseOS 2.3 M</span></div><div><span style="color: white;"> perl-devel x86_64 4:5.26.3-421.el8 InstallMedia-AppStream 599 k</span></div><div><span style="color: white;"> zlib-devel x86_64 1.2.11-18.el8_5 InstallMedia-BaseOS 58 k</span></div><div><span style="color: white;">Installing dependencies:</span></div><div><span style="color: white;"> annobin x86_64 10.29-3.el8 InstallMedia-AppStream 117 k</span></div><div><span style="color: white;"> cpp x86_64 8.5.0-10.el8 InstallMedia-AppStream 10 M</span></div><div><span style="color: white;"> dwz x86_64 0.12-10.el8 InstallMedia-AppStream 109 k</span></div><div><span style="color: white;"> efi-srpm-macros noarch 3-3.el8 InstallMedia-AppStream 22 k</span></div><div><span style="color: white;"> gettext-common-devel noarch 0.19.8.1-17.el8 InstallMedia-BaseOS 419 k</span></div><div><span style="color: white;"> ghc-srpm-macros noarch 1.4.2-7.el8 InstallMedia-AppStream 9.4 k</span></div><div><span style="color: white;"> glibc-devel x86_64 2.28-189.1.el8 InstallMedia-BaseOS 79 k</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">... (생략)</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;"> python-rpm-macros-3-41.el8.noarch python-srpm-macros-3-41.el8.noarch</span></div><div><span style="color: white;"> python3-pyparsing-2.1.10-7.el8.noarch python3-rpm-macros-3-41.el8.noarch</span></div><div><span style="color: white;"> qt5-srpm-macros-5.15.2-1.el8.noarch redhat-rpm-config-129-1.el8.noarch</span></div><div><span style="color: white;"> rust-srpm-macros-5-2.el8.noarch systemtap-sdt-devel-4.6-4.el8.x86_64</span></div><div><span style="color: white;"> zlib-devel-1.2.11-18.el8_5.x86_64</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">Complete!</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div></div></div><div style="background-color: black; color: white;"><br /></div><p>참고<br />- <a href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git" target="_blank">https://git-scm.com/book/en/v2/Getting-Started-Installing-Git</a></p><p>* Fedora 또는 Debian 기반의 Ubuntu 같은 시스템은 아래와 같이 설치한다.</p><div style="background-color: black; color: white;"><br /></div><div style="background-color: black; color: white;">(Fedora)</div><div style="background-color: black; color: white;"><div>$ sudo dnf install dh-autoreconf curl-devel expat-devel gettext-devel openssl-devel perl-devel zlib-devel</div><div><br /></div><div>(Debian or Ubuntu)</div><div>$ sudo apt-get install dh-autoreconf libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev</div><br /></div><p><br /></p><p><br /></p><p><span style="font-size: x-large;"><b>3. Source Build & Install</b></span></p><p>- 소스를 빌드하고 원하는 경로에 설치한다.</p><div style="background-color: black; color: white;"><br /></div><div style="background-color: black;"><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div><div><span style="color: #6aa84f;"># Git Source 디렉토리로 이동</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$ </span><span style="color: #fcff01;">cd git-2.43.0/</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$</span></div><div><span style="color: #6aa84f;"># configure 파일 생성</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$ </span><span style="color: #fcff01;">make configure</span></div><div><span style="color: white;">GIT_VERSION = 2.43.0</span></div><div><span style="color: white;"> GEN configure</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$</span></div><div><span style="color: #6aa84f;"># configure 실행 (<u>설치 하려는 디렉토리에 쓰기 권한이 있어야 한다.</u>)</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$ </span><span style="color: #fcff01;">./configure --prefix=/home/1004lucifer/git</span></div><div><span style="color: white;">configure: Setting lib to 'lib' (the default)</span></div><div><span style="color: white;">configure: Will try -pthread then -lpthread to enable POSIX Threads.</span></div><div><span style="color: white;">configure: CHECKS for site configuration</span></div><div><span style="color: white;">checking for gcc... gcc</span></div><div><span style="color: white;">checking whether the C compiler works... yes</span></div><div><span style="color: white;">checking for C compiler default output file name... a.out</span></div><div><span style="color: white;">checking for suffix of executables...</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">... (생략)</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">checking for library containing getdelim... none required</span></div><div><span style="color: white;">checking for BSD sysctl... no</span></div><div><span style="color: white;">checking for POSIX Threads with ''... no</span></div><div><span style="color: white;">checking for POSIX Threads with '-mt'... no</span></div><div><span style="color: white;">checking for POSIX Threads with '-pthread'... yes</span></div><div><span style="color: white;">configure: creating ./config.status</span></div><div><span style="color: white;">config.status: creating config.mak.autogen</span></div><div><span style="color: white;">config.status: executing config.mak.autogen commands</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$</span></div><div><span style="color: #6aa84f;"># Build 실행</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$ </span><span style="color: #fcff01;">make</span></div><div><span style="color: white;"> * new build flags</span></div><div><span style="color: white;"> CC oss-fuzz/fuzz-commit-graph.o</span></div><div><span style="color: white;"> CC oss-fuzz/fuzz-pack-headers.o</span></div><div><span style="color: white;"> CC oss-fuzz/fuzz-pack-idx.o</span></div><div><span style="color: white;"> CC daemon.o</span></div><div><span style="color: white;"> * new link flags</span></div><div><span style="color: white;"> CC common-main.o</span></div><div><span style="color: white;"> CC abspath.o</span></div><div><span style="color: white;"> CC add-interactive.o</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">... (생략)</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;"> GEN bin-wrappers/test-fake-ssh</span></div><div><span style="color: white;"> GEN bin-wrappers/test-tool</span></div><div><span style="color: white;"> GEN gitweb/gitweb.cgi</span></div><div><span style="color: white;"> GEN gitweb/static/gitweb.js</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$</span></div><div><span style="color: #6aa84f;"># Build된 Git Binary를 설치 경로로 설치</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$ </span><span style="color: #fcff01;">make install</span></div><div><span style="color: white;"> SUBDIR git-gui</span></div><div><span style="color: white;"> SUBDIR gitk-git</span></div><div><span style="color: white;"> SUBDIR templates</span></div><div><span style="color: white;">install -d -m 755 '/home/1004lucifer/git/share/gitweb'</span></div><div><span style="color: white;">install -m 755 gitweb/gitweb.cgi '/home/1004lucifer/git/share/gitweb'</span></div><div><span style="color: white;">install -d -m 755 '/home/1004lucifer/git/share/gitweb/static'</span></div><div><span style="color: white;">install -m 644 gitweb/static/gitweb.js gitweb/static/gitweb.css gitweb/static/git-logo.png gitweb/static/git-favicon.png \</span></div><div><span style="color: white;"> '/home/1004lucifer/git/share/gitweb/static'</span></div><div><span style="color: white;">install -d -m 755 '/home/1004lucifer/git/bin'</span></div><div><span style="color: white;">install -d -m 755 '/home/1004lucifer/git/libexec/git-core'</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">... (생략)</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">remote_curl_aliases="git-remote-https git-remote-ftp git-remote-ftps" && \</span></div><div><span style="color: white;">for p in $remote_curl_aliases; do \</span></div><div><span style="color: white;"> rm -f "$execdir/$p" && \</span></div><div><span style="color: white;"> test -n "" && \</span></div><div><span style="color: white;"> ln -s "git-remote-http" "$execdir/$p" || \</span></div><div><span style="color: white;"> { test -z "" && \</span></div><div><span style="color: white;"> ln "$execdir/git-remote-http" "$execdir/$p" 2>/dev/null || \</span></div><div><span style="color: white;"> ln -s "git-remote-http" "$execdir/$p" 2>/dev/null || \</span></div><div><span style="color: white;"> cp "$execdir/git-remote-http" "$execdir/$p" || exit; } \</span></div><div><span style="color: white;">done</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$</span></div><div><span style="color: #6aa84f;"># 설치된 Git Binary 확인 (/home/1004lucifer/git)</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$ </span><span style="color: #fcff01;">cd /home/1004lucifer</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$ </span><span style="color: #fcff01;">ls -l</span></div><div><span style="color: white;">total 10756</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Desktop</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Documents</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Downloads</span></div><div><span style="color: white;">drwxr-xr-x. 5 1004lucifer 1004lucifer 45 Dec 22 09:17 </span><span style="color: #3d85c6;">git</span></div><div><span style="color: white;">drwxrwxr-x. 31 1004lucifer 1004lucifer 28672 Dec 22 09:17 git-2.43.0</span></div><div><span style="color: white;">-rw-rw-r--. 1 1004lucifer 1004lucifer 10967997 Dec 22 08:31 git-2.43.0.tar.gz</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Music</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Pictures</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Public</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Templates</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Videos</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div></div><div style="background-color: black; color: white;"><br /></div><p><br /></p><p><br /></p><p><b><span style="font-size: x-large;">3.1 Git Binary 파일 압축 및 배포</span></b></p><p>- <span style="background-color: #ead1dc;">Offline Linux 에서 Source Build를 할 수 없는 상황인경우</span> 1~3번의 작업을 인터넷이 되는 동일한 OS에서 작업하여 아래와 같이 생성된 바이너리 파일을 Offline Linux 로 (업로드)배포한다.</p><div style="background-color: black; color: white;"><br /></div><div style="background-color: black;"><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div><div><span style="color: #6aa84f;"># Git Binary 파일 압축</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$ </span><span style="color: #fcff01;">tar zcvf git-binary.tar.gz git/</span></div><div><span style="color: white;">git/</span></div><div><span style="color: white;">git/share/</span></div><div><span style="color: white;">git/share/gitweb/</span></div><div><span style="color: white;">git/share/gitweb/gitweb.cgi</span></div><div><span style="color: white;">git/share/gitweb/static/</span></div><div><span style="color: white;">git/share/gitweb/static/gitweb.js</span></div><div><span style="color: white;">git/share/gitweb/static/gitweb.css</span></div><div><span style="color: white;">git/share/gitweb/static/git-logo.png</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">... (생략)</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">git/libexec/git-core/git-stage</span></div><div><span style="color: white;">git/libexec/git-core/git-status</span></div><div><span style="color: white;">git/libexec/git-core/git-switch</span></div><div><span style="color: white;">git/libexec/git-core/git-version</span></div><div><span style="color: white;">git/libexec/git-core/git-whatchanged</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div><div><span style="color: #6aa84f;"># 압축된 파일 확인 (해당 파일을 동일 OS의 Offline Linux 로 가져간다.)</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$ </span><span style="color: #fcff01;">ls -l</span></div><div><span style="color: white;">total 71004</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Desktop</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Documents</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Downloads</span></div><div><span style="color: white;">drwxr-xr-x. 5 1004lucifer 1004lucifer 45 Dec 22 09:17 </span><span style="color: white;">git</span></div><div><span style="color: white;">drwxrwxr-x. 31 1004lucifer 1004lucifer 28672 Dec 22 09:17 git-2.43.0</span></div><div><span style="color: white;">-rw-rw-r--. 1 1004lucifer 1004lucifer 10967997 Dec 22 08:31 git-2.43.0.tar.gz</span></div><div><span style="color: white;">-rw-rw-r--. 1 1004lucifer 1004lucifer 61690824 Dec 22 09:27 </span><span style="color: #3d85c6;">git-binary.tar.gz</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Music</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Pictures</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Public</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Templates</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 6 Nov 4 01:42 Videos</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div><br /></div><p><br /></p><p><br /></p><p><span style="font-size: x-large;"><b>4. 환경설정</b></span></p><p>- 아래의 환경설정은 본인의 환경 / 취향에 맞게 작업</p><div style="background-color: black; color: white;"><br /></div><div style="background-color: black;"><div><span style="color: white;">[1004lucifer@rhel8 ~]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 ~]$ </span><span style="color: #fcff01;">cd git/bin/</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">ls -l</span></div><div><span style="color: white;">total 117440</span></div><div><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git</span></div><div><span style="color: white;">-rwxr-xr-x. 2 1004lucifer 1004lucifer 163765 Dec 22 09:17 git-cvsserver</span></div><div><span style="color: white;">-rwxr-xr-x. 1 1004lucifer 1004lucifer 402054 Dec 22 09:17 gitk</span></div><div><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git-receive-pack</span></div><div><span style="color: white;">-rwxr-xr-x. 2 1004lucifer 1004lucifer 13944064 Dec 22 09:17 git-shell</span></div><div><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git-upload-archive</span></div><div><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git-upload-pack</span></div><div><span style="color: white;">-rwxr-xr-x. 2 1004lucifer 1004lucifer 14104232 Dec 22 09:17 scalar</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: #6aa84f;"># Git Binary 파일 위치 확인</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">pwd</span></div><div><span style="color: #3d85c6;">/home/1004lucifer/git/bin</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: #6aa84f;"># PATH 환경변수 설정 전</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">git --version</span></div><div><span style="color: white;">bash: git: command not found...</span></div><div><span style="color: white;">Install package 'git-core' to provide command 'git'? [N/y] ^C</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">./git --version</span></div><div><span style="color: white;">git version 2.43.0</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: #6aa84f;"># 해당 내용을 파일의 제일 마지막에 추가 (경로는 본인 설치한 경로로 수정)</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">vi ~/.bash_profile</span></div><div><span style="color: #e69138;">export PATH=$PATH:/home/1004lucifer/git/bin</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: #6aa84f;"># 환경변수 Reload</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">source ~/.bash_profile</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">git --version</span></div><div><span style="color: white;">git version 2.43.0</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><br /></div><p><span style="color: white;">1004lucifer</span></p><p><br /></p><p><b><span style="font-size: x-large;">4.1 추가 환경설정 (<span style="color: red;">중요!!</span>)</span></b></p><p><span style="background-color: #f4cccc;"><b>- 처음 소스 빌드의 설치한 경로와 현재의 Git 디렉토리 경로가 다른경우 아래 작업 필요</b></span><br /> 1. Online => Offline Linux 로 가져온 후 다른 경로에 Git을 구성한경우<br /> 2) 소스 빌드 설치 후 생성된 바이너리 Git 경로가 변경된경우</p><div style="background-color: black; color: white;"><br /></div><div style="background-color: black;"><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: #6aa84f;"># Git 명령어 정상 동작 하지만..</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">git</span></div><div><span style="color: white;">usage: git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]</span></div><div><span style="color: white;"> [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]</span></div><div><span style="color: white;"> [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]</span></div><div><span style="color: white;"> [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]</span></div><div><span style="color: white;"> [--config-env=<name>=<envvar>] <command> [<args>]</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">These are common Git commands used in various situations:</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">... (생략)</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">collaborate (see also: git help workflows)</span></div><div><span style="color: white;"> fetch Download objects and refs from another repository</span></div><div><span style="color: white;"> pull Fetch from and integrate with another repository or a local branch</span></div><div><span style="color: white;"> push Update remote refs along with associated objects</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">'git help -a' and 'git help -g' list available subcommands and some</span></div><div><span style="color: white;">concept guides. See 'git help <command>' or 'git help <concept>'</span></div><div><span style="color: white;">to read about a specific subcommand or concept.</span></div><div><span style="color: white;">See 'git help git' for an overview of the system.</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: #6aa84f;"><b># Git의 Sub Command 동작하지 않음.</b></span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">git remote-http</span></div><div><span style="color: white;">git: 'remote-http' is not a git command. See 'git --help'.</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: #6aa84f;"># Git Sub Command 실행경로 셋팅값 확인</span><span style="color: white;"> </span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">git --exec-path</span></div><div><span style="color: #3d85c6;">/home/1004lucifer/git/libexec/git-core</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: #6aa84f;"># 실제 Git이 설치된 경로와 다름</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">pwd</span></div><div><span style="color: #3d85c6;">/home/1004lucifer/git-binary/bin</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">cd ../</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-binary]$ </span><span style="color: #fcff01;">ll</span></div><div><span style="color: white;">total 0</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 154 Dec 22 09:17 bin</span></div><div><span style="color: white;">drwxr-xr-x. 3 1004lucifer 1004lucifer 22 Dec 22 09:17 libexec</span></div><div><span style="color: white;">drwxr-xr-x. 8 1004lucifer 1004lucifer 90 Dec 22 09:17 share</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-binary]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-binary]$ </span><span style="color: #fcff01;">cd libexec/</span></div><div><span style="color: white;">[1004lucifer@rhel8 libexec]$ ll</span></div><div><span style="color: white;">total 12</span></div><div><span style="color: white;">drwxr-xr-x. 3 1004lucifer 1004lucifer 8192 Dec 22 09:17 git-core</span></div><div><span style="color: white;">[1004lucifer@rhel8 libexec]$ </span><span style="color: #fcff01;">cd git-core/</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-core]$ </span><span style="color: #fcff01;">ll</span></div><div><span style="color: white;">total 3231864</span></div><div><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git</span></div><div><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git-add</span></div><div><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git-am</span></div><div><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git-annotate</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">... (생략)</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git-whatchanged</span></div><div><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git-worktree</span></div><div><span style="color: white;">-rwxr-xr-x. 141 1004lucifer 1004lucifer 22905472 Dec 22 09:17 git-write-tree</span></div><div><span style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 4096 Dec 22 09:17 mergetools</span></div><div><span style="color: white;">-rwxr-xr-x. 2 1004lucifer 1004lucifer 14104232 Dec 22 09:17 scalar</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div><span style="color: #6aa84f;"># 실제 Git Sub Command 위치한 경로를 확인</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-core]$ </span><span style="color: #fcff01;">pwd</span></div><div><span style="color: #3d85c6;">/home/1004lucifer/git-binary/libexec/git-core</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div><span style="color: #6aa84f;"># Git의 GIT_EXEC_PATH 환경변수를 설정 (경로는 본인 경로 맞게..)</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-core]$ </span><span style="color: #fcff01;">vi ~/.bash_profile</span></div><div><span style="color: #e69138;">export GIT_EXEC_PATH=/home/1004lucifer/git-binary/libexec/git-core</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><div><span style="color: #6aa84f;"><b># Git Sub Command 정상 동작 확인</b></span></div><div><span style="color: white;">[1004lucifer@rhel8 git-core]$ </span><span style="color: #fcff01;">git remote-http</span></div><div><span style="color: white;">error: remote-curl: usage: git remote-curl <remote> [<url>]</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-core]$</span></div><br /></div><p><br /></p><p><br /></p><p><b style="background-color: #f4cccc;">- system config 를 사용할 시 오류가 발생하는 경우</b><br />(위애서 git 설치 시 system config의 경로를 지정하지 않았음, prefix 경로인 /home/1004lucifer/git 경로에 etc/gitconfig 가 기본 셋팅됨)</p><div style="background-color: black;"><span style="color: white;"><br /></span></div><div style="background-color: black;"><div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">git config --system -l</span></div><div><span style="color: #9fc5e8;">fatal: unable to read config file '/home/1004lucifer/git/etc/gitconfig': No such file or directory</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$ </span><span style="color: #fcff01;">git config --system --edit</span></div><div><span style="color: #9fc5e8;">hint: Waiting for your editor to close the file... fatal: Invalid path '/home/1004lucifer/git/etc': No such file or directory</span></div><div><span style="color: white;">[1004lucifer@rhel8 bin]$</span></div></div><div><span style="color: white;"><br /></span></div><div><span style="color: #fce5cd;"><b># 다음과 같이 작업이 가능하다.</b></span></div><div><br /></div><div><div style="color: white;">[1004lucifer@rhel8 git]$</div><div><span style="color: #6aa84f;"># 현재위치 확인 (Git 설치된 디렉토리)</span></div><div><span style="color: white;">[1004lucifer@rhel8 git]$ </span><span style="color: #fcff01;">pwd</span></div><div style="color: white;">/home/1004lucifer/git</div><div style="color: white;">[1004lucifer@rhel8 git]$</div><div><span style="color: white;">[1004lucifer@rhel8 git]$ </span><span style="color: #fcff01;">ls -l</span></div><div style="color: white;">total 0</div><div style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 154 Jan 20 02:06 bin</div><div style="color: white;">drwxr-xr-x. 3 1004lucifer 1004lucifer 22 Jan 20 02:06 libexec</div><div style="color: white;">drwxr-xr-x. 8 1004lucifer 1004lucifer 90 Jan 20 02:06 share</div><div style="color: white;">[1004lucifer@rhel8 git]$</div><div><span style="color: #6aa84f;"># etc 디렉토리를 생성해 준다.</span></div><div><span style="color: white;">[1004lucifer@rhel8 git]$ </span><span style="color: #fcff01;">mkdir etc</span></div><div style="color: white;">[1004lucifer@rhel8 git]$</div><div><span style="color: white;">[1004lucifer@rhel8 git]$ </span><span style="color: #fcff01;">ls -l</span></div><div style="color: white;">total 0</div><div style="color: white;">drwxr-xr-x. 2 1004lucifer 1004lucifer 154 Jan 20 02:06 bin</div><div style="color: white;">drwxrwxr-x. 2 1004lucifer 1004lucifer 6 Jan 20 03:17 etc</div><div style="color: white;">drwxr-xr-x. 3 1004lucifer 1004lucifer 22 Jan 20 02:06 libexec</div><div style="color: white;">drwxr-xr-x. 8 1004lucifer 1004lucifer 90 Jan 20 02:06 share</div><div style="color: white;">[1004lucifer@rhel8 git]$</div><div><span style="color: white;">[1004lucifer@rhel8 git]$ </span><span style="color: #fcff01;">cd etc</span></div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div><span style="color: #6aa84f;"># etc 디렉토리안에 gitconfig 파일 생성 (system config 파일)</span></div><div><span style="color: white;">[1004lucifer@rhel8 etc]$ </span><span style="color: #fcff01;">touch gitconfig</span></div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div><span style="color: white;">[1004lucifer@rhel8 etc]$ </span><span style="color: #fcff01;">pwd</span></div><div style="color: white;">/home/1004lucifer/git/etc</div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div><span style="color: white;">[1004lucifer@rhel8 etc]$ </span><span style="color: #fcff01;">ls -l</span></div><div style="color: white;">total 0</div><div style="color: white;">-rw-rw-r--. 1 1004lucifer 1004lucifer 0 Jan 20 03:17 gitconfig</div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div><span style="color: #6aa84f;"># system config 파일 환경변수를 추가해 준다. (경로는 본인PC의 경로에 맞게..)</span></div><div><span style="color: white;">[1004lucifer@rhel8 etc]$ </span><span style="color: #fcff01;">vi ~/.bash_profile</span></div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div><span style="color: white;">[1004lucifer@rhel8 etc]$ </span><span style="color: #fcff01;">cat ~/.bash_profile</span></div><div style="color: white;"># .bash_profile</div><div style="color: white;"><br /></div><div style="color: white;"># Get the aliases and functions</div><div style="color: white;">if [ -f ~/.bashrc ]; then</div><div style="color: white;"> . ~/.bashrc</div><div style="color: white;">fi</div><div style="color: white;"><br /></div><div style="color: white;"># User specific environment and startup programs</div><div style="color: white;">export PATH=$PATH:/home/1004lucifer/git-binary/bin</div><div style="color: white;">export GIT_EXEC_PATH=/home/1004lucifer/git-binary/libexec/git-core</div><div><span style="color: #6fa8dc;">export GIT_CONFIG_SYSTEM=/home/1004lucifer/git/etc/gitconfig</span></div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div><span style="color: #6aa84f;"># 추가한 환경변수를 현재 쉘에 바로 적용</span></div><div><span style="color: white;">[1004lucifer@rhel8 etc]$ </span><span style="color: #fcff01;">source ~/.bash_profile</span></div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div><span style="color: #6aa84f;"># 에러 발생하지 않음 확인</span></div><div><span style="color: white;">[1004lucifer@rhel8 etc]$ </span><span style="color: #fcff01;">git config --system -l</span></div><div style="color: white;">[1004lucifer@rhel8 etc]$</div><div style="color: white;"><br /></div></div></div><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><b><span style="font-size: x-large;">PS.</span></b></p><p>- 혹시나 소스 빌드 시 --exec-path 경로를 상대경로로 지정 가능할까 싶어 configure 파일을 뒤져서 --exec-prefix 옵션을 알아냈지만.. 상대 경로로는 설정 및 빌드가 불가능했었다.<br />- 결국 Online 에서 가져온 Git Binary 설치 시 GIT_EXEC_PATH 환경변수는 무조건 셋팅이 필요한 상황이다.</p><div style="background-color: black;"><span style="color: white;"><br /></span></div><div style="background-color: black;"><div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$ </span><span style="color: #fcff01;">./configure --prefix=/home/1004lucifer/git --exec-prefix=../libexec/git-core</span></div><div><span style="color: white;">configure: error: expected an absolute directory name for --exec_prefix: ../libexec/git-core</span></div><div><span style="color: white;">[1004lucifer@rhel8 git-2.43.0]$</span></div></div><br /></div><p><br /></p><p>참고<br />- <a href="https://raw.githubusercontent.com/git/git/master/INSTALL" target="_blank">https://raw.githubusercontent.com/git/git/master/INSTALL</a><br />- <a href="https://yoosejin.github.io/etc/2021/01/09/upgrade-git.html" target="_blank">https://yoosejin.github.io/etc/2021/01/09/upgrade-git.html</a><br />- <a href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git" target="_blank">https://git-scm.com/book/en/v2/Getting-Started-Installing-Git</a><br />- <a href="https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables" target="_blank">https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables</a><br />- <a href="https://git-scm.com/download/linux" target="_blank">https://git-scm.com/download/linux</a></p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-78232478612271413452023-12-07T22:42:00.008+09:002024-01-15T23:01:30.758+09:00[Windows] 윈도우10 - 작업표시줄 여러 디스플레이 기능 "비활성화" 이슈<p> </p><h1 style="text-align: left;">증상</h1><p>회사 PC에서 작업표시줄을 모니터 2개 표시하기 위해 "작업 표시줄 설정"의 "여러 디스플레이" 항목에 "모든 디스플레이에 작업 표시줄 표시" 항목을 켜려고 했었다.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhvCCH9SkRYQNBmCPT-0mYWoapFJJ8xmlcXCx5LKFKH6SuxKypxBC8g-h96LhKbmChD3haFhgjLkxvX1YumFM0U93NB66QQjhF37SVT0_0AqImHKGpkGQxbnSUW0IRXj1wv-fc8_Dmw-RgMHvkuSFH2IjXNtCKGZ3dSMc_ddxe6EiMMFS7jHTe-u4Npoyg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="334" data-original-width="474" src="https://blogger.googleusercontent.com/img/a/AVvXsEhvCCH9SkRYQNBmCPT-0mYWoapFJJ8xmlcXCx5LKFKH6SuxKypxBC8g-h96LhKbmChD3haFhgjLkxvX1YumFM0U93NB66QQjhF37SVT0_0AqImHKGpkGQxbnSUW0IRXj1wv-fc8_Dmw-RgMHvkuSFH2IjXNtCKGZ3dSMc_ddxe6EiMMFS7jHTe-u4Npoyg=s16000" /></a></div><br /><span style="color: white;">작업 표시줄</span><div><span style="color: white;">여러 디스플레이</span></div><div><span style="color: white;">모든 디스플레이에 작업 표시줄 표시</span><br /><p></p><p>하지만 아래와 같이 해당 항목이 비활성화 되어있는 상황이었다.</p><p><u>아마 MS의 Active Directory 정책에 따라 해당 기능이 막혀있는 것으로 의심이 되었다.</u></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgEY6TX1jfsNIIXDhJA3f3hlpDMrfnVyyDhMUXnQWHih8vFhMtRyQqMrY91s2OnAMHY6NEW0bnhCl33rZ4bWaEfkhoG_s7IelYDcoXX83TV_ZmFJ285M1A7mvq_Xf8x5tj1v8XZN5gRP7H5WGXCFpF3azroEBtSwh5IDqxSWaMtGqJRxgYxrj4kk0pwnkw" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="416" data-original-width="426" src="https://blogger.googleusercontent.com/img/a/AVvXsEgEY6TX1jfsNIIXDhJA3f3hlpDMrfnVyyDhMUXnQWHih8vFhMtRyQqMrY91s2OnAMHY6NEW0bnhCl33rZ4bWaEfkhoG_s7IelYDcoXX83TV_ZmFJ285M1A7mvq_Xf8x5tj1v8XZN5gRP7H5WGXCFpF3azroEBtSwh5IDqxSWaMtGqJRxgYxrj4kk0pwnkw=s16000" /></a></div><br /><br /><p></p><p><br /></p><p><br /></p><h1 style="text-align: left;">해결방법</h1><p>다음과 같이 레지스트리 편집기를 수행시킨다.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhgE5cJaLaru3lupO3in9caqJ9B-P41rzt9DmyAEVmNIcTIQoEEpyRsobUscIGvRiq6FULo5fUi8nj50LWSmCtvaeRH-BjF1LgzD6aFNa6b8iuvrImZdJshbjAuatv6qDuPj9lf2UnRTN4DpDNhhsJ1rI2MNnkdJRRu_EXhGKPt08nIj7OTz52-2CvI_I8" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="627" data-original-width="345" src="https://blogger.googleusercontent.com/img/a/AVvXsEhgE5cJaLaru3lupO3in9caqJ9B-P41rzt9DmyAEVmNIcTIQoEEpyRsobUscIGvRiq6FULo5fUi8nj50LWSmCtvaeRH-BjF1LgzD6aFNa6b8iuvrImZdJshbjAuatv6qDuPj9lf2UnRTN4DpDNhhsJ1rI2MNnkdJRRu_EXhGKPt08nIj7OTz52-2CvI_I8=s16000" /></a></div><br /><br /><p></p><p>위 화면에서 </p><p> - HKEY_CURRENT_USER/SOFTWARE/Policies/Microsoft/Windows/Explorer</p><p> - HKEY_LOCAL_MACHINE/SOFTWARE/Policies/Microsoft/Windows/Explorer</p><p>경로를 찾아 TaskbarNoMultimon 값을 0으로 셋팅해 준다. (<b><u>2군데 모두</u></b>)<br /><span style="color: white;">1004lucifer</span></p><p>TaskbarNoMultimon 값이 없으면 아래와 같이 생성해준다.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhWfRraJ3X8MR-k1vxWC1c5UGWaEdcmw8qGSLq-r1dXIbjvQQww9mw90sddlU8k7vuCDiYq58_DNfzFm2tQizy5hkjArtvRtDMbAWI-IGCUXLShJlbmhWjx5PKQ4413jM5teucycdYcQ6j4fLbS-ZJDFNYkJyhbz4HVas3aGlR-JHIKRI8OnC7pu136fqI" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="185" data-original-width="398" src="https://blogger.googleusercontent.com/img/a/AVvXsEhWfRraJ3X8MR-k1vxWC1c5UGWaEdcmw8qGSLq-r1dXIbjvQQww9mw90sddlU8k7vuCDiYq58_DNfzFm2tQizy5hkjArtvRtDMbAWI-IGCUXLShJlbmhWjx5PKQ4413jM5teucycdYcQ6j4fLbS-ZJDFNYkJyhbz4HVas3aGlR-JHIKRI8OnC7pu136fqI=s16000" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi5rmUTLndr6q663uNe3lRW4LVA8JU_qxZlIiVqdlnVvCKyQacnRjdoc0tCp7msfpUZedMnANr-bsrlPLjBIN0qbmDckrPS27hIRmHeHVbNJ7N7WxCBKdTvIypNovb1yQQ4qFNBwKLYYDewzebxOhvVmZ4Kx3kBzoITrsVndL1dcLXzee1Ofo_9NG_eG6s" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="261" data-original-width="404" src="https://blogger.googleusercontent.com/img/a/AVvXsEi5rmUTLndr6q663uNe3lRW4LVA8JU_qxZlIiVqdlnVvCKyQacnRjdoc0tCp7msfpUZedMnANr-bsrlPLjBIN0qbmDckrPS27hIRmHeHVbNJ7N7WxCBKdTvIypNovb1yQQ4qFNBwKLYYDewzebxOhvVmZ4Kx3kBzoITrsVndL1dcLXzee1Ofo_9NG_eG6s=s16000" /></a></div><br /><br />그리고 재부팅 한번 해준다.</div><div><br /><p></p><p><br /></p><p><b>참고<br /></b> - <a href="https://www.tenforums.com/tutorials/104832-enable-disable-show-taskbar-all-displays-windows-10-a.html" target="_blank">https://www.tenforums.com/tutorials/104832-enable-disable-show-taskbar-all-displays-windows-10-a.html</a><br /> - <a href="https://admx.help/?Category=Windows_10_2016&Policy=Microsoft.Policies.TaskBar2::TaskbarNoMultimon&Language=ko-kr" target="_blank">https://admx.help/?Category=Windows_10_2016&Policy=Microsoft.Policies.TaskBar2::TaskbarNoMultimon&Language=ko-kr</a></p></div>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-28417115851156182762023-09-02T15:50:00.006+09:002023-09-02T16:25:44.815+09:00[Figma][CSS] Figma의 Text와 퍼블리싱된 HTML Text 의 모습이 다르게 나타나는 경우<p> </p><p>Figma의 모습이 퍼블리싱 되었을 때 모습이 조금 달라보이는데..<br />그럴 수 있는건가? 라는 질문을 받았다.</p><p>그게 말이되나.. 생각했었는데 말이 되네..ㅋㅋㅋ</p><p><br /></p><p>아래의 캡쳐 모습을 보면 미묘하게 다르다.</p><p><br /></p><p><span style="font-size: medium;"><b style="background-color: #d9ead3;">피그마 모습</b></span></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEh2HS1ONTwxmw2XnytO34TZqkK2VjXEL37OVWWT6sdc7beWuxuxFnHuEt4_MRZZBfE1k8y9my61TlpnTdV55hfgGiUTF-evdq--PUboX8pcTV_4ccRE275vLvUoWF7eGyFeodKuX8nbYVm6QxrLroFm1mUG9iJJ50GSNzVyBErVKCkjVOStU1rONKOH3uU" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="75" data-original-width="333" src="https://blogger.googleusercontent.com/img/a/AVvXsEh2HS1ONTwxmw2XnytO34TZqkK2VjXEL37OVWWT6sdc7beWuxuxFnHuEt4_MRZZBfE1k8y9my61TlpnTdV55hfgGiUTF-evdq--PUboX8pcTV_4ccRE275vLvUoWF7eGyFeodKuX8nbYVm6QxrLroFm1mUG9iJJ50GSNzVyBErVKCkjVOStU1rONKOH3uU=s16000" /></a></div><br /><p></p><p><a href="https://www.figma.com/file/6TJcaHCKpURRyqUgLY0VQ5/Blog?type=design&node-id=0%3A1&mode=design&t=AxANBhcYjmy6FJQh-1" rel="nofollow" target="_blank">https://www.figma.com/file/6TJcaHCKpURRyqUgLY0VQ5/Blog?type=design&node-id=0%3A1&mode=design&t=AxANBhcYjmy6FJQh-1</a></p><p><br /></p><p><br /></p><p><span style="font-size: medium;"><b style="background-color: #cfe2f3;">HTML 모습</b></span></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj7y8c3GJtznoFM9Tp-A7nCLouj2TsEZqFBsVnMrxI6RLsXWJRsItlKlX4TRtapJr8bbSu0nrKUA9ZnJwl_exAFywrpn0VBG6ZGTMBhAgNJaDrMWyRTLBLl6FVq96BcW6HcheDg1-ZkCRSPuIlxks3pXvj-OP9-76eoRVyMrMoL7Ojjgco4iFcKUt1wTRQ" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="78" data-original-width="340" src="https://blogger.googleusercontent.com/img/a/AVvXsEj7y8c3GJtznoFM9Tp-A7nCLouj2TsEZqFBsVnMrxI6RLsXWJRsItlKlX4TRtapJr8bbSu0nrKUA9ZnJwl_exAFywrpn0VBG6ZGTMBhAgNJaDrMWyRTLBLl6FVq96BcW6HcheDg1-ZkCRSPuIlxks3pXvj-OP9-76eoRVyMrMoL7Ojjgco4iFcKUt1wTRQ=s16000" /></a></div><br /><span style="color: white;">1004lucifer</span><p></p><p><script src="https://gist.github.com/1004lucifer/270e3f7e031d6d4931cd4af345177b20.js"></script></p><p><span style="color: white;">1004lucifer</span><br /></p><p><br /></p><p><br /></p><p><span style="font-size: large;"><b>[ 500% 확대한 모습 ]</b></span></p><p><span style="background-color: #d9ead3; font-size: medium;"><b>피그마</b></span></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjsILNEPa_QCggCXi4Fc4Xr8fA921M8r_itOm-lpEXXGKSmMFUewoGsoVe7ehH0gOARjHC_k-q002Um0fnQ-W5bxTmjrtlrklvXd9U47IIHtmvsOI5S9xbLl5G5sXmSZCs3SAP-t5IPPcZf4ISBLIz4OnK9lkx5g5BrRCKwWGvpeHkdEGlYm-6ALEuIZGo" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="84" data-original-width="319" src="https://blogger.googleusercontent.com/img/a/AVvXsEjsILNEPa_QCggCXi4Fc4Xr8fA921M8r_itOm-lpEXXGKSmMFUewoGsoVe7ehH0gOARjHC_k-q002Um0fnQ-W5bxTmjrtlrklvXd9U47IIHtmvsOI5S9xbLl5G5sXmSZCs3SAP-t5IPPcZf4ISBLIz4OnK9lkx5g5BrRCKwWGvpeHkdEGlYm-6ALEuIZGo=s16000" /></a></div><br /><br /><b><span style="background-color: #cfe2f3; font-size: medium;">HTML</span></b><p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiiVKqTAIwBWIseph2ydYN2KYRsh6SjOxcEMpHK4NB2S0-Y6fLGzRJY2uGajSX3y5UgyiE8GTTy0UIx5i4AEPV7wAldbBJ_oWbtIFXLbBLGmDV0xvquYyvi7-kddhreLUcj8qHz4hD4iHcw-ZYthJrujWc3rOXccL0UcneC46IDiMQBXs6vMqLz1jxWXOI" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="98" data-original-width="319" src="https://blogger.googleusercontent.com/img/a/AVvXsEiiVKqTAIwBWIseph2ydYN2KYRsh6SjOxcEMpHK4NB2S0-Y6fLGzRJY2uGajSX3y5UgyiE8GTTy0UIx5i4AEPV7wAldbBJ_oWbtIFXLbBLGmDV0xvquYyvi7-kddhreLUcj8qHz4hD4iHcw-ZYthJrujWc3rOXccL0UcneC46IDiMQBXs6vMqLz1jxWXOI=s16000" /></a></div><br /><br /><br /><p></p><p>일부러 간단한 페이지를 만들어서 테스트를 했는데 확실히 다르다는걸 알 수 있었다.</p><p><u style="background-color: #f4cccc;">피그마에서 canvas 태그에 렌더링 할때 글자에 안티앨리어싱(Anti-Aliasing) 처리가 되어있는것을 알 수 있다.</u></p><p>글자크기가 큰 경우에는 크게 티가 안나지만 글자 크기가 작을수록 더 티가 난다.<br />폰트에 따라 피그마가 더 두꺼워 보이거나 얇아보일 수 있다고 생각이든다</p><p><br /></p><p><br /></p><p>다르다는게 확실히 검증하고나서 다시 구글 검색을 해보니 해당 이슈에 대한 글을 찾아볼 수 있었다.;;</p><p><b>[ figma의 폰트가 더 얇아보이는 이유 ]</b><br /> (<a href="https://jodnddus.blog/why-diff-btwn-figma-browser" rel="nofollow" target="_blank">https://jodnddus.blog/why-diff-btwn-figma-browser</a>)</p><p><b>[ Figma의 글꼴 두께가 브라우저의 동일한 두께보다 가벼워 보이는 이유는 무엇입니까? ]<br /></b> (<a href="https://forum.figma.com/t/why-does-a-font-weight-in-figma-seem-lighter-than-the-same-weight-in-the-browser/2207" rel="nofollow" target="_blank">https://forum.figma.com/t/why-does-a-font-weight-in-figma-seem-lighter-than-the-same-weight-in-the-browser/2207</a>)</p><p><br /></p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-45596612693509126522023-01-29T17:49:00.009+09:002023-01-29T17:53:02.492+09:00[Kafka] Consumer Group Rebalancing 및 LAG 수치 증가 - 원인분석 및 조치사항<p> </p><p><br /></p><p><b><span style="font-size: x-large;">[ 이슈 사항 ]</span></b></p><p>- 카프카의 특정 레코드가 많이 쌓이는 특정 토픽에 대해서 레코드가 제대로 처리되지 못하고 적체됨.</p><p>- Consumer Group LAG(미처리 토픽 레코드 개수) 숫자가 지속적으로 증가함</p><p>- 해당 증상은 Consumer 애플리케이션을 구동 시 바로 발생하지 않고 시간이 지나고 어떤 특정 시점부터 LAG가 쌓이는 증상이 발생함.</p><p><br /></p><p><br /></p><p><br /></p><p><b><span style="font-size: x-large;">[ 증상 ]</span></b></p><p>- 카프카 컨슈머 그룹이 지속적으로 리밸런싱 되면서 해당 토픽과 관련된 컨슈머가 레코드를 처리하지 못함.<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Nb6d0yfgs7kUXLsfu9uacgZrrBj6y-DaNxAUPjhdxjOm3YjNL1n0isgiPNKz2vQ1qN3ft1EzH-kvYzRK_VGn1SFVyYd2tcO3DSjeY_ibzTX8zAOcicc0odHXPbmgJbeD6JKf_eJF0RcuCxnjEq2hKEbmdZ5KHmJyjofptpX7Y9F0_pPA40GMNrr7/s1159/kafka_01.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="343" data-original-width="1159" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Nb6d0yfgs7kUXLsfu9uacgZrrBj6y-DaNxAUPjhdxjOm3YjNL1n0isgiPNKz2vQ1qN3ft1EzH-kvYzRK_VGn1SFVyYd2tcO3DSjeY_ibzTX8zAOcicc0odHXPbmgJbeD6JKf_eJF0RcuCxnjEq2hKEbmdZ5KHmJyjofptpX7Y9F0_pPA40GMNrr7/s16000/kafka_01.png" /></a></div><div><br /></div><br /><p><br /></p><p><br /></p><p><b><span style="font-size: x-large;">[ 원인 분석 ]</span></b></p><p><b>1. Thread Dump 분석</b><br /><span style="color: white;">1004lucifer</span><br /> - 쿠버네티스 컨테이너 안에 Java Thread Dump (jstack) 생성툴이 없어서 'kill -3 pid' 명령어를 이용해 덤프를 생성하려 했으나 Log4J가 아닌 Java Output 으로 생성되는 로그가 어디에 출력되는지 알 수 없어 Thread Dump 로그 추출 실패<br /><br /> - 와탭 모니터링 툴이 설치 되어있다고 전달받아 해당 웹페이지 접속하여 순간의 Thread를 모니터링 함<br /> - 대부분의 쓰레드가 아래의 두가지 상태를 유지함.<br /> 1. AbstractCoordinator$HeartbeatThread.run(AbstractCoordinator.java:1397)<br /> 2. AbstractCoordinator$HeartbeatThread.run(AbstractCoordinator.java:1354)</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBGKbn0rVpxi5Ms6pfXAh2NO8adX5ReAadRePdhBC3da246TbDbHy_bU6a-6dyIjzMabcU3k5Hpvmt_Lt4sfcgV62RSra76r0tV9Mq0NARebV37x3lxdNxFVrQQKY8Wl1RSqtY9GELJLQYmCowFtNb4Ay2LLV1ryzSagVVl3DuvIEJReIh-H4-UCGz/s1280/kafka_02.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="412" data-original-width="1280" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBGKbn0rVpxi5Ms6pfXAh2NO8adX5ReAadRePdhBC3da246TbDbHy_bU6a-6dyIjzMabcU3k5Hpvmt_Lt4sfcgV62RSra76r0tV9Mq0NARebV37x3lxdNxFVrQQKY8Wl1RSqtY9GELJLQYmCowFtNb4Ay2LLV1ryzSagVVl3DuvIEJReIh-H4-UCGz/w640-h206/kafka_02.png" width="640" /></a></div><br /><p></p><p><br /></p><p><b>2. Kafka - Jar 소스 디컴파일 및 분석</b><br /><br /> 1) AbstractCoordinator.java:1397<br /> - "하트비트가 실패하거나 코디네이터의 연결이 끊긴 경우 재시도 백오프를 기다린 후 다시 폴링" 내용과 Thread wait 수행 시 대기 시간을 주어 TIMED_WAITING 상태로 만드므로 특별히 문제가 없어보임.<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYKFPj_buhwoFWxzt7bPIFMDDpmAP0OD-c8MvRj3t9MAwRNj_HYh4cgzNBpbKZL0aBI_XygXxbYDuBtmliaLzydKwYhjGkHiFmW6YSR88cMmUoNb7LtvZ8AasqhbbaV7eO-u8fLwb8IsyCSv_8wU5dQ7Zmuw_lsfL0DDi5oH1DxfwQqrg9qU8rpuQh/s763/kafka_03.png" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="268" data-original-width="763" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYKFPj_buhwoFWxzt7bPIFMDDpmAP0OD-c8MvRj3t9MAwRNj_HYh4cgzNBpbKZL0aBI_XygXxbYDuBtmliaLzydKwYhjGkHiFmW6YSR88cMmUoNb7LtvZ8AasqhbbaV7eO-u8fLwb8IsyCSv_8wU5dQ7Zmuw_lsfL0DDi5oH1DxfwQqrg9qU8rpuQh/s16000/kafka_03.png" /></a></div><div style="text-align: right;"></div><br /><p> 2) AbstractCoordinator.java:1354<br /> - 대기시간 없는 Thread wait 가 수행됨.<br /> - 예상하는 것으로는 컨슈머 리밸런싱이 완료 되었을 때 notifyAll 로 깨우지 않을까 생각함.<br /> - 그렇게되면 해당 Thread(컨슈머)는 리밸런싱이 완료 되기 전까지 동작하지 않을 것으로 예상됨.<br /><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVqc2wpn88-Oj2kH1-KdhyWbHNLw4E-iJatAQXQzspqovpebSJqe7WTmAYwqFuzgRvzQcUcsKOcWu2s_N5GPdweRSCmWZN9-DmW_66oR6i7pcB_9zplFwSgvx-tUMAOK8AF7btnv2YB-DTfyEgl5EMgozO4bqpYN3sG8HFCD1SojesG2J9HYqJRowD/s759/kafka_04.png" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="335" data-original-width="759" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVqc2wpn88-Oj2kH1-KdhyWbHNLw4E-iJatAQXQzspqovpebSJqe7WTmAYwqFuzgRvzQcUcsKOcWu2s_N5GPdweRSCmWZN9-DmW_66oR6i7pcB_9zplFwSgvx-tUMAOK8AF7btnv2YB-DTfyEgl5EMgozO4bqpYN3sG8HFCD1SojesG2J9HYqJRowD/s16000/kafka_04.png" /></a></div><div style="text-align: left;"></div><br /><span style="color: white;">1004lucifer</span><br /> 3) 2번의 enabled를 false로 작업하는 곳 확인<br /> - 백그라운드로 수행되는 하트비트 쓰레드가 비활성화 된경우로 보여짐.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAMTxLC9Bk4QgrJpY4zeNVdCcKv1hwxq-H-CVKsFJXRDntp9mq2DRPbRyFB6n2JHKzdbs-R18FUvQmE5T6WyLMoz-qcmP4t8lB2mkrnmPY3DJz9I8FEDLFpP7JCiN1YhtJOFCjF-1f6xcre-ufWAXFYyfc21QQ7BM9ToX6Mu3f54MU3u_sQdWPDiBp/s1201/kafka_05.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1201" data-original-width="765" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAMTxLC9Bk4QgrJpY4zeNVdCcKv1hwxq-H-CVKsFJXRDntp9mq2DRPbRyFB6n2JHKzdbs-R18FUvQmE5T6WyLMoz-qcmP4t8lB2mkrnmPY3DJz9I8FEDLFpP7JCiN1YhtJOFCjF-1f6xcre-ufWAXFYyfc21QQ7BM9ToX6Mu3f54MU3u_sQdWPDiBp/s16000/kafka_05.png" /></a></div><div style="text-align: left;"></div><p></p><p><br /></p><p><br /></p><p><b>3. 다시 Thread Dump 확인</b><br /><br /> 1) 위와 같은 코드인경우 컨슈머 쓰레드들이 점차 (메뉴)2-1 => 2-2 상황의 쓰레드로 변할 것으로 예상함.<br /><br /> 2) 와탭에서 (메뉴)2-1 과 같은 쓰레드의 상태를 갱신 시 모두 (메뉴)2-2 상황으로 변함 (서버에서는 컨슈머 리밸런싱 상태)</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyaCBnET9zH0t1Iuf-0TEy4QRV2S9Td9qCkNvpONuUDKaNqsLY_PLOjzol4TXgSbhpQyJQXwXfoRbAw64C0LKfX79a3-LvaS33i8a_eav2t5GUAj3pMpHhBof4dTTpcXVNOgU_BBhoS61wQ15n-KGoAktnipzXVkXXn24t2_WUGsOsU86vgG7O3cCz/s1138/kafka_06.png" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="720" data-original-width="1138" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyaCBnET9zH0t1Iuf-0TEy4QRV2S9Td9qCkNvpONuUDKaNqsLY_PLOjzol4TXgSbhpQyJQXwXfoRbAw64C0LKfX79a3-LvaS33i8a_eav2t5GUAj3pMpHhBof4dTTpcXVNOgU_BBhoS61wQ15n-KGoAktnipzXVkXXn24t2_WUGsOsU86vgG7O3cCz/s16000/kafka_06.png" /></a></div><p style="text-align: left;"></p><p><br /></p><p><br /></p><p><br /></p><p><b>4. 리밸런싱 조건 확인 및 조치 가능한 사항 확인</b><br /><br /> - 리밸런싱 조건 (아래의 기준을 봤을 때 2번의 상황이 의심됨)<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzy9tRyPW-Ur7GvrEEFmXiQQU8ySV2nBJ0WaIL1Bt9DZHjcSDFyz7kuxgScLtbO7AGjHEbQSepE6ny6ZXwLWJFr_AOtnHiIn7tN020h_ZZgE9-GY-OMhBj73M9iiKqz_H5wHA774U7tl3gomrTssk__TeArHa3mPN7CgPLFyYHM-lB-k3LlWNw8YEP/s640/kafka_07.png" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="414" data-original-width="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzy9tRyPW-Ur7GvrEEFmXiQQU8ySV2nBJ0WaIL1Bt9DZHjcSDFyz7kuxgScLtbO7AGjHEbQSepE6ny6ZXwLWJFr_AOtnHiIn7tN020h_ZZgE9-GY-OMhBj73M9iiKqz_H5wHA774U7tl3gomrTssk__TeArHa3mPN7CgPLFyYHM-lB-k3LlWNw8YEP/s16000/kafka_07.png" /></a></div><div style="text-align: left;"></div><br /> - 'max.poll.records' 의 기본값음 500이라고 함.<br /><br /> - 위 값이 기본값인경우 하나의 컨슈머에서 최대 500개까지의 레코드를 수행완료 후 카프카에 오프셋 업데이트를 수행하는데 그전에 poll interval 시간이 되어 리밸런식을 할 수 있다는 가능성이 있다고 생각함.<br /><p><br /></p><p><br /></p><p><b>5. 서버 리밸런싱 모니터링</b><br /><span style="color: white;">1004lucifer</span><br /> 1) 서버에서<span lang="EN-US"> watch </span>명령어로 컨슈머 그룹 상태를 지속적으로 확인<br /> - watch './kafka-consumer-groups.sh --bootstrap-server 카프카서버 --describe --group 토픽명'<br /><br /> 2) 리밸런싱 상태에서 중간중간 컨슈머가 붙음<span lang="EN-US">. </span>그리고<span lang="EN-US"> LAG </span>개수가 적은 것은 한두번 업데이트 되다가 다시 리밸런싱 상태로 돌아감<span lang="EN-US">.<br /> - LAG 개수가 많은것은 개수가 줄지 않고 개수가 적은것만 줄어듬</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCaYH6HlQ6h1huOKFlHRivQA-VC6zrFcQWVdzj-5fCdUNyyn0vEv6ObiqrdCJz1pFg_--0qDfyaVnUeioooH0GD6reqlzwpacSHhhBliom_8HYQH6Cs_tsfW4haPwX9u6bYUAPxrGKBfcMX8Iyst3b8FeiLrtkmsTeYn5j5MtXoINHLkHpD3V9ST2R/s1280/kafka_08.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="260" data-original-width="1280" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCaYH6HlQ6h1huOKFlHRivQA-VC6zrFcQWVdzj-5fCdUNyyn0vEv6ObiqrdCJz1pFg_--0qDfyaVnUeioooH0GD6reqlzwpacSHhhBliom_8HYQH6Cs_tsfW4haPwX9u6bYUAPxrGKBfcMX8Iyst3b8FeiLrtkmsTeYn5j5MtXoINHLkHpD3V9ST2R/w640-h130/kafka_08.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwlqazPWI0pJJdZ_jL1f2w1s5hV_ecW_SmUG7IVAd4Xjhd9UrFBOnA8cspvPvVxZ0u8XVdzRfFD2YwOYHSMnQQaHt-Gxvzw59VeqZHrFhgtcDZrzwZ5pKpq0h4LCObaHmU1ptCEySXQGQbLfwOKAhld8Tn3mpUvhhZExttqtc0uyu4S5bh1QM7TmKt/s1145/kafka_09.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="599" data-original-width="1145" height="334" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwlqazPWI0pJJdZ_jL1f2w1s5hV_ecW_SmUG7IVAd4Xjhd9UrFBOnA8cspvPvVxZ0u8XVdzRfFD2YwOYHSMnQQaHt-Gxvzw59VeqZHrFhgtcDZrzwZ5pKpq0h4LCObaHmU1ptCEySXQGQbLfwOKAhld8Tn3mpUvhhZExttqtc0uyu4S5bh1QM7TmKt/w640-h334/kafka_09.png" width="640" /></a></div><div style="margin-left: 1em; margin-right: 1em; text-align: center;"></div><p><br /></p><p><br /></p><p><br /></p><p><b><span style="font-size: x-large;">[ 원인분석 결과 및 조치사항 ]</span></b></p><p>- 위의 증상을 확인 시 카프카의 max.poll.records, max.poll.interval.ms 설정의 조정으로 이슈가 해결될 수 있지 않을까 예상이 된다.</p><p>- 아래와 같은 내용이 있는 것으로 보아 max.poll.records 옵션만 줄이더라도 성능에 이슈가 해결될 수 있을것 같음 (값을 1로 변경해 보는것을 권장하는 글도 있음)</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbBtfHQsu2p2BLz11GEzVxpDsiQ8o8romM8ADTRHnDT4wNGwpJTm7kWuDAEaM3e0oszj6xcVZEzFq1glrV3hgoKbrbZCtUw8ZZ8NWEYHT4vq-Zhgt6cGI-fWcGbmkggKLbE5jGgjHqFmJtwfpvji3_kVialu7hJ7OsstP5-N2OHDg28nJBtMX6IDz9/s977/kafka_10.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="977" data-original-width="699" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbBtfHQsu2p2BLz11GEzVxpDsiQ8o8romM8ADTRHnDT4wNGwpJTm7kWuDAEaM3e0oszj6xcVZEzFq1glrV3hgoKbrbZCtUw8ZZ8NWEYHT4vq-Zhgt6cGI-fWcGbmkggKLbE5jGgjHqFmJtwfpvji3_kVialu7hJ7OsstP5-N2OHDg28nJBtMX6IDz9/w458-h640/kafka_10.png" width="458" /></a></div><br /><p><b style="background-color: #d9ead3;">위 분석결과에 따라 max.poll.records 의 설정값을 1로 변경 후 더이상 리밸런싱 이슈가 발생하지 않음</b></p><p>(다만 서버 배포의 경우 컨테이너가 교체가 되면서 그때는 리밸런싱이 발생함)</p><p><br /></p><p><br /></p><p><br /></p><p><b><span style="font-size: x-large;">PS.</span></b></p><p>이후에 시간이 좀 지나고 LAG가 적체되는 증상이 발생했었는데 증상 및 조치사항은 다음과 같았다.</p><p> - 리밸런싱을 발생하지 않고있음<br /></p><p> - Consumer 애플리케이션 1건 처리속도가 40~60초 정도로 퍼포먼스가 너무 떨어짐<br /> (평소 1건 처리속도 0.1~0.3초 정도 걸림)</p><p> - DB 확인 시 insert / update 하는 주 테이블이 Lock이 걸려서 발생한 이슈였음.<br /> (DB Lock이 풀리고 LAG는 다시 줄어들어 정상화 됨)</p><p> - DB Lock을 최소화 하기 위해 이후 추가 조치를 수행함.</p><p><br /></p><p><br /></p><p>참고 URL<br /> - <a href="https://techblog.gccompany.co.kr/카프카-컨슈머-그룹-리밸런싱-kafka-consumer-group-rebalancing-5d3e3b916c9e" target="_blank">https://techblog.gccompany.co.kr/카프카-컨슈머-그룹-리밸런싱-kafka-consumer-group-rebalancing-5d3e3b916c9e</a><br /> - <a href="https://huisam.tistory.com/entry/kafka-consumer?category=849126" target="_blank">https://huisam.tistory.com/entry/kafka-consumer?category=849126</a></p><p><br /></p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0대한민국 서울특별시37.566535 126.97796929.2563011638211563 91.8217192 65.876768836178854 162.13421920000002tag:blogger.com,1999:blog-3762285562864588235.post-66602197630986471942022-09-04T22:48:00.001+09:002022-09-04T22:48:11.843+09:00[Linux] MTU 값에 따른 Apache <=> Tomcat 통신 불량 이슈 (mtu9000)<p><br /></p><p>최근에 기이한 경험을 하게 되었다.<br />잘 되고 있던 서버에서 갑자기 웹페이지가 뜨지 않는다는 이슈였다.<br /></p><p>브라우저 개발자도구를 통해 확인해보니 <head> 영역에 있는 특정 css 파일이 로드가 되지 않았다.<br />하지만 개발하던 담당자의 PC에서는 정상적으로 보였는데 알아보니 WAS로 바로 붙으면 문제가 없지만 Apache를 통해서 웹 접근 시 특정 파일이 로드가 되지 않았다.</p><p><br /></p><h1 style="text-align: left;">증상</h1><p>1. 브라우저에서 Tomcat 에 직접 접속할 시 이슈 없음</p><p>2. 브라우저에서 Apache를 통해 접속 시 특정 파일(css)이 로딩이 되지 않음</p><p><br /></p><p><br /></p><h1 style="text-align: left;">환경 및 구성</h1><p>- 네이버 클라우드 서버를 사용 (Linux)</p><p>- WEB1, WEB2 <=> WAS1, WAS2 구성</p><p><br /></p><p><span style="color: white;">1004lucifer</span></p><h1 style="text-align: left;">원인 분석 및 해결</h1><p>1. Apache, Tomcat 설정에 별다른 문제가 없음</p><p>2. 별다른 서버 설정 없이 이슈가 발생함.</p><p>3. WAS 에서 localhost 로 telnet 을 통해 해당 css 파일 정상적으로 로딩됨.</p><p>4. Apache 서버에서 WAS 서버로 telnet을 통해 해당 css 파일 요청 시 응답이 받다가 중간에 끊김.</p><p>5. 어플리케이션을 통한 요청이 아니라 OS 명령어인 telnet 을 통해서 테스트를 했기에 OS 또는 네트워크의 이슈라고 추측함.</p><p>6. 인프라 및 네트워크 담당자 원인분석 중 사내 OS셋팅 정책이 mtu1500 인데 해당 서버에서는 mtu9000 으로 되어있는 것을 확인</p><p>7. 모든 서버의 mtu값을 1500으로 변경 및 OS 재기동 후 Apache 서버에서 WAS 서버로 telnet으로 HTTP 요청 시 정상적으로 응답 하는 것을 확인 (이슈 해결)</p><p><br /></p><p><br /></p><h1 style="text-align: left;">결론</h1><p>1. 갑작스럽게 발생한 이슈이다보니 네이버클라우드에서 VM관련이나 네트워크와 같은 어떠한 작업이 수행한 이후에 이와 같은 이슈가 발생했다고 추측이됨.</p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-23805371497739835902022-07-03T19:28:00.002+09:002023-01-24T17:14:18.180+09:00[IntelliJ] 30일 무료 사용 버전 (오프라인 환경)<p><br /></p><p><br /></p><p>IntelliJ가 어느순간부터 인터넷에 연결이 안되면 30일 무료사용을 할 수 없게 변경이 되었다.</p><p><br /></p><p><span style="background-color: #d9ead3;"><b>오프라인에서 30일 무료로 사용이 가능한 버전은 2021.1 (2021.1.3) 버전이다.</b></span><br />(윈도우 버전 기준)</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgLaUSsawaogeOKVhknqQQhOSRxrMd1M7ETYUZuntJzd7z-l2F16S3W_x02CqwN1XcXOFGj6VqdufyN_4mLr3mKH-ECcv9zD300VwAU3haXKf3t3dTaoV4Ah7H6L38OCwYesLrcCOH0MCAa5VQZCfbm8FdXkWTTTbfUdcD9aiIsiB0G2HJ6CW3rhAyM" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="432" data-original-width="1179" height="234" src="https://blogger.googleusercontent.com/img/a/AVvXsEgLaUSsawaogeOKVhknqQQhOSRxrMd1M7ETYUZuntJzd7z-l2F16S3W_x02CqwN1XcXOFGj6VqdufyN_4mLr3mKH-ECcv9zD300VwAU3haXKf3t3dTaoV4Ah7H6L38OCwYesLrcCOH0MCAa5VQZCfbm8FdXkWTTTbfUdcD9aiIsiB0G2HJ6CW3rhAyM=w640-h234" width="640" /></a></div><br />위 버전을 다운로드 받아서 인터넷이 안되는 PC에서 30일 Trial 기능을 이용하면 된다.<p></p><p><br /></p><p>최신버전이 아닌 이전버전의 IntelliJ를 다운받으려면 아래의 링크로 이동하면 된다.<br /> - <a href="https://www.jetbrains.com/idea/download/other.html" target="_blank">https://www.jetbrains.com/idea/download/other.html</a></p><p><br /></p><p>PS.<br />30일 Trial 버전 외에도 idea.key파일을 이용해 인텔리제이 정품인증을 받을 수 있었지만..<br />현재 최신버전 (2022.1.3) 에서 key 파일을 이용해 정품인증을 받았더라도 JetBrains Account에 로그인을 하지 않으면 인증파일이 없어지면서 인증이 풀리는 증상이 발생하게 되었다.</p><p>결국 예전과 같이 원래 가지고 있는 라이선스를 이용하여(idea.key) 오프라인에서 작업하려 할 시 앞으로는 그냥 위 2021.1.3 버전으로 작업을 하려 한다.</p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-43241504200044949302022-02-06T12:18:00.002+09:002022-02-06T12:18:46.522+09:00[Windows] 윈도우 10 자동로그인 설정 (레지스트리 수정 X)<p> </p><p><br /></p><p>최근 Windows 10 자동로그인을 두어번정도 설정을 하게 되었는데 굉장히 편리한 방법이 있어서 이렇게 블로그에 정리를 한다.</p><p><br /></p><p>대부분의 블로그에서 설명하는 방법은 <span style="background-color: #d9ead3;">사용자계정(netplwiz)</span> 을 열어서 <span style="background-color: #fce5cd;">사용자 이름과 암호를 입력해야 이 컴퓨터를 사용할 수 있음</span> 항목에 체크하는 방법으로 알려주고있고, 해당 항목이 없는경우 레지스트리를 수정하는 방법으로 알려주고 있다.</p><p>나도 얼마전까지 위와 같은 방법으로 하다가 오늘 해당 방법을 다시 찾기위해 검색하던 중 엄청나게 쉬운 방법이 있는걸 알게되어 기록을 남긴다.</p><p><br /></p><h1 style="text-align: left;"><b>방법</b></h1><p><b>1. Autologin 프로그램 다운로드</b><br /></p><p> - 공식 링크: <a href="https://docs.microsoft.com/ko-kr/sysinternals/downloads/autologon" target="_blank">https://docs.microsoft.com/ko-kr/sysinternals/downloads/autologon</a></p><p> - 개인저장소: <a href="https://www.mediafire.com/file/0vgofsk7fbj5qov/AutoLogon_v3.10.zip/file" target="_blank">https://www.mediafire.com/file/0vgofsk7fbj5qov/AutoLogon_v3.10.zip/file</a></p><p><span style="color: white;">1004lucifer</span></p><p><b>2. Autologin 압축 풀기 및 실행</b></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEimJkffX1GH-MGRaxxZzU_YB0GwYsV-tXmVvG7UcG0dUTwEJREdaBo6sdRU96953hq5BYOALiM2ucyKELGU3NquN2ZG5k-6sjGH5B_n6-PSrrtHiOSC3e6zZqJPpo9qw0hi7VKmYx-2rZL0xirLNBcr6eyvF1b2W1Y5dAnZbHwH9b68Nyo-sRm6hIGt=s307" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="133" data-original-width="307" height="133" src="https://blogger.googleusercontent.com/img/a/AVvXsEimJkffX1GH-MGRaxxZzU_YB0GwYsV-tXmVvG7UcG0dUTwEJREdaBo6sdRU96953hq5BYOALiM2ucyKELGU3NquN2ZG5k-6sjGH5B_n6-PSrrtHiOSC3e6zZqJPpo9qw0hi7VKmYx-2rZL0xirLNBcr6eyvF1b2W1Y5dAnZbHwH9b68Nyo-sRm6hIGt" width="307" /></a></div><br /><p><b>3. 윈도우 패스워드 입력 후 Enable 버튼 선택</b></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgt9561xRtxIGeAP6MXipbTNaX4X2h87v4qJ6_11fQHQED8C1QRM_lVTWARPR3FzGjpEhAc2Dd7pxn20p2LHzICRz10WM1KJvnwqLW7DPwtsk1MSaT0emgDs40J08ZncpIcXq6TGdTxGEoTP0PfEFBoCEamwb7xBawSjclyWjHOf1_cI3P8nFIBE-7P=s305" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="154" data-original-width="305" height="154" src="https://blogger.googleusercontent.com/img/a/AVvXsEgt9561xRtxIGeAP6MXipbTNaX4X2h87v4qJ6_11fQHQED8C1QRM_lVTWARPR3FzGjpEhAc2Dd7pxn20p2LHzICRz10WM1KJvnwqLW7DPwtsk1MSaT0emgDs40J08ZncpIcXq6TGdTxGEoTP0PfEFBoCEamwb7xBawSjclyWjHOf1_cI3P8nFIBE-7P" width="305" /></a></div><br /><p><br /></p><h1 style="text-align: left;">PS.</h1><p>Autologin 프로그램 다운로드 링크 주소를 보면 알겠지만 마이크로 소프트에서 공식적으로 제공하는 툴이며 안심하고 사용할 수 있다.</p><p>Microsoft 공식 문서 <span style="background-color: #d9ead3;">Windows에서 자동 로그온을 설정하는 방법</span>(<a href="https://docs.microsoft.com/ko-kr/troubleshoot/windows-server/user-profiles-and-logon/turn-on-automatic-logon" target="_blank">링크</a>) 에서도 해당 프로그램에 대한 언급이 나와 있다.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiO6rTrgs1VVEA4SMR6eox7cS69d_3uqJVLsggBL0qxFv98wxiKeTnE9Z1LWZUIQYBc-VIH2oVp2M1Gwd2OsJ64f5AyqsWPr6uHGr006X8tWdTuf8sKYr32VpMnmG2iaUUvk8Y76UNAbO5agAYtxep7t8mi95jy4EdfbXKh5ldAuEUIRHU9nlbxNsn6=s508" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="300" data-original-width="508" src="https://blogger.googleusercontent.com/img/a/AVvXsEiO6rTrgs1VVEA4SMR6eox7cS69d_3uqJVLsggBL0qxFv98wxiKeTnE9Z1LWZUIQYBc-VIH2oVp2M1Gwd2OsJ64f5AyqsWPr6uHGr006X8tWdTuf8sKYr32VpMnmG2iaUUvk8Y76UNAbO5agAYtxep7t8mi95jy4EdfbXKh5ldAuEUIRHU9nlbxNsn6=s16000" /></a></div><br /><p><br /></p><p>참고</p><p> - <a href="https://coolenjoy.net/bbs/37/229554" target="_blank">https://coolenjoy.net/bbs/37/229554</a></p><p> - <a href="https://docs.microsoft.com/ko-kr/troubleshoot/windows-server/user-profiles-and-logon/turn-on-automatic-logon" target="_blank">https://docs.microsoft.com/ko-kr/troubleshoot/windows-server/user-profiles-and-logon/turn-on-automatic-logon</a></p><p> - <a href="https://docs.microsoft.com/ko-kr/sysinternals/downloads/autologon" target="_blank">https://docs.microsoft.com/ko-kr/sysinternals/downloads/autologon</a></p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-1344373751169731812022-01-16T17:44:00.002+09:002022-01-16T17:44:09.053+09:00[React] 하위 컴포넌트 함수 실행하기 (Using Redux connect)<p><br /></p><p><br /></p><h1 style="text-align: left;">환경</h1><p> - 언어: TypeScript</p><p> - 기타: Redux connect 를 사용하는 상황</p><p><br /></p><p><br /></p><h1 style="text-align: left;">방법</h1><p> - GitHub 예제소스: <a href="https://github.com/1004lucifer/Test-JavaScript/tree/master/React/typescript-call-child-method-using-redux-connect" target="_blank">https://github.com/1004lucifer/Test-JavaScript/tree/master/React/typescript-call-child-method-using-redux-connect</a></p><p> - 데모 페이지: <a href="https://1004lucifer.github.io/Test-JavaScript/React/typescript-call-child-method-using-redux-connect/build/index.html" target="_blank">https://1004lucifer.github.io/Test-JavaScript/React/typescript-call-child-method-using-redux-connect/build/index.html</a></p><p><br /></p>
<p>동작 화면</p>
<iframe width="100%" height="500px" src="https://1004lucifer.github.io/Test-JavaScript/React/typescript-call-child-method-using-redux-connect/build/index.html"></iframe>
<p><br /></p>
<p><br /></p>
<p>App.tsx (메인 컴포넌트)</p>
<script src="https://gist.github.com/1004lucifer/b2d06bda68d7e17c8e1eb4f3430efdc7.js"></script>
<p><br/></p>
<p>AppSubNormal.tsx (일반 하위컴포넌트)</p>
<script src="https://gist.github.com/1004lucifer/7f5989ba680df120d7f2e7addaa1dfc5.js"></script>
<p><br /></p>
<p>AppSubChanged.tsx (부모 컴포넌트에서 사용 가능하도록 수정)</p>
<script src="https://gist.github.com/1004lucifer/fdcc2a2aef24cc5caf4f309bdfb8d74d.js"></script>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p>참고<br /> - <a href="https://ko.reactjs.org/docs/forwarding-refs.html" target="_blank">https://ko.reactjs.org/docs/forwarding-refs.html</a><br /> - <a href="https://ko.reactjs.org/docs/hooks-reference.html" target="_blank">https://ko.reactjs.org/docs/hooks-reference.html</a><br /> - <a href="https://stackoverflow.com/questions/55180124/forwarding-ref-in-a-functional-component-with-react-redux-v-6-0-1" target="_blank">https://stackoverflow.com/questions/55180124/forwarding-ref-in-a-functional-component-with-react-redux-v-6-0-1</a></p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-71154122737884778892022-01-15T22:14:00.009+09:002022-01-17T14:31:11.765+09:00[IntelliJ] src/main/java 디렉토리 하위 java 외 다른 파일(xml, png, ttf등) 빌드 안되는 이슈 해결방법<p> </p><p><br /></p><p><br /></p><h1 style="text-align: left;">이슈</h1><p><b style="background-color: #fce5cd;"> - src/main/java 디렉토리 하위의 소스에 TTF 폰트파일과 png 파일이 있는 경우가 있었는데..<br /> 다른 이클립스 사용하는 분들은 별 문제가 없어보였지만 IntelliJ를 사용하는 나는 해당 파일이 classes 디렉토리로 빌드가 되지 않아서 한동안 resources 디렉토리로 해당 경로와 동일하게 디렉토리를 만든 후 복사해서 사용하고 있었다.</b></p><p><br /></p><p>알고보니 일반적으로 많이 사용하는 java, kt(코틀린) 과 같은 개발언어 파일만 빌드 시 classes 디렉토리에 들어가는 설정이 있었다.</p><p>설정위치와 방법은 아래와 같다.<br /><b style="background-color: #d9ead3;"> - Settings => Build, Execution, Deployment => Compiler</b></p><p>!?*.확장자명 <= 구분자(;) 를 확장자 패턴 사이에 넣어줘야 한다.</p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhgAKITapur8lfeDHDUfhIJH1AQs5CYqPPjlxUuKSr0eUlnehX-nVopvWliXKQBllSSnrACm71X3cdYmdCBhG9EoSdobKaGz_IVnXDdzhZCbf7BkESwCJ6Nb2FQagb1YzF2_H2o9bo5O7ARNl-hbOb_Cxxo29ibBnuZnngXBF0Ft3T7pADBReZ_CVf7=s1144" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="420" data-original-width="1144" height="235" src="https://blogger.googleusercontent.com/img/a/AVvXsEhgAKITapur8lfeDHDUfhIJH1AQs5CYqPPjlxUuKSr0eUlnehX-nVopvWliXKQBllSSnrACm71X3cdYmdCBhG9EoSdobKaGz_IVnXDdzhZCbf7BkESwCJ6Nb2FQagb1YzF2_H2o9bo5O7ARNl-hbOb_Cxxo29ibBnuZnngXBF0Ft3T7pADBReZ_CVf7=w640-h235" width="640" /></a></div><br /><p><br /></p><p><br /></p><p><br /></p><p>참고<br /> - <a href="https://www.jetbrains.com/help/idea/resource-files.html" target="_blank">https://www.jetbrains.com/help/idea/resource-files.html</a></p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-70272672106017763522022-01-15T21:06:00.008+09:002022-01-16T17:12:04.087+09:00[JavaScript] iframe 뒤로가기 (history back) 이슈 원인과 해결방법<p> </p><p>본문에 iframe 이 들어가는 상황에서 뒤로가기가 예상했던 동작대로 작동하지 않아 알아봤는데..</p><p>stackoverflow를 포함한 다른 많은 글을 읽어보았지만 원하는 방법을 보지 못하고 어떻게 할지 여러가지 방법으로 고민하고 연구한 방법에 대해서 기술을 해본다.</p><p><br /></p><p>테스트 크롬 버전: 94, 96</p><p><br /></p><h1 style="text-align: left;">이슈</h1><div style="background-color: #ffefec; border: 1px dashed solid;"><br /></div><div style="background-color: #ffefec; border: 1px dashed solid;"> 1. iframe 내에서 <b>자동으로 여러 페이지로 리다이렉트 되거나 사용자의 액션으로 여러페이지 이동 시</b> history 에 해당 페이지들이 스택으로 쌓이게 된다.</div><div style="background-color: #ffefec; border: 1px dashed solid;"> 2. 특히나 컨텐츠가 iframe 하나가 아니라 여러개를 보여줘야 할 수도 있다.</div><div style="background-color: #ffefec; border: 1px dashed solid;"><br /></div><div style="background-color: #ffefec; border: 1px dashed solid;"> PS.</div><div style="background-color: #ffefec; border: 1px dashed solid;"> - 페이지 이동이 없는 단일 페이지만 iframe 내에서 보여지는 거라면 크게 문제되지 않는다.</div><div style="background-color: #ffefec; border: 1px dashed solid;"><br /></div><p><br /></p><p><br /></p><p>여러가지 방법으로 테스트를 해봤을 때 다음과 같은 결론과 방법을 찾았다.</p><p><span style="color: white;">1004lucifer</span></p><h3 style="text-align: left;"><b style="background-color: #fce5cd;">뒤로가기 (Alt + ←) 는 현재로써는 완벽하게 커버 가능하지 않다.</b></h3><p>history.back 또는 history.go 수행시 발생하는 <u>popstate 이벤트</u>(<a href="https://developer.mozilla.org/ko/docs/Web/API/Window/popstate_event" target="_blank">링크</a>)를 통해 현재 화면에 iframe이 있는지 확인하고 iframe의 주소가 현재 사이트와 다른경우 계속해서 history.back()을 하려 했는데..</p><p>브라우저의 뒤로가기 버튼을 누르거나 뒤로가기 단축키를 이용 시 iframe 내부에서 이전페이지로 호출을 하는바람에 내가 개발하는 페이지에서 popstate 이벤트가 발생하지 않았다.<br />(iframe 내부에서 여러페이지 이동 없이 하나의 단일페이지만 있는경우는 문제가 없다.)</p><p>(뒤로가기 수행 시) 이벤트가 발생해야 뭐라도 처리를 할텐데 이벤트가 발생하지 않아 스크립트로 컨트롤 자체를 할수가 없었다.</p><p><br /></p><p><br /></p><p></p><h3 style="text-align: left;"><b style="background-color: #d9ead3;">사용자의 액션이 있는경우 뒤로가기 수행이 가능한다.</b></h3><p></p><p>(하지만 F5를 눌러서 새로고침 하는경우 여전히 이슈가 있다.)</p><p>GitHub 예제소스: <a href="https://github.com/1004lucifer/Test-JavaScript/tree/master/Vanilla/TroubleShooting/history-back-page-with-iframe" target="_blank">https://github.com/1004lucifer/Test-JavaScript/tree/master/Vanilla/TroubleShooting/history-back-page-with-iframe</a></p><p>데모 페이지: <a href="https://1004lucifer.github.io/Test-JavaScript/Vanilla/TroubleShooting/history-back-page-with-iframe/outerFirst.html" target="_blank">https://1004lucifer.github.io/Test-JavaScript/Vanilla/TroubleShooting/history-back-page-with-iframe/outerFirst.html</a></p><p><script src="https://gist.github.com/1004lucifer/13a0a8e7d8d003769d686f256262ab19.js"></script></p><p><br /></p><p><br /></p><p>여기에는 두가지 단점이 있다.</p>
<div style="background-color: #ffefec; border: 1px dashed solid;"><br /> 1. (스크립트를 수행하기 위해) 사용자가 특정 버튼을 누르는것과 같이 어떠한 액션이 있어야 한다.</div><div style="background-color: #ffefec; border: 1px dashed solid;"> 2. iframe이 있는 컨텐츠 모습에서 F5 와 같이 새로고침을 하게되는경우 history 스택에 쌓인 내용이 없어지지 않아 history 스택에 중복 데이터가 쌓이게 된다.</div><div style="background-color: #ffefec; border: 1px dashed solid;"> 따라서 위 스크립트를 수행 시 이전에 쌓인 history 스택 때문에 정상적으로 동작하지 않는다.</div><div style="background-color: #ffefec; border: 1px dashed solid;"><br /></div>
<p><span style="color: white;">1004lucifer</span></p><p>위와같은 단점이 있지만..<br />Angular / Vue / React 와 같은 SPA 사이트에서는 그나마 사용할 수 있는 가장 나은 방법이 아닐까 싶다.</p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-88705704313714821862021-05-20T22:21:00.005+09:002021-05-20T22:26:28.399+09:00[React] TypeError: Cannot read property 'apply' of underfined (Redux DevTools 미설치 이슈)<p> </p><p><br /></p><h1 style="text-align: left;">증상 및 문제</h1><p><span style="background-color: white;"><b><br /></b></span></p><p><b>증상1<br /></b> - 개발모드에서만 해당 증상이 나타나며, npm build 후 빌드된 소스에서는 증상이 발생하지 않는다.</p><p><span style="background-color: white;"><b><br /></b></span></p><p><span style="background-color: white;"><b>증상2</b><br /> - 내 PC 에서 프로젝트 셋팅 후 구동 시 문제없이 동작이 된다.<br /> - 동료 PC 에서 소스를 내려받아 구동 시 Chrome 브라우저에서 아래와 같이 보여진다.</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSP-u1gjJqXXiB9x_BpSiTrI3XSNC2j_YCbrR_bd-gA8TbQ1WoRGcPj3XRgSdfAE2S9d1xs4SuotvZM6iCh6UUS-Vw6G_zMySrwM3677yMmVbRanXYhW3slmKav9W3fW53ijxi9j434G4/s1002/react.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="649" data-original-width="1002" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSP-u1gjJqXXiB9x_BpSiTrI3XSNC2j_YCbrR_bd-gA8TbQ1WoRGcPj3XRgSdfAE2S9d1xs4SuotvZM6iCh6UUS-Vw6G_zMySrwM3677yMmVbRanXYhW3slmKav9W3fW53ijxi9j434G4/s16000/react.png" /></a></div><div><br /></div><div><br /></div><div><span style="color: white;">1004lucifer</span></div><div><p><br /></p><h1 style="text-align: left;"><b>이유 및 해결방안</b></h1><p><b style="background-color: #d9d2e9;">TypeError: Cannot read property 'apply' of underfined</b> 라는 메시지는 꼭 여기서만 나타나는게 아니라 다른 곳에서도 나오겠지만..</p><p><b style="background-color: #d9ead3;">현재의 상황에서는 코드에서 개발환경인경우 'redux-devtools-extension' 을 사용하도록 셋팅한 경우에 위와 같은 증상이 발생한다.</b></p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfcYFjUM-c06_M6PJTpv1qerU-LVeG3L69hnorH2lNRsEwjjUeea3B1OGJacvA4CLKrYOsrX3X8CXps117FipR8h2m5QwbHHTkoAYCOADrjrLIjkPDVoq3Rx9pzrNbWB4J1_8JADZw4lY/s1067/react1.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="571" data-original-width="1067" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfcYFjUM-c06_M6PJTpv1qerU-LVeG3L69hnorH2lNRsEwjjUeea3B1OGJacvA4CLKrYOsrX3X8CXps117FipR8h2m5QwbHHTkoAYCOADrjrLIjkPDVoq3Rx9pzrNbWB4J1_8JADZw4lY/s16000/react1.png" /></a></div><br /><p><br /></p><p><br /></p><p>Redux DevTools 설치하면 정상적으로 보여지게 된다.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1GGhI0ZOxTB64TgZSWpP3MurlewwdAkrO70LzWKIK8Ft-slWbYQH6Bve4tfCcDBH_SyjK_IzUXC6Un3L2Ke71LJtSJFnMydbpg5sqeZS_4GN3BLBBSACIxCWsPH-z51tXFU2rxUwwkbM/s493/react2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="111" data-original-width="493" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1GGhI0ZOxTB64TgZSWpP3MurlewwdAkrO70LzWKIK8Ft-slWbYQH6Bve4tfCcDBH_SyjK_IzUXC6Un3L2Ke71LJtSJFnMydbpg5sqeZS_4GN3BLBBSACIxCWsPH-z51tXFU2rxUwwkbM/s16000/react2.png" /></a></div><p><a href="https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd?utm_source=chrome-ntp-icon" target="_blank">https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd?utm_source=chrome-ntp-icon</a></p><p><br /></p><p><br /></p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl1OZfEz2o3DbEjamNliwCLKxAGgxVwDdGgyjCXqv2vUdzLaYoa-_-jQRKYWwniYJ8zbJnT_t_h2_aqWy3GwYCEYsA6byoYxJS0bcL1PVUczAYxG6ZKpe7eQyQ77HY3N7B1FE-kYGZkpE/s775/react3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="775" data-original-width="714" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl1OZfEz2o3DbEjamNliwCLKxAGgxVwDdGgyjCXqv2vUdzLaYoa-_-jQRKYWwniYJ8zbJnT_t_h2_aqWy3GwYCEYsA6byoYxJS0bcL1PVUczAYxG6ZKpe7eQyQ77HY3N7B1FE-kYGZkpE/s16000/react3.png" /></a></div><p><br /></p></div>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-81155533524675048252021-05-16T21:37:00.003+09:002021-05-16T21:37:47.603+09:00[React] ERROR - readonly keyword (Parsing error: Unexpected token, expected ":")<p> </p><p><br /></p><h1 style="text-align: left;">문제</h1><p><span style="background-color: #d9ead3;"><b>yarn create react-app typescript-readonly_keyword-error --template typescript</b></span></p><p>위 명령어로 Typescript 형식의 React 프로젝트를 생성 후</p><p>프로젝트 셋팅 중 아래와 같은 에러가 나면서 페이지가 뜨지 않는 문제가 발생했다.</p><p>(아마 readonly 키워드를 변수명으로 잘못 인지해서 발생하는 에러로 보여진다.)</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF3uPRIQ_kI-mNkW2JRwY0Wyq9xtyIFH4ysQ6QtA6P99TVqUWkSDbG37yZxyQ-QIycgnddyQ9RpzCCdAyKvo439DIhToh8YL7Vnf6UAjmuUdoCp5OzIUr_y1-dhh309nluwxBWUKbQUzA/s474/react_readonly_error.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="270" data-original-width="474" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF3uPRIQ_kI-mNkW2JRwY0Wyq9xtyIFH4ysQ6QtA6P99TVqUWkSDbG37yZxyQ-QIycgnddyQ9RpzCCdAyKvo439DIhToh8YL7Vnf6UAjmuUdoCp5OzIUr_y1-dhh309nluwxBWUKbQUzA/s16000/react_readonly_error.png" /></a></div>
<p><br /></p>
<div style="background-color: black; color: white;"><br /></div><div style="background-color: black;"><div><span style="color: white;">Failed to compile.</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;">src\App.tsx</span></div><div><span style="color: white;"> Line 6:12: Parsing error: Unexpected token, expected ":"</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;"> 5 |</span></div><div><span style="color: white;"> 6 | export interface IRootState {</span></div><div><span style="color: white;">> 7 | readonly loadingBar: any;</span></div><div><span style="color: white;"> | ^</span></div><div><span style="color: white;"> 8 | }</span></div><div><span style="color: white;"> 9 |</span></div><div><span style="color: white;"> 10| function App() {</span></div></div><div style="background-color: black; color: white;"><br /></div>
<p><br /></p>
<p><br /></p><p><br /></p><h1 style="text-align: left;">원인 및 해결방법</h1><p>- 아마 같은 증상이지만 원인이 다를 수 있다. 나의 경우에는 아래와 같았다.</p><p><br /></p><p>package.json 파일을 수정하다가 eslintConfig 항목을 빠트렸더니 위와 같은 오류가 발생했으며, create-react-app 으로 처음 만들었을 때와 같이 eslintConfig 항목을 넣어줬더니 문제가 없어졌다.</p><p><a href="https://github.com/1004lucifer/Test-JavaScript/blob/20ae946813d16fd6327ce5c9fcf5caa34a38cd95/React/TroubleShooting/typescript-readonly_keyword-error/package_origin.json#L25" target="_blank">https://github.com/1004lucifer/Test-JavaScript/blob/20ae946813d16fd6327ce5c9fcf5caa34a38cd95/React/TroubleShooting/typescript-readonly_keyword-error/package_origin.json#L25</a></p><p><br /></p><p>아래의 GitHub 프로젝트를 수행하여 이슈를 직접 확인해볼 수 있다.<br /> - <a href="https://github.com/1004lucifer/Test-JavaScript/tree/master/React/TroubleShooting/typescript-readonly_keyword-error" target="_blank">https://github.com/1004lucifer/Test-JavaScript/tree/master/React/TroubleShooting/typescript-readonly_keyword-error</a></p><p><br /></p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-555172269605513022021-03-16T22:09:00.004+09:002021-08-19T13:31:07.005+09:00[IntelliJ] 톰캣 debug 모드로 기동 시 Address already in use: NET_Bind 이슈 해결방법<p> </p><p><br /></p><h1 style="text-align: left;"><b>증상</b></h1><p> - (해당 포트가 어디에도 쓰이지는 않는것 같지만) 포트충돌이 난다고 톰캣이 기동되지 않는다.</p><p> - HTTP, JMX 포트가 아닌 54397 과 같은 큰 숫자의 포트이다.</p><p><br /></p><p><br /></p><h1 style="text-align: left;"><b>해결방법</b></h1><p>1. Run/Debug Configurations<br />2. 해당 톰캣 선택<br />3. Startup/Connection 선택<br />4. Debug 선택<br />5. Port를 1씩 줄이거나 늘리면서 바꿔보면서 기동을 해본다.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaxkO1znVF-fAOsM0LSZU99ymW9FD2Y3wY8WE2gjxUbr4mwKJvZnXh-bjcae-eUQz2GVDaUf8NLsn9BwAi3ScL-tlMMkwWP7oKaFgGb9HHRO4t87d7bYp5PwamY_W0sWO5yCTXojGvt9I/s819/IntelliJ_Bind.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="659" data-original-width="819" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaxkO1znVF-fAOsM0LSZU99ymW9FD2Y3wY8WE2gjxUbr4mwKJvZnXh-bjcae-eUQz2GVDaUf8NLsn9BwAi3ScL-tlMMkwWP7oKaFgGb9HHRO4t87d7bYp5PwamY_W0sWO5yCTXojGvt9I/s16000/IntelliJ_Bind.png" /></a></div><br /><p><br /></p><p><br /></p><p>=== 2021.08.19 내용 업데이트 ===</p><p><span style="font-size: large;"><b>PS.</b></span></p><p><b style="background-color: #f4cccc;">만일 위와같이 포트를 변경하면서 시도를 해봐도 해결이 되지 않을 때 winnat를 재기동 하면 된다.</b></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPYIO8E1KMy9LWgEB8YYb64aQTCdZJzDMCjbRMwzPu2xwL8GKf5g0KjTaTk7p_a1vQcfB2GegicmkG1E_3jQst0kBeWfWdb241GtsIqbYMf7gLYhC-0YUyeEikRtGRr6sR4BYsAYw99ss/s674/intellij_01.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="674" data-original-width="409" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPYIO8E1KMy9LWgEB8YYb64aQTCdZJzDMCjbRMwzPu2xwL8GKf5g0KjTaTk7p_a1vQcfB2GegicmkG1E_3jQst0kBeWfWdb241GtsIqbYMf7gLYhC-0YUyeEikRtGRr6sR4BYsAYw99ss/s16000/intellij_01.png" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeViZaFFPBgS9YjB3PQ5f9EsX1mYHtXFlyP-0b-Bv89iBoWuClktsanyjl9H1F29JMISbnR_lkhY1zG_-VtDQBcoDMsN1YfKSn6Fcf3clEp2398xe6IK_hGwweh4ag7TcWIlF9O-AIIfo/s469/intellij_02.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="316" data-original-width="469" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeViZaFFPBgS9YjB3PQ5f9EsX1mYHtXFlyP-0b-Bv89iBoWuClktsanyjl9H1F29JMISbnR_lkhY1zG_-VtDQBcoDMsN1YfKSn6Fcf3clEp2398xe6IK_hGwweh4ag7TcWIlF9O-AIIfo/s16000/intellij_02.png" /></a></div><br /><p><br /></p><p>참고<br /> - <a href="https://youtrack.jetbrains.com/issue/IDEA-226958" target="_blank">https://youtrack.jetbrains.com/issue/IDEA-226958</a><br /> - <a href="https://nnnz.tistory.com/441" target="_blank">https://stackoverflow.com/questions/61344554/tomcat-debug-error-unable-to-open-debugger-port-127-0-0-163199-java-net-bin</a></p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-9725654220162253052021-03-16T22:08:00.000+09:002021-03-16T22:08:45.683+09:00[FCM] 푸시 발송 오류 원인 - Error getting access token for service account / Connection reset<div><br /></div><div><br /></div><div><br /></div><h1 style="text-align: left;"><b>증상</b></h1><div>FCM Push 발송 시 아래와 같은 오류가 발생하면서 푸시발송이 정상적으로 되지 않았다.</div><div>(어쩔때는 정상적으로 되다가 안되다가 하는 증상)</div><div><br /></div><div><br /></div><div><br /></div><h1 style="text-align: left;"><b>원인</b></h1><div>(나의 경우에는 코드에 문제가 없었지만)</div><div><u style="background-color: #d9ead3;">회사의 네트워크에 보안설정에 의해 푸시 발송이 정상적으로 되지 않았다.</u></div><div><u style="background-color: #d9ead3;">모바일 기기의 테더링으로 같은코드를 수행 시 정상적으로 푸시발송이 되는것을 확인 할 수 있었다.</u></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div>
<div style="background-color: black; color: white;"><br /></div><div style="background-color: black;"><div><span style="color: white;">com.google.firebase.messaging.FirebaseMessagingException: Unknown error while making a remote service call: Error getting access token for service account: java.net.SocketException: Connection reset</span></div><div><span style="color: white;"><br /></span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.messaging.FirebaseMessagingException.withMessagingErrorCode(FirebaseMessagingException.java:47)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.messaging.FirebaseMessagingClientImpl$MessagingErrorHandler.createException(FirebaseMessagingClientImpl.java:293)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.messaging.FirebaseMessagingClientImpl$MessagingErrorHandler.createException(FirebaseMessagingClientImpl.java:282)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.internal.AbstractHttpErrorHandler.handleIOException(AbstractHttpErrorHandler.java:63)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.internal.ErrorHandlingHttpClient.createHttpRequest(ErrorHandlingHttpClient.java:141)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.internal.ErrorHandlingHttpClient.send(ErrorHandlingHttpClient.java:92)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.internal.ErrorHandlingHttpClient.sendAndParse(ErrorHandlingHttpClient.java:72)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.messaging.FirebaseMessagingClientImpl.sendSingleRequest(FirebaseMessagingClientImpl.java:127)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.messaging.FirebaseMessagingClientImpl.send(FirebaseMessagingClientImpl.java:113)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.messaging.FirebaseMessaging$1.execute(FirebaseMessaging.java:135)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.messaging.FirebaseMessaging$1.execute(FirebaseMessaging.java:132)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.internal.CallableOperation.call(CallableOperation.java:36)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.messaging.FirebaseMessaging.send(FirebaseMessaging.java:102)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.messaging.FirebaseMessaging.send(FirebaseMessaging.java:86)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at kr.co._1004lucifer.util.FcmUtil.send(FcmUtil.java:47)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at kr.co._1004lucifer.util.FcmUtilTest.send(FcmUtilTest.java:43)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at java.lang.reflect.Method.invoke(Method.java:498)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.junit.runners.ParentRunner.run(ParentRunner.java:363)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at org.junit.runner.JUnitCore.run(JUnitCore.java:137)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)</span></div><div><span style="color: white;">Caused by: java.io.IOException: Error getting access token for service account: java.net.SocketException: Connection reset</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.auth.oauth2.ServiceAccountCredentials.refreshAccessToken(ServiceAccountCredentials.java:444)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.auth.oauth2.OAuth2Credentials.refresh(OAuth2Credentials.java:157)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.auth.oauth2.OAuth2Credentials.getRequestMetadata(OAuth2Credentials.java:145)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.auth.oauth2.ServiceAccountCredentials.getRequestMetadata(ServiceAccountCredentials.java:603)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.auth.http.HttpCredentialsAdapter.initialize(HttpCredentialsAdapter.java:91)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.internal.FirebaseRequestInitializer.initialize(FirebaseRequestInitializer.java:55)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.api.client.http.HttpRequestFactory.buildRequest(HttpRequestFactory.java:88)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.internal.HttpRequestInfo.newHttpRequest(HttpRequestInfo.java:105)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.firebase.internal.ErrorHandlingHttpClient.createHttpRequest(ErrorHandlingHttpClient.java:137)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>... 39 more</span></div><div><span style="color: white;">Caused by: javax.net.ssl.SSLException: java.net.SocketException: Connection reset</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.security.ssl.Alert.createSSLException(Alert.java:127)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.security.ssl.TransportContext.fatal(TransportContext.java:353)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.security.ssl.TransportContext.fatal(TransportContext.java:296)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.security.ssl.TransportContext.fatal(TransportContext.java:291)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.security.ssl.SSLTransport.decode(SSLTransport.java:141)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1279)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1188)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:401)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:373)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:587)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1340)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1315)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:264)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:113)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:84)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1012)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at com.google.auth.oauth2.ServiceAccountCredentials.refreshAccessToken(ServiceAccountCredentials.java:441)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>... 47 more</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>Suppressed: java.net.SocketException: Connection reset by peer: socket write error</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at java.net.SocketOutputStream.socketWrite0(Native Method)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at java.net.SocketOutputStream.write(SocketOutputStream.java:155)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.security.ssl.SSLSocketOutputRecord.encodeAlert(SSLSocketOutputRecord.java:83)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.security.ssl.TransportContext.fatal(TransportContext.java:384)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>... 63 more</span></div><div><span style="color: white;">Caused by: java.net.SocketException: Connection reset</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at java.net.SocketInputStream.read(SocketInputStream.java:210)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at java.net.SocketInputStream.read(SocketInputStream.java:141)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:475)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:469)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:159)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>at sun.security.ssl.SSLTransport.decode(SSLTransport.java:110)</span></div><div><span style="color: white;"><span style="white-space: pre;"> </span>... 60 more</span></div><div style="color: white;"><br /></div></div>
<div><br /></div><div><br /></div>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-56117819963799297432020-12-16T13:50:00.002+09:002020-12-16T13:51:16.194+09:00[IntelliJ] svn: E170013, E230001 - SVN주소 HTTPS 관련 이슈 해결방법<p> </p><p><br /></p><p><br /></p><h1 style="text-align: left;">증상</h1><p>IntelliJ 에서 SVN 저장소 추가 시 아래와 같이 보여지며 소스 내용이 보여지지 않았다.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9SS_5OlwgWPzpSB5UjZsQgVbSLHJh3vvZ8JAJivv1mmrSqavop1aO-8QhVg3dgbLcqBTOcZ3mV4oWhxi4FcJqQ5Gnn_VPXwuJtB9W6WAsJQsiMhN1xcyOaCc5gxVC8A9WRq65lEJJLig/s1424/intellij01.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="94" data-original-width="1424" height="42" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9SS_5OlwgWPzpSB5UjZsQgVbSLHJh3vvZ8JAJivv1mmrSqavop1aO-8QhVg3dgbLcqBTOcZ3mV4oWhxi4FcJqQ5Gnn_VPXwuJtB9W6WAsJQsiMhN1xcyOaCc5gxVC8A9WRq65lEJJLig/w640-h42/intellij01.png" width="640" /></a></div><br />
<div style="background-color: black; color: white;">
<br /><div>svn: E170013: Unable to connect to a repository at URL 'https://SVN주소'</div><div>svn: E230001: Server SSL certificate verification failed: certificate has expired, certificate issued for a different hostname, issuer is not trusted</div><br />
</div>
<p><br /></p><p><br /></p><h1 style="text-align: left;">해결방법</h1><p>Settings 에서 svn으로 검색 후 아래의 화면과 같이 체크를 한다.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5UY5znEXXp16cn5hr9TFku5vu9RUH7DQ4AdggCS0-P2Txa4JjTSFZNVsZhpGFirSEMZpBCQZ_6CsqsEt70JdpFwUNtahSjlBI_EZMcBho4Q9KLLyB3BMX0IsB9deJaxEiELb0xU4TZRg/s902/02.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="701" data-original-width="902" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5UY5znEXXp16cn5hr9TFku5vu9RUH7DQ4AdggCS0-P2Txa4JjTSFZNVsZhpGFirSEMZpBCQZ_6CsqsEt70JdpFwUNtahSjlBI_EZMcBho4Q9KLLyB3BMX0IsB9deJaxEiELb0xU4TZRg/s16000/02.png" /></a></div><div><br /></div><div><br /></div><span style="color: white;">1004lucifer</span><br /><p>그리고 SVN저장소 부분을 새로고침 하면 아래와 같은 모습이 나오는데 Accept 를 눌러준다.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha3-On9GeeBriuz7qF9PX5u9g4VIvnzVxo3wtwpiMWV3mn98zMpVtTrweLxg3gZ93m5ACAYS7Vj_X_i_zWaUN-kknVCjnLI7gjOhQCAMsq5NXluJfDdt6f6jcHKDT1w2Kt7DmJbfnjRwY/s578/03.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="197" data-original-width="578" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha3-On9GeeBriuz7qF9PX5u9g4VIvnzVxo3wtwpiMWV3mn98zMpVtTrweLxg3gZ93m5ACAYS7Vj_X_i_zWaUN-kknVCjnLI7gjOhQCAMsq5NXluJfDdt6f6jcHKDT1w2Kt7DmJbfnjRwY/s16000/03.png" /></a></div><br /><p><br /></p><p>SVN계정을 입력 후 OK를 눌러주면 이후에는 정상적으로 이용이 가능하다.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxUULZjO1LIz3MTv-UDrM8JBbQ4ezXDm3gutleiW5xHZ2QkE3aSQDK4JkTie3Kl_RaXGQI-ZK4xlzTinmoxxggtXtvjImfncE1bCu93hqkE9l5nms25VVcHN1yp1ZZ4-Lt54YUv2NwwWo/s432/04.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="205" data-original-width="432" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxUULZjO1LIz3MTv-UDrM8JBbQ4ezXDm3gutleiW5xHZ2QkE3aSQDK4JkTie3Kl_RaXGQI-ZK4xlzTinmoxxggtXtvjImfncE1bCu93hqkE9l5nms25VVcHN1yp1ZZ4-Lt54YUv2NwwWo/s16000/04.png" /></a></div><br /><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com2tag:blogger.com,1999:blog-3762285562864588235.post-11931979706146514862020-12-07T21:25:00.001+09:002020-12-07T21:25:20.314+09:00[Redis] Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system 에러 (bgsave)<p> </p><p><br /></p><p><br /></p><p>Linux 서버에 Redis를 설치 후 정상적으로 작동되는것을 확인하고 나중에 다시 사용하려 하니 정상적으로 사용을 할 수가 없었다.</p><p><br /></p><h1 style="text-align: left;">문제</h1><p>사용하려 할 시 아래와 같은 에러로그가 보여졌다.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie_s1cEw7mkK7klUmj2CEZ1sNOZqHqpAc9629u_bztZNmzcfhSN-pnfwOFR_xlDLT73w1HlVUD6zDEl-Sus0opsAcs9HU4ZJZ1ZdBE9kg-KgZeUPfZBif1VebFeJ9ZNijqhTw0zG1Sh-w/s813/redis-bgsave.PNG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="247" data-original-width="813" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie_s1cEw7mkK7klUmj2CEZ1sNOZqHqpAc9629u_bztZNmzcfhSN-pnfwOFR_xlDLT73w1HlVUD6zDEl-Sus0opsAcs9HU4ZJZ1ZdBE9kg-KgZeUPfZBif1VebFeJ9ZNijqhTw0zG1Sh-w/s16000/redis-bgsave.PNG" /></a></div><p style="background-color: black;"><br /><span style="color: white;">set testkey testValue (error) MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.</span><br />1004lucifer</p><p><br /></p><p><br /></p><p>서버의 Redis로그를 확인해보니 아래와 같았다.</p>
<p style="background-color: black;"><br /><span style="color: white;">
21982:C 26 Nov 07:55:15.563 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo</span><br /><span style="color: white;">
21982:C 26 Nov 07:55:15.563 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=21982, just started</span><br /><span style="color: white;">
21982:C 26 Nov 07:55:15.563 # Configuration loaded</span><br /><span style="color: white;">
_._ </span><br /><span style="color: white;">
_.-``__ ''-._</span><br /><span style="color: white;">
_.-`` `. `_. ''-._ Redis 4.0.9 (00000000/0) 64 bit</span><br /><span style="color: white;">
.-`` .-```. ```\/ _.,_ ''-._ </span><br /><span style="color: white;">
( ' , .-` | `, ) Running in standalone mode</span><br /><span style="color: white;">
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379</span><br nbsp="" /><span style="color: white;">
| `-._ `._ / _.-' | PID: 22007</span><br /><span style="color: white;">
`-._ `-._ `-./ _.-' _.-' </span><br /><span style="color: white;">
|`-._`-._ `-.__.-' _.-'_.-'|</span><br /><span style="color: white;">
| `-._`-._ _.-'_.-' | http://redis.io</span><br /><span style="color: white;">
`-._ `-._`-.__.-'_.-' _.-' </span><br /><span style="color: white;">
|`-._`-._ `-.__.-' _.-'_.-'|</span><br /><span style="color: white;">
| `-._`-._ _.-'_.-' |</span><br /><span style="color: white;">
`-._ `-._`-.__.-'_.-' _.-' </span><br /><span style="color: white;">
`-._ `-.__.-' _.-'</span><br /><span style="color: white;">
`-._ _.-' </span><br /><span style="color: white;">
`-.__.-' </span><br />
1004lucifer<br /><span style="color: white;">
22007:M 26 Nov 07:55:15.568 # Server initialized</span><br /><span style="color: white;">
22007:M 26 Nov 07:55:15.568 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.</span><br /><span style="color: white;">
22007:M 26 Nov 07:55:15.568 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.</span><br /><span style="color: white;">
22007:M 26 Nov 07:55:15.569 * DB loaded from disk: 0.002 seconds</span><br /><span style="color: white;">
22007:M 26 Nov 07:55:15.570 * Ready to accept connections</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.033 * DB saved on disk</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.050 * DB saved on disk</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.104 * DB saved on disk</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.123 * DB saved on disk</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.146 * DB saved on disk</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.184 * DB saved on disk</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.197 * DB saved on disk</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.270 * DB saved on disk</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.278 * DB saved on disk</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.312 * DB saved on disk</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.362 * DB saved on disk</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.394 * DB saved on disk</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.402 * DB saved on disk</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.484 * DB saved on disk</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.660 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.667 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.712 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.722 # Failed opening the RDB file backup.db (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.755 # Failed opening the RDB file backup.db (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.785 # Failed opening the RDB file backup.db (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.794 # Failed opening the RDB file backup.db (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.856 # Failed opening the RDB file backup.db (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.892 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:12.935 # Failed opening the RDB file backup.db (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:13.001 # Failed opening the RDB file backup.db (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:13.064 # Failed opening the RDB file backup.db (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:13.065 # Failed opening the RDB file backup.db (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:13.157 # Failed opening the RDB file backup.db (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:13.301 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:13.303 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:13.443 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:13.447 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:13.565 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:13.657 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system </span>1004lucifer<br /><span style="color: white;">
22007:M 26 Nov 09:46:13.745 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:13.839 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:13.839 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:13.917 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:14.046 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:46:14.141 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:13.079 * 10 changes in 300 seconds. Saving...</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:13.080 * Background saving started by pid 22345</span><br /><span style="color: white;">
22345:C 26 Nov 09:51:13.080 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:13.180 # Background saving error</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:19.090 * 10 changes in 300 seconds. Saving...</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:19.090 * Background saving started by pid 22346</span><br /><span style="color: white;">
22346:C 26 Nov 09:51:19.090 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:19.190 # Background saving error</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:25.100 * 10 changes in 300 seconds. Saving...</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:25.102 * Background saving started by pid 22347</span><br /><span style="color: white;">
22347:C 26 Nov 09:51:25.102 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:25.202 # Background saving error</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:31.012 * 10 changes in 300 seconds. Saving...</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:31.012 * Background saving started by pid 22350</span><br /><span style="color: white;">
22350:C 26 Nov 09:51:31.012 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:31.112 # Background saving error</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:37.021 * 10 changes in 300 seconds. Saving...</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:37.021 * Background saving started by pid 22351</span><br /><span style="color: white;">
22351:C 26 Nov 09:51:37.022 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:37.122 # Background saving error</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:43.031 * 10 changes in 300 seconds. Saving...</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:43.032 * Background saving started by pid 22352</span><br /><span style="color: white;">
22352:C 26 Nov 09:51:43.032 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:43.132 # Background saving error</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:49.041 * 10 changes in 300 seconds. Saving...</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:49.041 * Background saving started by pid 22353</span><br /><span style="color: white;">
22353:C 26 Nov 09:51:49.041 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:49.141 # Background saving error</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:55.050 * 10 changes in 300 seconds. Saving...</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:55.050 * Background saving started by pid 22354</span><br /><span style="color: white;">
22354:C 26 Nov 09:51:55.051 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:51:55.151 # Background saving error</span><br /><span style="color: white;">
22007:M 26 Nov 09:52:01.061 * 10 changes in 300 seconds. Saving...</span><br /><span style="color: white;">
22007:M 26 Nov 09:52:01.061 * Background saving started by pid 22357</span><br /><span style="color: white;">
22357:C 26 Nov 09:52:01.061 # Failed opening the RDB file root (in server root dir /var/spool/cron) for saving: Read-only file system</span><br /><span style="color: white;">
22007:M 26 Nov 09:52:01.161 # Background saving error</span><br />
<br /><span style="color: white;"> ... (위 에러가 계속 있음)</span><br /><br />
</p>
<p><br /></p><p><br /></p><p><br /></p><h1 style="text-align: left;">원인 및 해결방법</h1><p>Redis 서버에 패스워드를 지정하지 않았고 기본포트로 되어있다 보니 누구나 접근이 가능했다.</p><p><b style="background-color: #fff2cc;">스택오버플로우에서 외부 공격으로 인해 그럴 수 있으니 방화벽 설정을 해두라는 이야기를 듣고 사용할 곳의 IP를 제외하고는 다른곳에서 접속할 수 없게 했더니 더 이상 문제가 발생하지 않았다.</b></p><p><br /></p><p><br /></p><p>참고<br /> - <a href="https://stackoverflow.com/questions/41887280/redis-config-dir-periodically-modified-to-var-spool-cron-with-failed-opening">https://stackoverflow.com/questions/41887280/redis-config-dir-periodically-modified-to-var-spool-cron-with-failed-opening</a></p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-86246847943012923502020-10-29T07:24:00.006+09:002020-11-03T19:41:01.132+09:00[Leaflet] Extending Leaflet - Handlers and Controls<p><br /></p><div style="background-color: #fff7f6; border: 1px dashed black;"><br /><h1 style="text-align: center;"><a href="https://1004lucifer.blogspot.com/p/document-leaflet.html" target="_blank">Leaflet 한글 튜토리얼 전체보기</a></h1><br /></div><p><br /></p><p><br /></p><p> - 이 튜토리얼은 <a href="https://1004lucifer.blogspot.com/2020/10/leaflet-extending-leaflet-class-theory.html" target="_blank">Leaflet의 Class 상속이론</a>을 읽었다고 가정한다.</p><p> - Leaflet에서 Map의 움직이는 모든것은 Layer로 되어있다.<br /> - Control은 (Map컨테이너에 상대적인) 정적인 상태를 유지하는 HTML요소이다.<br /> - Handler는 Map의 동작을 변경하는 보이지 않는 코드의 일부이다.</p><p><br /></p><h1 style="text-align: left;">핸들러 (Handlers)</h1><p> - Map Handler는 Leaflet 1.0의 새로운 개념으로, 브라우저에서 (클릭, 더블클릭, 마우스휠 같은)DOM 이벤트를 처리하고 Map 상태를 변경하는 기능이다.</p><p> - Handler는 상대적으로 간단하다.<br /> - Map에서 핸들러가 활성화 될때 수행할 addHooks()메소드와 핸들러가 비활성화 될때 수행할 removeHooks() 메소만 있으면 된다.<br /> - 핸들러의 골격은 다음과 같다.</p>
<p><script src="https://gist.github.com/1004lucifer/0b3ba073a257f01f7df0a54d66f82424.js"></script></p>
<p><br /></p>
<p> - <a href="https://developer.mozilla.org/en-US/docs/Web/API/Detecting_device_orientation" target="_blank">deviceorientation event</a>를 통해 모바일기기가 기울어졌을 때 지도를 이동하는 간단한 핸들러를 보여줄 수 있다.</p>
<p><script src="https://gist.github.com/1004lucifer/6fff4bc6ef4232c78ce0aabd17985ae9.js"></script></p>
<p> - 핸들러는 map.addHandler('tilt', L.TiltHandler) 를 이용하여 지도에 연결시킬 수 있다.<br /> - 위 코드는 L.TiltHandler의 인스턴스를 map.tilt로 저장할 것이다.<br /> - 하지만 addInitHook 문법을 사용하여 모든 Map에 핸들러를 연결시키는게 일반적이다.</p>
<p><script src="https://gist.github.com/1004lucifer/7a46b7265abe7ef3a1d8869b86a68b91.js"></script></p>
<p> - 이제 핸들러는 map.tilt.enable()이 수행되면 활성화되며, map.tilt.disable()이 수행되면 비활성화 된다.</p><p> - 또한 map에 핸들러와 동일한 이름의 속성이 있는경우 해당 옵션을 true로 설정하면 기본적으로 핸들러가 활성화 된다.</p>
<p><script src="https://gist.github.com/1004lucifer/1609025a28bc72993a354b950841420a.js"></script></p>
<p> - 이 예제소스를 확인하려면 <a href="https://caniuse.com/?search=deviceorientation" target="_blank">deviceorientation event를 지원하는 모바일 브라우저</a>가 필요하다. (테스트 시 완벽하지 않고 불안정하니 감안해야 한다.)</p>
<p><script src="https://gist.github.com/1004lucifer/d021ac47f4b9b94113af3a73f7bf9728.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/hv6bcm3a/2/embed/result,js,html,css/dark/"></script></p>
<p></p><div style="text-align: center;">(아래 링크를 클릭하여 새창에서 실행되는 페이지를 모바일에서 확인 시 해당 기기의 기울임에 따라서 지도가 이동하는 것을 확인할 수 있다.)</div><div style="text-align: center;"><a href="https://leafletjs.com/examples/extending/tilt.html" target="_blank"></a><a href="https://leafletjs.com/examples/extending/tilt.html" target="_blank">https://leafletjs.com/examples/extending/tilt.html</a></div><p></p>
<p> - 이벤트 유형에 따라 다르지만, Map핸들러는 이벤트리스너를 document, window, L.Map의 컨테이너에 붙일 수 있다.</p>
<p><br /></p>
<p><br /></p>
<h1 style="text-align: left;">컨트롤 (Controls)</h1><p> - 왼쪽상단 zoom컨트롤, 왼쪽하단 축척, 오른쪽상단 레이어변경 기능에 대해서 지금까지 봐왔을 것이다.<br /> - 그것들의 중심에는 Map컨테이너 고정위치에 있는 HTML요소인 L.Control이 있다.</p><p> - control을 만드려면 L.Control을 상속받고 onAdd(), onRemove() 메소드를 구현하면 된다.<br /> - onAdd()메소드가 control에 해당하는 HTML요소의 인스턴스를 반환하는 것을 제외하면 두개의 메소드는 L.Layer와 비슷하게 작동한다. (control이 map에 추가되거나 제거될 때 수행한다)<br /> - Map에 HTML요소의 추가/제거는 자동으로 이루어 진다.</p>
<p><script src="https://gist.github.com/1004lucifer/1ad0a090673c5139353ab5981b9f7ce6.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/hv6bcm3a/5/embed/result,js,html,css/dark/"></script></p>
<p><br /></p>
<p><br /></p>
<h1 style="text-align: left;">플러그인 제작</h1>
<p> - 지금까지 모든것을 이해했다면 Leaflet 플러그인을 만들 준비가 된 것이다.<br /> - 플러그인 명명규칙 및 제작에 대한 몇가지 팁과 우수사례가 있는 <a href="https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md" target="_blank">PLUGIN-GUIDE.md</a> 파일을 읽어보길 바란다.</p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p>참조: https://leafletjs.com/examples/extending/extending-3-controls.html</p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-80986373946364395282020-10-28T17:06:00.002+09:002020-11-03T19:40:54.259+09:00[Leaflet] Extending Leaflet - Layers<p><br /></p><div style="background-color: #fff7f6; border: 1px dashed black;"><br /><h1 style="text-align: center;"><a href="https://1004lucifer.blogspot.com/p/document-leaflet.html" target="_blank">Leaflet 한글 튜토리얼 전체보기</a></h1><br /></div><p><br /></p><p><br /></p><p> - 이 튜토리얼에서는 <a href="https://1004lucifer.blogspot.com/2020/10/leaflet-extending-leaflet-class-theory.html" target="_blank">Leaflet Class 상속 이론</a>을 읽었다고 가정한다.<br /> - Leaflet에서 "Layer"는 (map)지도를 이동시킬 때 움직이는 모든것이다.<br /> - 처음에는 직접 만드는것보다는 간단한 확장 방법을 설명하는게 더 쉽다.</p><p><br /></p>
<h1 style="text-align: left;">확장 메소드 (Extension methods)</h1><p> - 일부 Leaflet 클래스에는 서브클래스의 코드 작성을 위한 진입포인트인 'extension methods'를 가지고 있다.</p><p> - 그중 하나는 L.TileLayer.getTileUrl() 이다.<br /> - 이 메소드는 L.TileLayer에서 신규 타일이 이미지를 로드해야 할때마다 내부적으로 호출된다.<br /> - L.TileLayer의 서브클래스를 만들고 getTileUrl() 함수를 다시 작성하여 custom 동작을 만들 수 있다.</p><p> - custom L.TileLayer를 이용하여 <a href="https://placekitten.com/" target="_blank">PlaceKitten</a>의 랜덤한 고양이 이미지를 노출시켜보자.</p>
<p><script src="https://gist.github.com/1004lucifer/ba4c1280cceaa6568eb75419fc91100f.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/um8h2a9d/1/embed/result,js,html,css/dark/"></script></p>
<p> - 일반적으로 getTileUrl()은 타일좌표(coords.x / coords.y / coords.z)를 수신받고 해당 좌표에 대한 타일 (이미지)URL을 생성한다.<br /> - 이번 예제에서는 좌표를 무시하고 매번 다른 고양이를 얻기위해 난수를 사용한다.</p>
<p><br /></p><p><br /></p>
<h3 style="text-align: left;">플러그인 코드 분리</h3><p> - 이전 예에서는 L.TileLayer.Kitten 과 기본소스와 같은 위치에 정의가 되었다.<br /> - 플러그인의 경우 플러그인 코드 자체를 파일로 분리하고 해당 플러그인을 사용할 때 import 하는게 좋다.</p><p> - KittenLayer를 L.KittenLayer.js로 분리해주고 사용하는 곳에서 import를 해준다.</p>
<p><script src="https://gist.github.com/1004lucifer/a633c170f7c119b1cc7fab9295df0f09.js"></script></p>
<p><br /></p>
<h3 style="text-align: left;">L.GridLayer 와 DOM elements</h3><p> - 또 다른 확장방법은 L.GridLayer.createTile() 을 이용하는 것이다.<br /> - L.TailLayer는 (<img> 요소로서) 이미지의 그리드가 있다고 가정하지만, L.GridLayer는 (모든 종류의 <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element" target="_blank">HTML Element</a>요소의 그리드를 만들 수 있기에) 그렇게 가정하지 않는다</p><p> - L.GridLayer는 <img>태그의 요소를 생성 가능하지만, <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div" target="_blank"><div></a>/<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas" target="_blank"><canvas></a>/<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture" target="_blank"><picture></a> 등등 다른 모든것들을 생성할 수 있다.<br /> - createTile()은 전달받은 타일좌표의 <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement" target="_blank">HTML Element</a> 인스턴스를 반환하기만 하면 된다.<br /> - 이때, <a href="https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction" target="_blank">DOM</a> 요소를 조작하는 방법을 아는것이 중요하다.<br /> - (Leaflet은 HTML-Element의 인스턴스를 기대하고 있으며, jQuery와 같은 라이브러리의 요소들은 문제가 된다.)</p><p> - custom GridLayer의 예제는 <div>의 타일좌표를 보여주고 있다.<br /> - 이는 특히 Leaflet 내부를 디버깅하거나 (tile coordinates)타일좌표가 어떻게 작동하는지 이해하는데 유용하다.</p><p> - element가 비동기 초기화를 해야 하는경우 두번째 함수 매개변수인 'done'을 사용하고 (이미지과 완전히 로드된경우)준비되거나 에러가 발생한 경우 해당 함수를 호출한다.</p>
<p><script src="https://gist.github.com/1004lucifer/352e9c3690c2636a1801a6bbb9aac0b8.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/um8h2a9d/4/embed/result,js,html,css/dark/"></script></p>
<p><br /></p>
<p> - custom GridLayer를 사용하면 플러그인은 grid를 만들 때 HTML element를 완전히 컨트롤이 가능하다.<br /> - 일부 플러그인들은 이미 <canvas>를 사용하여 고급 렌더링을 수행하고 있다.<br /> - 기본적인 <canvas> GridLayer 사용은 다음과 같다.</p>
<p><script src="https://gist.github.com/1004lucifer/1486c2eb595db87fccd77116954264e0.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/um8h2a9d/6/embed/result,js,html,css/dark/"></script></p>
<p><br /></p>
<p><br /></p>
<h1 style="text-align: left;">픽셀 원점 (The pixel origin)</h1><p> - custom L.Layer를 만들 수 있지만, Leaflet이 HTML 요소를 배치하는 것에 대해서 더 깊은 지식이 필요하다.<br /> - 요약은 아래와 같다.<br /> 1) L.Map 에는 <div>인 (지도 창)'map panes'가 있다.<br /> 2) L.Layer는 'map pane' 안에있는 HTML 요소이다.<br /> 3) map은 모든 LatLng를 지도CRS의 좌표로 변환하고, 그다음 (absolute)절대 '픽셀 좌표'로 변환한다. (CRS의 원점은 픽셀좌표의 원점과 같음)<br /> 4) (중앙 LatLng와 줌레벨을 가지고 있는) L.map이 준비되면 왼쪽 상단의 절대픽셀좌표는 '픽셀원점'이 된다.<br /> 5) 각 L.Layer는 'map pane'에서 픽셀원점과 레이어LatLng의 절대픽셀좌표에 따라 오프셋 된다.<br /> 6) 픽셀원점은 각각 zoomend, viewreset 이벤트가 수행된 이후 리셋되며, (필요한 경우) 모든 L.Layer의 위치는 재계산된다.<br /> 7) map을 주위로 이동 시키는경우 픽셀원점은 리셋되지 않으며, 모든 pane들의 위치가 변경된다.</p><p> - 위 설명은 조금 헷갈릴 수 있으니 다음 지도의 확인이 필요하다.</p>
<p><script src="https://gist.github.com/1004lucifer/c8fcecd34cb9c88ec7021e855eedf5b8.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/um8h2a9d/11/embed/result,js,html,css/dark/"></script></p>
<p> - (녹색) CRS원점은 LatLng와 동일하게 유지된다.<br /> - (빨간색) 픽셀원점은 항상 왼쪽 상단 모서리에서 시작한다.<br /> - 픽셀원점은 맵이 이동될 때 이리저리 이동하며, ((지도창)map pane이 지도 컨테이너에 따라 재배치됨) 확대/축소 할 시 화면의 동일한 위치에 남아있다. (map pane은 재배치되지 않지만 layer 자체는 다시 그릴 수 있다.)<br /> - 픽셀원점에 대한 절대픽셀좌표는 확대/축소 할 때 업데이트 되지만 이동중에는 업데이트 되지 않는다.<br /> - 지도를 확대할 때마다 (녹색 괄호까지의 거리)절대픽셀좌표가 두배가 되는 것을 볼 수 있다.</p><p> - (ex: blue L.Marker)무엇이든 배치하기위해 LatLng는 지도의 L.CRS 안에있는 절대픽셀좌표로 변환된다.<br /> - 그 다음 픽셀원점의 절대픽셀좌표를 절대픽셀좌표에서 빼고 (연청색)픽셀원점에 대한 오프셋을 제공한다.<br /> - 픽셀원점은 모든 (지도창)'map pane'의 왼쪽 상단 모서리에 있으므로 이 오프셋을 마커 아이콘의 HTML요소에 적용할 수 있다.<br /> - (암청색 선)마커의 아이콘앵커는 negative CSS margin을 통해 이루어진다.</p><p> - L.Map.project() 와 L.Map.unproject() 메소드는 절대픽셀좌표에 의해 동작한다.<br /> - 마찬가지로 L.Map.latLngToLayerPoint() 와 L.Map.layerPointToLatLng() 는 픽셀원점을 기준으로 오프셋으로 작업한다.</p><p> - 다른 레이어들은 이러한 계산을 다른 방식으로 적용한다.<br /> - L.Marker 는 단순히 아이콘의 위치를 바꾸기만 하면 된다.<br /> - L.GridLayer는 (절대픽셀좌표의)지도범위를 계산한 다음 요청할 타일좌표 리스트를 계산한다.<br /> - (polyline, polygon, circle marker 등등)벡터레이어는 각 LatLng를 픽셀로 변환하고, SVG 또는 <canvas>를 사용하여 (기하학적 구조)지오메트리를 그린다.</p><p><br /></p>
<h3 style="text-align: left;">onAdd 와 onRemove</h3><p> - 핵심은 모든 L.Layer는 (지도창)map pane 내부의 HTML 요소이며, 레이어의 코드에 정의된 (position/content)위치와 내용이다.<br /> - 그러나 레이어가 인스턴스화 되면 HTML요소를 생성할 수 없다.<br /> - 오히려, 레이어는 지도에 추가되고나서 수행되며, 레이어는 그때까지 map에 대해서 알지 못한다. (심지어 document까지도)</p><p> - 즉, map은 레이어의 onAdd() 메소드를 호출한 후 HTML요소인 레이어를 생성하여 (지도창)map pane에 추가한다.<br /> - 반대로, 지도에서 레이어가 제거되면 onRemove() 메소드가 호출된다.<br /> - 레이어는 map에 추가될 때 내용을 업데이트하고 map view가 업데이트 되면 위치를 변경해야한다.<br /> - 레이어 뼈대는 다음과 같다.</p>
<p><script src="https://gist.github.com/1004lucifer/4693e4f722c626a4c6cf7fd343ea5dae.js"></script></p>
<p> - 레이어의 HTML요소의 정확한 위치는 (객체를 만들때)레이어의 세부사항에 따라 다르지만, 이 소개는 Leaflet의 레이어코드를 읽고 새로운 레이어를 만드는데 도움이 될 것이다.</p>
<p><br /></p>
<h3 style="text-align: left;">부모(클래스)의 onAdd 사용</h3><p> - 일부 사용 사례에서는 모든 onAdd 코드를 재생성할 필요는 없지만, (필요시에) 부모의 onAdd를 재사용하는것 대신 일부 세부사항은 초기화 이전 또는 이후에 추가할 수 있다.</p><p> - 예를들어 (옵션을 무시한 ) 항상 빨간색인 L.Polyline의 서브클래스를 가질 수 있다.</p>
<p><script src="https://gist.github.com/1004lucifer/315f7c90fe80e827cbbe6e2120c8038f.js"></script></p>
<p><br /></p>
<p><br /></p>
<p>참조: https://leafletjs.com/examples/extending/extending-2-layers.html</p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-11663310872747729602020-10-26T21:36:00.006+09:002020-11-03T19:40:39.997+09:00[Leaflet] Extending Leaflet - Class Theory<p><br /></p><div style="background-color: #fff7f6; border: 1px dashed black;"><br /><h1 style="text-align: center;"><a href="https://1004lucifer.blogspot.com/p/document-leaflet.html" target="_blank">Leaflet 한글 튜토리얼 전체보기</a></h1><br /></div><p><br /></p>
<h1 style="text-align: left;">Leaflet 확장</h1><p> - Leaflet에는 수백개의 플러그인이 있다. 이는 Leaflet의 기능을 확장하며 때로는 일반적인 방식으로, 때로는 유스케이스별 방식으로 확장한다.</p><p> - 플러그인이 많은 이유는 Leaflet이 확장하기 쉽기 때문이다.<br /> - 이 튜토리얼에서는 가장 일반적으로 사용되는 방법을 다룬다.</p><p> - 이 자습서는 다음 사항을 잘 이해하고 있다고 가정한다.<br /> 1) JavaScript<br /> 2) DOM handling<br /> 3) OOP (클래스, 인스턴스, 상속, 메소드 및 프로퍼티와 같은 개념 이해)</p><p><br /></p><p><br /></p>
<h1 style="text-align: left;">Leaflet 아키텍처</h1><p> - Leaflet 1.0.0의 단순화된 UML 클래스 다이어그램을 확인해보자.<br /> - 60개 이상의 JavaScript 클래스가 있어서 다이어그램이 조금 크다.</p><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkVixJwLwiS64kue8y-kNJ3eltL0UnrciNZxoVxyjO-Y5ZaVJAN_DGn314fHAT12n3Nfp0893b3gO42IPJ9zBEbiPJIhGIE94rbv2LB50qTwPQ-TPYH4UvV7tUMtVX8PS7UTEgw64kJJ0/s1910/class-diagram.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1570" data-original-width="1910" height="526" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkVixJwLwiS64kue8y-kNJ3eltL0UnrciNZxoVxyjO-Y5ZaVJAN_DGn314fHAT12n3Nfp0893b3gO42IPJ9zBEbiPJIhGIE94rbv2LB50qTwPQ-TPYH4UvV7tUMtVX8PS7UTEgw64kJJ0/w640-h526/class-diagram.jpg" width="640" /></a></div><div style="text-align: center;"><br /></div><div style="text-align: center;">(마우스 클릭 시 큰 화면으로 확인 가능)</div><p><br /></p><p>- 기술적 관점에서 Leaflet은 다양한 방법으로 확장 할 수 있다.</p><p> * 가장 일반적인 방법: L.Class.extends()를 활용하여 L.Layer / L.Handler / L.Control 과 같은 서브클래스를 생성</p><p> - map이 이동/확대 될때 Layer가 이동함.<br /> - Handler는 보이지 않으며 브라우저 이벤트를 해석한다.<br /> - Control은 고정된 인터페이스 요소이다.</p><p> * L.Class.include() 를 이용하여 기존 클래스에 더 많은 기능을 추가</p><p> - 신규 methods 와 options 추가<br /> - 특정 methods 변경<br /> - addInitHook을 사용하여 새로운 (constructor)생성자 코드를 수행</p><p> * L.Class.include() 를 이용하여 기존 클래스의 일부를 변경 (클래스 메소드 작동방법 변경)</p><p><br /></p><p> - 이 튜토리얼에서는 Leaflet 1.0.0에서만 사용할 수 있는 일부 클래스와 메소드를 다룬다.<br /> - 이전 버전용 플러그인을 개발하는 경우 주의해야한다.</p><p><br /></p><p><br /></p>
<h1 style="text-align: left;">L.Class</h1><p> - JavaScript는 약간 이상한 언어인데, (Object-Oriented)객체지향 언어가 아니라 (Prototype-Oriented)프로토타입지향 언어이다.<br /> - 때문에 OOP의미에서 클래스 상속을 사용하기가 어려웠다.<br /></p><p> - Leaflet은 L.Class를 중점적으로 사용하여 클래스 상속을 용이하게 한다.</p><p> - 최근 자바스크립트인 ES6는 클래스를 사용할 수 있지만 Leaflet은 이를 중심으로 설계되지 않았다.</p><p><br /></p>
<h3 style="text-align: left;">L.Class.extend()</h3><p> - Leaflet에서 하위클래스를 만드려면 .extend() 메소드를 사용하면 된다.<br /> - .extend() 메소드에는 하나의 파라메터를 허용하는데 해당 파라메터는 key-value 쌍으로 되어있는 일반 Object 이다.<br /> - 해당 Object의 key는 프로퍼티 또는 메소드의 이름이며, value는 프로퍼티값 또는 메소드의 구현체이다.</p>
<p><script src="https://gist.github.com/1004lucifer/29240906bbb103e9f8d93413b234923a.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/outyqghm/3/embed/result,js,html,css/dark/"></script></p>
<p> - class, method, property 이름을 지정할 때 다음 규칙을 따르는게 좋다.<br /> 1) <a href="https://en.wikipedia.org/wiki/Camel_case" target="_blank">lowerCamelCase</a> 규칙: Function, method, property, factory 이름<br /> 2) <a href="https://en.wikipedia.org/wiki/Camel_case" target="_blank">UpperCamelCase</a> 규칙: Class 이름<br /> 3) (접근지정자) private 형식의 property, method 는 밑줄(_)로 시작한다. 이건 private로 만들어 주는것은 아니지만 개발자들에게 직접 사용하지 말라고 권고하는 것이다.</p>
<p><br /></p>
<h3 style="text-align: left;">L.Class.include()</h3><p> - 클래스가 이미 정의된경우 .include()를 사용하여 기존 property/method 를 재정의 하거나, 새로운 property/method 를 추가할 수 있다. (아래의 코드 참고)</p>
<p><script src="https://gist.github.com/1004lucifer/1e08b61704ad4080107bbced7ad7b45a.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/outyqghm/9/embed/result,js,html,css/dark/"></script></p>
<p><br /></p>
<h3 style="text-align: left;">L.Class.initialize()</h3><p> - OOP에서 클래스에는 생성자 메소드가 있다.<br /> - Leaflet 에서 L.Class 생성자 메소드는 항상 initialize 이다.</p><p> - 만약 클래스에 options를 기술한경우 생성자에서 L.setOptions()를 사용해 그것들을 초기화 하는게 좋다.<br /> - 이 유틸리티 함수는 기술한 options를 클래스의 기본 options 와 병합한다.</p>
<p><script src="https://gist.github.com/1004lucifer/2a2f155046386dd622caf9d7cc1d0eb4.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/outyqghm/21/embed/result,js,html,css/dark/"></script></p>
<p><br /></p>
<p> - Leaflet은 특별한 방법으로 options 속성을 처리한다.<br /> - 부모 클래스의 options는 자식 클래스에 상속된다.</p>
<p><script src="https://gist.github.com/1004lucifer/9bb00868ad3bde549dd3cb6876177a02.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/outyqghm/23/embed/result,js,html,css/dark/"></script></p>
<p><br /></p>
<p> - 자식클래스가 부모의 생성자를 수행한다음 자신의 생성자를 수행하는게 일반적이다.<br /> - 이를 위해서 Leaflet 에서는 L.Class.addInitHook() 을 사용할 수 있다.<br /> - 이 메소드를 이용하여 클래스 initialize() 직후 실행되는 hook 초기화 함수로 사용할 수 있다.</p>
<p><script src="https://gist.github.com/1004lucifer/9aac18ae5ac775c4d440628cf2620cf3.js"></script></p>
<p> - 위 코드는 setOptions()를 수행하는 initialize() 이후에 수행된다.<br /> - 이 뜻은 init hook 이 실행될 때는 this.options 가 이미 생성되어 있다는 의미가 된다.</p>
<p><br /></p>
<p> - addInitHook은 대체구문이 있으며, 메소드이름과 메소드에 전달할 인수를 채워주면 된다.</p>
<p><script src="https://gist.github.com/1004lucifer/26c60edaa7535d0a5800a766753c81bd.js"></script></p>
<p><br /></p>
<h3 style="text-align: left;">부모클래스의 메소드</h3><p> - 부모클래스의 메소드를 호출하는 방법은 부모클래스의 prototype에 도달하여 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call" target="_blank">Function.call()</a>을 사용하여 호출할 수 있다.<br /> - 아래는 L.FeatureGroup의 코드에 대한 샘플이다.</p>
<p><script src="https://gist.github.com/1004lucifer/95c5d163d760abdd7f1a055414fcc043.js"></script></p>
<p> - 부모의 생성자를 호출하는것도 비슷하지만 다음과 같이 사용이 가능하다.<br /> - ParentClass.prototype.initialize.call(this, …)</p>
<p><br /></p>
<h3 style="text-align: left;">factory</h3><p> - 대부분의 Leaflet 클래스는 <a href="https://en.wikipedia.org/wiki/Factory_%28object-oriented_programming%29" target="_blank">factory 함수</a>를 가지고 있다.<br /> - factory 함수는 UpperCamelCase 형식의 클래스명 대신 lowerCamelCase의 클래스명을 사용한다.</p>
<p><script src="https://gist.github.com/1004lucifer/45a126384f7a854fdd2dde824927ebc8.js"></script></p>
<p><br /></p>
<h3 style="text-align: left;">명명규칙</h3><p> - Leaflet 플러그인의 클래스 이름을 지정할 때 다음의 명명규칙을 따라야 한다.<br /> 1) 플러그인에서 전영변수를 노출시키지 않는다.<br /> 2) 신규 클래스가 있는경우 L 네임스페이스에 직접 추가한다. (ex: L.MyPlugin)<br /> 3) 기존 클래스 중에 하나를 상속하는 경우 하위속성으로 만든다. (ex: L.TileLayer.Banana)</p><p><br /></p><p><br /></p><p>PS. 아래는 해당 튜토리얼에 나와있는 예제</p>
<p><script src="https://gist.github.com/1004lucifer/8fba4697fdd1bb47f6a95c08799cd0ef.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/outyqghm/26/embed/result,js,html,css/dark/"></script></p>
<p><br /></p><p><br /></p>
<p>참조: https://leafletjs.com/examples/extending/extending-1-classes.html</p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-51812541282544018302020-10-24T17:58:00.001+09:002020-11-03T19:40:27.767+09:00[Leaflet] Showing video files<p><br /></p><div style="background-color: #fff7f6; border: 1px dashed black;"><br /><h1 style="text-align: center;"><a href="https://1004lucifer.blogspot.com/p/document-leaflet.html" target="_blank">Leaflet 한글 튜토리얼 전체보기</a></h1><br /></div><p><br /></p>
<h1 style="text-align: left;">웹페이지의 비디오</h1><p> - HTML Element의 video 태그를 사용할 수 있을때까지 웹페이지에서 비디오는 어려운 작업이었다.<br /> - 요즘에는 다음과 같은 HTML 코드를 사용할 수 있다.</p>
<p><script src="https://gist.github.com/1004lucifer/5f579eef019fb889962af3bb7064f58d.js"></script></p>
<p> - 이 비디오는 다음과 같이 보여진다.</p>
<p>
<video controls="" width="500">
<source src="https://www.mapbox.com/bites/00188/patricia_nasa.webm" type="video/webm"></source>
<source src="https://www.mapbox.com/bites/00188/patricia_nasa.mp4" type="video/mp4"></source>
</video>
</p><p> - 만약 웹페이지에서 이와같이 보여줄 수 있다면 Leaflet에서 map 안에 보여줄 수 있다.<br /> - 여기서 비디오를 map과 (fit)크기나 사이즈가 맞게 준비되는 것이 중요하다.<br /> - 비디오는 지도와 같이 북향 방향으로 되어있어야 하며, 비율은 map과 (fit)맞아야 한다.<br /> - 그렇지 않으면 이상하게 보일 것이다.</p><p><br /></p><p><br /></p>
<h3 style="text-align: left;">이미지 오버레이의 경계</h3>
<p><script src="https://gist.github.com/1004lucifer/24037e72e89aaa5e9fc71e12a463f2b2.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/eymxp4v0/1/embed/result,js,html,css/dark/"></script></p>
<p><br /></p>
<p><br /></p>
<h3 style="text-align: left;">비디오 오버레이 추가</h3>
<p><script src="https://gist.github.com/1004lucifer/70f96fc6800a9174ed3117f36717169c.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/eymxp4v0/4/embed/result,js,html,css/dark/"></script></p>
<p><br /></p>
<p><br /></p>
<h3 style="text-align: left;">비디오에 대한 간단한 조작</h3>
<p><script src="https://gist.github.com/1004lucifer/ed948b39c8eaa45771ae3430658f25ce.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/eymxp4v0/5/embed/result,js,html,css/dark/"></script></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p>참고: https://leafletjs.com/examples/video-overlay/</p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-53307749864042287932020-10-24T16:36:00.001+09:002020-11-03T19:39:30.705+09:00[Leaflet] Working with map panes<p><br /></p><div style="background-color: #fff7f6; border: 1px dashed black;"><br /><h1 style="text-align: center;"><a href="https://1004lucifer.blogspot.com/p/document-leaflet.html" target="_blank">Leaflet 한글 튜토리얼 전체보기</a></h1><br /></div><p><br /></p>
<h1 style="text-align: left;">What are panes?</h1><p> - Leaflet에서 map pane은 개발자가 모르는 사이에 레이어 그룹화를 시킨다.<br /> - 이 그룹화는 웹 브라우저가 여러 레이어를 개별적으로 작업하는 것보다 더 효율적인 방법으로 작업 할 수 있도록 한다.</p><p> - Map panes는 CSS의 z-index 속성을 이용하여 일부 레이어를 다른레이어 위에 보여준다.<br /> - 기본 순서는 다음과 같다.<br /> 1) TileLayers and GridLayers<br /> 2) Paths, like lines, polylines, circles, or GeoJSON layers.<br /> 3) Marker shadows<br /> 4) Marker icons<br /> 5) Popups</p><p> - 이 때문에 Leaflet Map에서 팝업이 다른 레이어보다 항상 위에 표시되고 marker는 타일레이어 위에 보여지게된다.</p><p> - (0.7.x에는 없는) Leaflet 1.0.0의 새로운 기능은 이 순서를 사용자 지정할 수 있는 custom map panes 이다.</p><p><br /></p><p><br /></p>
<h1 style="text-align: left;">기본값이 항상 올바른건 아니다.</h1><p> - 어떤 특별한 상황에서는 기본 순서가 map에 적합하지 않으며, <a href="https://carto.com/basemaps/" target="_blank">Cato의 basemaps 과 label</a> 을 통해서 설명을 할 수 있다.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs9gKqK6wt1UOEhTu6cxIZ4nkBndVX-THVo2JfLvhhDYKeqHjySqtTzPHnwHSFVMWzqY7nbHGcWOHXD-0mTMuDuyANWKwrRPLuZPpgQQ8nRHuCFrBgQofDq9vuNJEn2pvog2OlnpwC46o/s789/01.PNG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="289" data-original-width="789" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs9gKqK6wt1UOEhTu6cxIZ4nkBndVX-THVo2JfLvhhDYKeqHjySqtTzPHnwHSFVMWzqY7nbHGcWOHXD-0mTMuDuyANWKwrRPLuZPpgQQ8nRHuCFrBgQofDq9vuNJEn2pvog2OlnpwC46o/s16000/01.PNG" /></a></div><br /><p> - Leaflet map에서 basemaps,label 두개의 타일을 이용해서 만들 때, marker나 polygon은 이전의 두개의 타일 위에 나타나겠지만 label타일이 가장 위에 보여지는게 더 나아보일 수 있다.</p><p> - 아래는 기본순서로 보여진 경우(오른쪽)와 기본순서를 custom 한 경우(왼쪽)이다.<br /> (기본 순서에서는 polygon 이 label 타일보다 위로 올라와 label을 가리게 된다.)</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaYzYuL9P1EkBnhW-_xnkAn-VzD85yY13NT5Lh-Pok5cE1T4mrqVGB81Y7ksxkSJOGu9cgMPDYOkIcDYT688ePmnSg8UnjQ4MhTm9hyphenhyphenp2BszsJwuKjuiTykePQzMXO9WuzBQZiDNGKUy8/s906/02.PNG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="444" data-original-width="906" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaYzYuL9P1EkBnhW-_xnkAn-VzD85yY13NT5Lh-Pok5cE1T4mrqVGB81Y7ksxkSJOGu9cgMPDYOkIcDYT688ePmnSg8UnjQ4MhTm9hyphenhyphenp2BszsJwuKjuiTykePQzMXO9WuzBQZiDNGKUy8/s16000/02.PNG" /></a></div><br /><p><br /></p>
<h1 style="text-align: left;">Custom pane</h1>
<p><script src="https://gist.github.com/1004lucifer/a822d79c28349bd2c9bd2f625d41ba85.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/w4bh3m7a/2/embed/result,js,html,css/dark/"></script></p><p><br /></p><p><br /></p>
<p>참고: https://leafletjs.com/examples/map-panes/</p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0tag:blogger.com,1999:blog-3762285562864588235.post-42511836118201730452020-10-23T21:34:00.003+09:002020-11-03T19:39:23.389+09:00[Leaflet] WMS and TMS<p><br /></p><div style="background-color: #fff7f6; border: 1px dashed black;"><br /><h1 style="text-align: center;"><a href="https://1004lucifer.blogspot.com/p/document-leaflet.html" target="_blank">Leaflet 한글 튜토리얼 전체보기</a></h1><br /></div><p><br /></p><p><br /></p><p> - '<a href="https://en.wikipedia.org/wiki/Web_Map_Service" target="_blank">Web Map Service</a>'의 약자인 WMS는 전문적인 GIS 소프트웨어로 널리 사용된다. (비 GIS사용자는 거의 사용하지 않는다.)<br /> - 이 형식은 지도 타일과 비슷하지만 더 일반적이며, 웹 지도에서 사용하기에는 적합하지 않다.<br /> - WMS 이미지는 모서리의 좌표에 의해 정의된다. (Leaflet이 내부적으로 수행하는 계산)</p><p> - TMS는 '<a href="https://en.wikipedia.org/wiki/Tile_Map_Service" target="_blank">Tiled Map Service</a>'를 의미하여 웹지도에 보다 초점을 맞춘 지도 타일링 표준으로, Leaflet이 L.TileLayer에서 기대하는 지도타일과 매우 유사하다.</p><p> - WMTS는 '<a href="https://en.wikipedia.org/wiki/Web_Map_Tile_Service" target="_blank">Web Map Tile Service</a>'를 위한 표준 프로토콜로 L.TileLayer에서 직접 사용할 수 있는 맵 타일을 제공한다.</p><p><br /></p><h1 style="text-align: left;">WMS in Leaflet</h1><p> - 누군가 WMS 서비스를 시작하면 해당 서비스는 GetCapabilities 라는 문서에 연결된 가능성이 크다.<br /> - 이 예제에서는 Mundialis가 제공하는 WMS를 사용한다.<br /> - 서비스의 기능은 다음 URL에 있다.<br /> - http://ows.mundialis.de/services/service?request=GetCapabilities<br /></p><p> - Leaflet은 WMS GetCapabilities 문서를 이해하지 못한다.<br /> - 대신에 L.TileLayer.WMS 레이어를 만들고, 기본적인 WMS URL을 제공하고, 우리가 필요한 WMS옵션을 명시할 수 있다.<br /> - 기본 WMS URL은 다음과 같이 매개변수가 없는 간단한 GetCapabilities URL이다.<br /> - http://ows.mundialis.de/services/service?</p><p> - 그리고 Leaflet 지도에서 사용하는 방법은 간단하다.<br /></p><p><script src="https://gist.github.com/1004lucifer/6cd436b4f1a5d6b86197b13ef16dd6f0.js"></script></p><p> - L.TileLayer.WMS 인스턴스에는 최소한 한가지 옵션이 필요하다. (layers)<br /> - Leaflet의 layer 개념과 WMS의 layer 개념이 다름에 주의가 필요하다.</p><p> - WMS서버는 서비스에서 layers의 설정을 정의한다.<br /> - 이러한 내용은 GetCapabilities XML 문서에 정의되어 있지만, 대부분의 경우 지루하고 이해하기 어렵다.<br /> - 일반적으로 <a href="http://www.qgistutorials.com/en/docs/working_with_wms.html" target="_blank">QGIS와 같은 소프트웨어</a>를 사용하여 WMS서버에서 사용할 수 있는 layers를 확인하여 사용가능한 레이어 이름을 확인하는것이 좋다.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPRBSr0fjOXLB4WfnjP-youfsGXM0JqbTEfyEtxVcdgCMO-dGUBkroBFTJNAO_RQnFPUEI8wdbP99F26ZfW8ojH6ek2qB-S1yZKVQyjl0h3OEcsqxuvD_83eky3My2xy2kAeNZpFGweIQ/s693/qgis-wms-layers.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="297" data-original-width="693" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPRBSr0fjOXLB4WfnjP-youfsGXM0JqbTEfyEtxVcdgCMO-dGUBkroBFTJNAO_RQnFPUEI8wdbP99F26ZfW8ojH6ek2qB-S1yZKVQyjl0h3OEcsqxuvD_83eky3My2xy2kAeNZpFGweIQ/s16000/qgis-wms-layers.png" /></a></div><p><br /></p><p> - 우리는 Mundialis WMS가 TOPO-OSM-WMS라는 이름의 WMS 레이어를 베이스맵으로 하고 있음을 알 수 있다.<br /> - 아래의 코드를 통해 확인을 해보자.</p>
<p><script src="https://gist.github.com/1004lucifer/5f82a02e6a7ac34162f2c33b5d1e5183.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/3osdm24k/1/embed/result,js,html,css/dark/"></script></p>
<p><br /></p>
<p>SRTM30-Colored-Hillshade WMS layer 로하면 다음과 같다.</p>
<p><script src="https://gist.github.com/1004lucifer/57544793926d7198fa14b51177b1becb.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/3osdm24k/3/embed/result,js,html,css/dark/"></script></p>
<p><br /></p>
<p> - layers 옵션은 쉼표로 구분된 layers 목록이다.<br /> - WMS 서비스가 여러개의 layers를 정의한경우, 지도 이미지 요청은 두개 이상의 layer를 참조할 수 있다.</p><p> - 우리가 사용하는 WMS서버의 예로는 세계 지형을 보여주는 'TOPO-WMS' WMS layer와 지역의 이름을 보여주는 'OSM-Overlay-WMS' WMS layer가 있다.</p><p> - WNS서버는 쉼표로 구분된 2레이어를 요청 시 하나의 이미지로 구성한다.</p>
<p><script src="https://gist.github.com/1004lucifer/fe436e512b730320d743ed60ab8fcde6.js"></script></p>
<p><br /></p>
<p> - WMS서버에 하나의 이미지를 요청한다는 점에 유의해야한다.<br /> - 이것은 지형을 위해 L.TileLayer.WMS를 생성하고 장소를 위한 하나의 L.tileLayer.WMS를 생성해서 둘다 지도에 추가하는것과는 다르다.</p><p> - 첫번째의 경우, 1개의 이미지요청을 하고 WMS서버가 이미지를 어떻게 구성할지 결정한다. (이미지를 서로 위에 올려놓음)<br /> - 두번째의 경우 두개의 이미지 요청을 하고, 웹브라우저의 Leaflet 코드가 어떻게 구성할지 결정한다.</p><p> - layers control을 이용하여 결합하여 간단히 지도를 생성하면 어떻게 다른지 알 수 있다. (아래의 예제코드)<br /> - 'Topography, then places' 옵션을 선택 시 장소가 지역의 위로 올라오는 것을 볼 수 있다.<br /> - layers를 많이 요청 시 레이어를 구성하는 방법은 WMS서버에게 달려있다.</p>
<p><script src="https://gist.github.com/1004lucifer/b5ea103e0b2f9ea714327b5332ad3a95.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/3osdm24k/5/embed/result,js,html,css/dark/"></script></p>
<p><br /></p>
<h3 style="text-align: left;">WMS서비스의 GIS사용자를 위한 참고사항</h3><p> - GIS관점에서 보면 Leaflet의 WMS처리는 상당히 기본적이며 GetCapabilities / GetFeatureInfo / legend의 지원이 없다.</p><p> - T.TileLayer.WMS는 추가적인 옵션이 있는데 <a href="https://leafletjs.com/reference-1.7.1.html#tilelayer-wms" target="_blank">Leaflet API Document</a>에서 찾아볼 수 있다.<br /> - API Document에 기술되지 않은 모든 옵션은 getImage URL의 WMS서버로 전송된다.</p><p> - 또한 Leaflet은 CRS:3857, CRS:3395 and CRS:4326 등 매우 적은수의 <a href="https://en.wikipedia.org/wiki/Spatial_reference_system" target="_blank">좌표시스템</a>을 지원한다. (document의 L.CRS 참고)<br /> - WMS서비스가 해당 좌표계의 이미지를 제공하지 않는경우, <a href="https://github.com/kartena/Proj4Leaflet" target="_blank">Proj4Leaflet</a>을 사용하여 Leaflet의 다른 좌표시스템을 사용해야 할 수 있다.<br /> - 그외에는 지도를 초기화 할때 올바를 CRS를 사용하면 모든 추가된 WMS layers는 사용가능하다.</p>
<p><script src="https://gist.github.com/1004lucifer/a0d0b538d232947d1d5096ce310f5af8.js"></script></p>
<p><script async="" src="//jsfiddle.net/1004lucifer/3osdm24k/7/embed/result,js,html,css/dark/"></script></p>
<p><br /></p>
<h1 style="text-align: left;">TMS in Leaflet</h1><p> - Leaflet은 TMS서비스를 공식적으로 지원하지 않지만 tile 이름구조는 공통 L.TileLayer 이름체계와 유사하며 평범한 TMS서비스를 표시할 수 있다.</p><p> - 아래와 같은 엔드포인트가 있는 TMS서버를 고려해보자.<br /> - http://base_url/tms/1.0.0</p><p> - TMS 및 <a href="https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification" target="_blank">TMS 사양</a>에 대한 <a href="https://mapserver.org/mapcache/services.html" target="_blank">MapCache 도움말</a>을 확인하면 TMS의 지도 타일 URL이 다음과 같다.<br /> - http://base_url/tms/1.0.0/ {tileset} / {z} / {x} / {y} .png<br /></p><p> - L.TileLayer로 TMS서비스를 사용하려면, 사용가능한 tileset에 대해 기능문서를 체크하여 아래와 같은 base URL을 빌드할 수 있다. (우리의 경우 http://base_url/tms/1.0.0로 기본 엔드포인트가 같을때)<br /> - http://base_url/tms/1.0.0/{example_layer}@png/{z}/{x}/{y}.png</p><p> - 아래와 같이 레이어를 인스턴스화 할때 tms:true 옵션을 사용해라.</p>
<p><script src="https://gist.github.com/1004lucifer/0e8274a30b418f271f29e7a72fd6c805.js"></script></p>
<p><br /></p>
<p> - Leaflet 1.0의 새로운 기능은 tms:true 옵션 대신 URL에 {-y}를 사용할 수 있다.</p>
<p><script src="https://gist.github.com/1004lucifer/83e5e7250d3f53ca3a59b8b790b2ec4c.js"></script></p>
<p><br /></p>
<p> - (Leaflet 0.7에서) tms:true 옵션이나 (Leaflet 1.0에서) {-y}는 일반적인 L.TileLayer 좌표 원점이 왼쪽 상단 모서리에 있으므로 Y좌표가 내려가기 때문에 필요한 옵션과 기능이다.<br /> - TMS에서 좌표의 원점은 왼쪽 하단 모서리가 되어 Y좌표가 위로 올라가게 된다.</p><p> - Y좌표와 tilesets의 발견의 차이 외에도 TMS서비스는 L.TileLayer가 기대하는 방법으로 정확하게 tile을 제공한다.</p>
<p><br /></p><p>참조: https://leafletjs.com/examples/wms/wms.html</p><p><br /></p>1004luciferhttp://www.blogger.com/profile/00698622272458311849noreply@blogger.com0