'컴퓨터' 카테고리의 글 목록 :: 테크니션
반응형

요즘은 퍼포먼스가 중요한 네이티브 앱보다는 하나의 개발로 여러 OS를 커버하는 웹앱 개발이 많이 이루어지고 있다

두 OS의 방식을 다 커버하다 보니 어떤 기능은 하나의 OS에서 안되는 경우가 있다

iOS 에서는 앱에서 다른 링크로 이동시 새창을 못띄운다

하지만 안드로이드는 가능하다

이 충돌을 해결하려면 iOS에서 새 창을 띄우는게 아니라 링크 이동으로 바꿔줘야 한다

<a href="javascript:common.openBrowser('https://www.OOOO.co.kr');" class="txc_blue">
    OOOOO  OO
</a>

--->

<a href=" https://www.OOOO.co.kr' " class="btn btn-blue btn-lg radius">
    <span class="text"> OOOOO  OO </span>
</a>

버튼의 구현 방식을 변경하는 것은, 기존에 JavaScript 함수를 호출하여 새 창에서 URL을 여는 방식에서, 직접적으로 URL로 이동하도록 변경하는 것을 의미합니다.

이 변경을 통해 사용자가  버튼을 클릭하면, JavaScript 함수를 호출하는 대신 직접 URL로 리다이렉트되어 페이지가 이동하게 됩니다. 이 방식은 사용자가 팝업 차단기를 사용하고 있지 않거나, 브라우저에서 자동으로 팝업을 차단하는 기능이 활성화되어 있지 않은 경우에 더욱 효과적일 수 있습니다.

이와 같이 변경하면, 사용자 경험을 단순화하고, 링크에 대한 직접적인 접근을 제공하게 됩니다. 이를 통해 사용자의 브라우저 환경에 따라 발생할 수 있는 문제를 최소화할 수 있습니다.

 
 
반응형
반응형

웹 서비스 배포를 위한 WAR 파일을 수정하려면 다시 개발환경으로 넘겨야 한다

하지만 이 파일은 컴파일 된 파일이어서 이클립스로 Import 하려면 몇가지 프로세스가 필요하다

1. Eclipse IDE for Enterprise Java Developers 다운로드

  1. Eclipse 다운로드 페이지로 이동합니다.
  2. "Eclipse IDE for Enterprise Java Developers"를 다운로드합니다.
  3. 다운로드한 파일을 실행하여 Eclipse를 설치합니다.
  4. 설치가 완료되면 Eclipse를 실행합니다.
  1. Eclipse IDE의 다른 버전을 설치해보는 것이 좋습니다. Eclipse IDE for Enterprise Java Developers 버전을 사용하면 웹 개발 도구가 포함되어 있습니다.

2. 자바 개발 도구 (JDK) 설치 

  1. Oracle JDK 다운로드 페이지에서 최신 버전의 JDK를 다운로드합니다.
  2. 다운로드한 파일을 실행하여 JDK를 설치합니다.
  3. 설치가 완료되면 환경 변수에 JAVA_HOME을 추가합니다:
    • Windows: 시스템 속성 -> 고급 시스템 설정 -> 환경 변수 -> 새로 만들기
      • 변수 이름: JAVA_HOME
      • 변수 값: `C:\Program Files\Java\jdk

3. Web Tools Platform (WTP) 설치

 

  • 이클립스를 실행합니다.
  • "Help" 메뉴를 클릭하고 "Eclipse Marketplace"를 선택합니다.
  • "Eclipse Marketplace" 창이 열리면, 상단의 "Find" 입력란에 Web Tools Platform을 입력하고 "Go" 버튼을 클릭합니다.
  • "Web Tools Platform (WTP)"을 찾아 "Install" 버튼을 클릭합니다.
  • 설치 마법사의 지시에 따라 설치를 완료합니다. 설치 도중 필요한 플러그인도 함께 설치합니다.
  • 설치가 완료되면 이클립스를 재시작합니다.

4. Dynamic Web Project 생성

  1. Eclipse를 실행하고 워크스페이스를 선택합니다.
  2. "File" -> "New" -> "Other..."를 선택합니다.
  3. "Select a wizard" 창이 열리면, "Web" 폴더를 확장하고 "Dynamic Web Project"를 선택한 후 "Next" 버튼을 클릭합니다.
  4. 프로젝트 이름을 입력하고, "Target runtime"에서 "New Runtime..."을 선택하여 적절한 서버 런타임 (예: Apache Tomcat)을 추가합니다.
  5. "Finish"를 클릭하여 프로젝트를 생성합니다.

5. WAR 파일을 이클립스에 배포

  1. 이클립스에서 생성한 웹 프로젝트를 선택합니다.
  2. "File" -> "Import"를 선택합니다.
  3. "Web" -> "WAR file"을 선택하고 "Next"를 클릭합니다.
  4. "WAR file to import"에서 로컬에 있는 WAR 파일을 선택합니다.
  5. "Web project"에서 기존 웹 프로젝트를 선택하거나 새로 생성된 프로젝트를 선택합니다.
  6. "Finish"를 클릭하여 WAR 파일을 프로젝트에 배포합니다.

6. 서버 설정 및 실행

  1. "Servers" 뷰에서 "New" -> "Server"를 선택합니다.
  2. 사용할 서버 (예: Apache Tomcat)를 선택하고 "Next"를 클릭합니다.
  3. "Add and Remove..." 버튼을 클릭하여 프로젝트를 서버에 추가합니다.
  4. "Finish"를 클릭합니다.
  5. 서버를 마우스 오른쪽 버튼으로 클릭하고 "Start"를 선택하여 서버를 실행합니다.

 

이렇게 하면 실행은 될 수 있지만 WAR 파일의 자바(클래스) 파일의 수정이 안된다

class 파일을 확보하는 방법을 알아보자

단계 1: JD-GUI 설치

  1. JD-GUI를 다운로드하여 설치합니다.

단계 2: JAR 파일 디컴파일

  1. JD-GUI를 열고 WAR 파일을 엽니다. (WAR 파일은 zip 파일 형식이므로, JD-GUI로 열 수 있습니다.)
  2. WEB-INF/classes 디렉토리 내의 클래스 파일을 선택하여 디컴파일합니다.
  3. File -> Save All Sources를 선택하여 디컴파일된 소스 코드를 저장합니다.

단계 3: 디컴파일된 소스 코드를 이클립스 프로젝트에 추가

  1. 이클립스를 열고 새 프로젝트를 생성합니다.
  2. 디컴파일된 소스 코드를 프로젝트의 src 디렉토리에 복사합니다.
  3. 프로젝트를 빌드하고, 필요한 수정 작업을 진행합니다.

 

 

 

 

반응형
반응형

결제모듈 api 통신 오류가 나서 확인 해보니 이런 메세지가 있다

크롬이 80 버전부터 samesite 설정이 기본 none에서 lax로 변경되면서 결제 모듈 등에서 문제가 발생하며

이럴 때는 samesite 설정을 none으로 바꾸면된다

쿠키가 Lax여서 문제니 None로 바꾸라고

구글링해보니 자바, 자바스크립트 외 여러 방법으로 쿠키를 변경하는 법이 나온다

운영하는 프로그램이 자바스크립트와 자바로 만들어져있지만 이걸 apache tomcat을 통해 구동하면

자바, 자바스크립트가 아니라 apache tomcat 에서 변경해야 변경이 된다

apache-tomcat-x.y.z\conf\web.xml

<session-config>
    <session-timeout>30</session-timeout>
    <cookie-config>
            <http-only>true</http-only>
            <secure>true</secure>
    </cookie-config>
</session-config>

apache-tomcat-x.y.z\conf\server.xml

<Context>
     <CookieProcessor sameSiteCookies="none" />
</Context>

 

 

 

 

 

반응형
반응형

리눅스 서버를 운영하다 보면 서버에 용량이 모자라는 경우가 많이 생긴다

이 경우 파일 용량이 큰 것 먼저 삭제하면 여유공간이 생긴다

특정 용량 이상의 파일을 검색하는 명령어를 적어놓겠다

find / -type f -size +100M

반응형
반응형

JAVA , MAVEN 설치

설치경로 확보

윈도우 + R ---> sysdm.cpl 입력

 

아래와 같이 환경변수 설정

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★

CMD는 관리자모드로

이렇게 출력되면 톰캣 설치 후 WAR 파일을 읽을 준비가 된다

반응형
반응형

불가피한 이유로 서버를 재기동 해야 하는 경우가 있다

이후에 curl, dig , nslookup 등 통신이 안되는 경우가 있는데

이럴 경우 DNS 서버 설정을 한번 봐야한다

1. resolv.conf 파일 편집 (전통적인 방법):

/etc/resolv.conf 파일은 리눅스 시스템에서 DNS 설정을 관리하는 데 사용됩니다. 다음은 이 파일을 편집하는 예시입니다.

sudo nano /etc/resolv.conf

파일을 열면 다음과 같은 내용이 있을 것입니다

nameserver 8.8.8.8
nameserver 8.8.4.4

이때 nameserver 뒤에 원하는 DNS 서버의 IP 주소를 추가하거나 변경합니다.

 

A클래스가 다를 경우 통신이 안되는 경우가 생깁니다

 

수정이 완료되면 저장하고 나갑니다.

 

nameserver ip는 별도로 확인이 필요합니다

 

 

2. systemd-resolved 사용 (systemd 기반 시스템):

systemd 기반의 리눅스 시스템에서는 systemd-resolved 서비스를 사용하여 DNS 설정을 관리합니다.

그러면 텍스트 편집기가 열리는데, 여기에 다음과 같은 내용을 추가하고 원하는 DNS 서버 주소를 설정합니다

[Resolve]
DNS=8.8.8.8

저장한 후 systemd-resolved 서비스를 재시작합니다.

sudo systemctl restart systemd-resolved

3. NetworkManager 사용:

많은 리눅스 배포판에서는 NetworkManager를 사용하여 네트워크 설정을 관리합니다.

nmcli connection modify "Wired Connection 1" ipv4.dns "8.8.8.8 8.8.4.4"

위 명령에서 "Wired Connection 1"은 네트워크 연결의 이름이며, 필요에 따라 수정하세요.

4. DHCP Client 설정 변경:

시스템이 DHCP를 통해 IP 주소 및 DNS 정보를 받는 경우, DHCP 클라이언트 설정을 변경하여 특정 DNS 서버를 사용할 수 있습니다.

/etc/dhcp/dhclient.conf 파일을 열고 다음과 같이 설정합니다:

supersede domain-name-servers 8.8.8.8, 8.8.4.4;

수정이 완료되면 DHCP 클라이언트를 재시작합니다.

sudo systemctl restart dhclient

모든 변경 사항을 적용한 후에는 DNS 설정이 변경되었는지 확인하기 위해 nslookup 또는 dig 같은 도구를 사용하여 테스트할 수 있습니다.

 
 
 
반응형
반응형

텍스트에서 찾기 및 바꾸기:

  • 편집하려는 셀을 선택한 후 "홈" 탭에서 "찾기 및 바꾸기"를 클릭합니다.
  • "찾기" 대화상자에서 Ctrl + J를 눌러 줄바꿈 문자를 입력합니다.
  • "바꾸기" 상자에 아무 것도 입력하지 않고 "모두 바꾸기"를 클릭합니다

반응형
반응형

우리나라 주소는 법정동과 행정동명 차이로 

주소에 나와있는 동과 동사무소가 다른 경우가 있다

이 경우에는

https://www.juso.go.kr/openIndexPage.do

여기에 들어가서 찾을 수 있다

답십리 래미안 관련 업무는 답십리1동에서 보는 것을 알 수 있다

매월동은 서창동으로 가야된다

주소 하나면 바로 검색을 하면 되는데

여러개를 일일히 치는 것 보다

파이썬에서 엑셀을 읽어서 검색 후 해당 관할동사무소를 다시 엑셀에 저장하는 코드로 

돌리는게 더 편할 것 같다

import time
from selenium import webdriver
import pandas as pd
from selenium.webdriver.common.by import By
import openpyxl


file_path = r'C:\Users\Administrator\Downloads\all_personn.xlsx'
sheet_name = 'Sheet1'

df = pd.read_excel(file_path, sheet_name=sheet_name)

data_list_juso = df["지번주소"].tolist()
driver= webdriver.Chrome()
dongsamuso=[]
for i in range(0,len(data_list_juso)):
    url = "https://www.juso.go.kr/support/AddressMainSearch.do?searchKeyword=&dsgubuntext=&dscity1text=&dscounty1text=&dsemd1text=&dsri1text=&dssan1text=&dsrd_nm1text=&aotYn=N"
    driver.get(url)
    time.sleep(0.1)
    driver.maximize_window()
    time.sleep(0.22)
    ddd = ' '.join(data_list_juso[i].split()[:3])
    #ddd = data_list_juso[i]
    # input_xpath = r'/html/body/div[4]/main/div/section[1]/div[1]/form/fieldset/div/div[1]/input[1]'
    input_xpath = r'/html/body/div[2]/div/main/div[1]/form/fieldset/div[1]/div[1]/div/input[1]'
    input_element = driver.find_element(By.XPATH, input_xpath)
    input_element.send_keys(ddd)
    time.sleep(0.2)
    button_xpath = r'/html/body/div[2]/div/main/div[1]/form/fieldset/div[1]/button'
    button_element = driver.find_element(By.XPATH, button_xpath)
    button_element.click()

    time.sleep(2)

    nbutton_xpath = r'#list1 > div.addrWrap > div.addAddr > a'
    nbutton_element = driver.find_element(By.CSS_SELECTOR, nbutton_xpath)
    nbutton_element.click()
    paegi = r'#list1'
    meeee = driver.find_element(By.CSS_SELECTOR, paegi).text.split('\n')
    k = list(meeee[1])[-1]
    if k == '지':
        anbutton_xpath = r' # list2 > div.addrWrap > div.addAddr > a'
        anbutton_element = driver.find_element(By.CSS_SELECTOR, nbutton_xpath)
        anbutton_element.click()

        text_xpath = r'#engAddr_2 > ul > li:nth-child(3) > span:nth-child(2)'
        text_element = driver.find_element(By.CSS_SELECTOR, text_xpath)
        text_value = text_element.text
        words = text_value.split()
        second_last_word = str(words[:-1])

    else:
        text_xpath = r'#engAddr_1 > ul > li:nth-child(3) > span:nth-child(2)'
        text_element = driver.find_element(By.CSS_SELECTOR, text_xpath)
        text_value = text_element.text

    words = text_value.split()
    second_last_word = str(words[:-1])
    dongsamuso.append(second_last_word)
    workbook = openpyxl.load_workbook(file_path)
    sheet_name = 'Sheet1'
    sheet = workbook[sheet_name]
    sheee_name = 'H'+str(i+2)
    sheet[sheee_name] = second_last_word
    workbook.save(file_path)

가끔 폐지라고 나오는 경우가 있는데 이에 대한 예외처리까지 담았다

반응형
반응형

리눅스 우분투를 gui로 볼 수 있는 xrdp 라는게 있다
이미 설치되어 있는데 가끔 안될때가 있다
그럴때는 재시작을 해주면 된다
ps -ef | grep  'xrdp'
pid 를 확인한다
service xrdp status
Active : active(running) 이라고 나오더라도 정상 작동하지 않는 경우가 있다
kill -9 pid (ex 29506)
모든 프로세스를. 강제 종료 후
service xrdp start
시작 후 로그인

반응형
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/43162

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

DFS로 작성하여 스택이 다 빠지면 1씩 반환하여 그 수를 세도록 만들었다

def solution(n, computers):
    answer = 0
    stakk = []
    visited = []

    def serch(computers):
        while stakk:
            visited.append(stakk.pop(-1))
            start = visited[-1]
            for i in range(n):
                if computers[start][i] == 1 and i not in visited and i not in stakk:
                    stakk.append(i)
                    computers[start][i] = 0
                    computers[i][start] = 0
            for i in visited:
                computers[i][i] = 0
        return 1

    for i in range(n):
        for j in range(n):
            if computers[i][j] == 1:
                stakk.append(i)
                answer += serch(computers)

    return answer

이렇게 하면 테스트케이스는 통과하는데 문제는 통과를 못한다

그래서 수정을 했다


def solution(n, computers):
    answer = 0
    stack = []
    visited = set()

    def search(computers):
        while stack:
            start = stack.pop()
            visited.add(start)
            for i in range(n):
                if computers[start][i] == 1 and i not in visited:
                    stack.append(i)
                    computers[start][i] = 0
                    computers[i][start] = 0
            computers[start][start] = 0
        return 1

    for i in range(n):
        for j in range(n):
            if computers[i][j] == 1 and i not in visited:
                stack.append(i)
                answer += search(computers)

    return answer
  1. stakk을 stack으로 수정한 이유는 변수명을 명확하고 의미있게 하기 위해서입니다. stack은 일반적으로 스택 자료구조를 의미하기 때문에 보다 이해하기 쉽고 일반적인 표현입니다.
  2. visited를 set()으로 초기화한 이유는 방문한 노드를 중복해서 방문하지 않도록 하기 위해서입니다. set()은 원소의 중복을 허용하지 않는 자료구조이므로 중복 방문을 방지할 수 있습니다.
  3. serch 함수 내부에서 visited를 set()으로 변경한 이유는 방문한 노드를 빠르게 확인하기 위해서입니다. set()은 원소의 포함 여부를 빠르게 확인할 수 있으므로 visited에서의 탐색 시간을 줄일 수 있습니다. 또한, start를 stack.pop()으로 수정하여 스택의 마지막 요소를 가져오도록 하여 노드를 방문하게 되었습니다.
  4. visited를 set()으로 변경하고, answer를 search 함수 호출 결과로 갱신한 이유는 방문한 노드의 개수를 적절히 카운팅하기 위해서입니다. visited는 중복 방문이 허용되지 않으므로 visited의 길이가 곧 방문한 노드의 개수가 됩니다. search 함수는 방문한 노드의 개수를 반환하므로 이를 answer에 누적하여 최종 결과를 계산할 수 있습니다.
반응형

+ Recent posts