반응형

공모주 청약 경쟁률 과거내역 및 일정

반응형
반응형

출처

https://stackoverflow.com/questions/20180543/how-to-check-the-version-of-python-modules

파이썬 모듈의 버전 확인하는 방법

저는 다음처럼 파이썬 모듈을 설치하였습니다. construct, statlibsetuptools 입니다.

# 다음처럼 다운로드 가능하기 위한 setuptools 설치
sudo apt-get install python-setuptools

# 가벼운 통계 도구를 위한 statlib 설치
sudo easy_install statlib

# 바이너리 데이터를 packing/unpacking하기 위한 construct 설치
sudo easy_install construct

저는 그들의 버전을 검사하기 위해 (프로그래밍으로) 가능한지 알고 싶습니다. 명령어로부터 제가 실행할 수 있는 python --version과 같은 것이 있을까요?


31 개의 답변 중 1 개의 답변

저는 easy install 대신에 pip를 사용하는 것을 제안합니다. pip로 당신은 모든 설치된 패키지를 알 수 있고 버전은 다음 명령으로 알 수 있습니다.

pip freeze

리눅스 시스템 대부분에서, 당신은 관심있는 특정 패키지를 행 단위로 찾기 위해 grep으로 (또는 윈도우즈에서는 findstr으로) 파이프를 사용할 수 있습니다.

Linux:

pip freeze | grep lxml

lxml==2.3

Windows:

pip freeze | findstr lxml

lxml==2.3

개별 모듈에서, 당신은 __version__ 속성 을 시도할 수 있습니다. 하지만, 그것이 없는 모듈도 있습니다.

python -c "import requests; print(requests.__version__)"
2.14.2

python -c "import lxml; print(lxml.__version__)"

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'module' object has no attribute 'version'

마지막으로 질문의 명령에 sudo 접두사가 붙기 때문에 전역 Python 환경에 설치하는 것으로 보입니다. 예를 들어 virtualenvwrapper와 같은 Python 가상 환경 관리자를 살펴보는 것이 좋습니다.

반응형
반응형

출처 : https://huichen-cs.github.io/course/CISC7334X/20FA/lecture/pymcast/

Python에서 멀티캐스트 프로그래밍

차례

  • 소개
  • IPv4 멀티캐스트 주소
  • UDP 데이터그램 멀티캐스트
  • 프로그램 예시와 실험 환경
    • 전송 프로그램 (mcastsend.py)
    • 수신 프로그램 (mcastrecv.py)
    • 시연
      • 가정
      • 시연 실행하기
      • 출력
    • 연습과 탐색

소개

통신 패턴을 설명하는 몇 가지 용어가 있습니다. 이러한 용어는 모두 "-cast"로 끝나고 유니캐스트, 브로드캐스트, 멀티캐스트, 애니캐스트 및 지오캐스트를 포함합니다. 여기서는 단일 패킷의 복사본을 가능한 모든 대상의 선택된 하위 집합으로 전달하는 기술인 멀티캐스트에 특히 관심이 있습니다. TCP/IP는 멀티캐스트를 지원합니다. 여기서 우리의 목표는 TCP/IP 프로토콜 스택에서 멀티캐스트의 개념을 설명하기 위해 기초적인 Python 프로그램을 작성하는 것입니다.

IPv4 멀티캐스트 주소

IP 주소에는 몇 가지 범주가 있습니다. 멀티캐스트 주소는 범주입니다. 224.0.0.0/4 범위의 모든 IPv4 주소는 그룹, 즉 우리가 패킷을 전달할 모든 가능한 호스트의 선택된 하위 집합을 정의하는 멀티캐스트 주소입니다. 이 "224.0.0.0/4"와 같은 IP 주소 범위는 소위 CIDR 표기법에 있습니다. 이 특별한 경우 기본적으로 최상위 4비트(또는 4비트 접두사)가 224.0.0.0과 동일한 모든 IPv4 주소가 이 범위에 있음을 의미합니다. (수학적 경사?의 경우 224.0.0.0/4는 {a|∀a,a∧f0000000h ≡ f0000000h} 다음의 IPv4 주소 집합을 정의합니다.

UDP 데이터그램 멀티캐스트

TCP/IP 프로토콜 스택에서 UDP는 데이터그램 멀티캐스트 서비스를 실현합니다.

프로그램 예시와 실험 환경

여기 UDP 데이터그램 멀티캐스트 예시는 두개의 파이썬 프로그램으로 구성됩니다. mcastsend.py는 전송 프로그램이며 mcastrecv.py는 수신 프로그램 입니다. 우리는 4개의 가상 머신을 사용하여 멀티캐스트 개념을 시연하기 위해 프로그램을 실행합니다.

전송 프로그램 (mcastsend.py)

import socket
import sys

def help_and_exit(prog):
    print('Usage: ' + prog + ' host_ip mcast_group_ip mcast_port_num message',
        file=sys.stderr)
    sys.exit(1)

def mc_send(hostip, mcgrpip, mcport, msgbuf):
    # UDP 소켓을 생성한다
    sender = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM, \
            proto=socket.IPPROTO_UDP, fileno=None)
    # 멀티캐스트 (멀티캐스트 그룹 IP 주소, 전송할 포트 번호) 짝인 엔드 포인트를 정의한다.
    mcgrp = (mcgrpip, mcport)

    # 멀티캐스트 데이터그램이 얼마나 많은 홉(hop)을 여행할 수 있는지 정의한다.
    # IP_MULTICAST_TTL를 따로 정의하지 않는다면 기본 값은 1이다. 
    sender.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 1)

    # 멀티캐스트 데이터그램 전송을 담당하는 네트워크 인터페이스(NIC)를 정의합니다.
    # 그렇지 않으면 소켓은 기본 인터페이스를 사용합니다. (루프백이 0이면 ifindex = 1)
    # 데이터그램을 여러 NIC로 전송하려면 각 NIC에 대한 소켓을 만들어야 합니다.
    sender.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, \
         socket.inet_aton(hostip))

    # 버퍼에서 데이터그램을 전송합니다
    sender.sendto(msgbuf, mcgrp)

    # 소켓 자원을 해제합니다 
    sender.close()


def main(argv):
    if len(argv) < 5:
        help_and_exit(argv[0])

    hostipaddr = argv[1]
    mcgrpipaddr = argv[2]
    mcport = int(argv[3])
    msg = argv[4]

    mc_send(hostipaddr, mcgrpipaddr, mcport, msg.encode())

if __name__=='__main__':
    main(sys.argv)

수신 프로그램 (mcastrecv.py)

import sys
import socket
import struct


def help_and_exit(prog):
    print('Usage: ' + prog + ' from_nic_by_host_ip mcast_group_ip mcast_port')
    sys.exit(1)

def mc_recv(fromnicip, mcgrpip, mcport):
    bufsize = 1024

    # UDP 소켓을 생성한다
    receiver = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM, \
            proto=socket.IPPROTO_UDP, fileno=None)

    # 멀티캐스트 (멀티캐스트 그룹 IP 주소, 전송할 포트 번호) 짝인 엔드 포인트로부터 
    # 전송된 데이터그램을 수신하기 위한 소켓을 설정한다.
    # 이 소켓은 전송 프로그램의 짝과 매칭 되어야 한다.
    bindaddr = (mcgrpip, mcport)
    receiver.bind(bindaddr)

    # 소켓을 의도한 멀티캐스트 그룹에 조인합니다. 그 의미는 두 가지입니다.
    # 멀티캐스트 IP 주소에 의해 식별되는 의도된 멀티캐스트 그룹을 지정합니다.
    # 또한 어떤 네트워크 인터페이스에서 (NIC) 소켓은 의도한 멀티캐스트 그룹에 대한 데이터그램을 수신합니다.
    # socket.INADDR_ANY는 시스템의 인터페이스(ifindex = 루프백 인터페이스가 있는 경우 1)에서 
    # 기본 네트워크를 의미한다는 점에 유의하는 것이 중요합니다.
    # 여러 NIC에서 멀티캐스트 데이터그램을 수신하려면
    # 각 NIC용 소켓을 생성해야 합니다. 또한 할당된 IP 주소로 NIC를 식별합니다.
    if fromnicip == '0.0.0.0':
        mreq = struct.pack("=4sl", socket.inet_aton(mcgrpip), socket.INADDR_ANY)
    else:
        mreq = struct.pack("=4s4s", \
            socket.inet_aton(mcgrpip), socket.inet_aton(fromnicip))
    receiver.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

    # 메세지를 수신한다
    buf, senderaddr = receiver.recvfrom(1024)
    msg = buf.decode()

        # 자원을 해제한다
        receiver.close()

    return msg

def main(argv):
    if len(argv) < 4:
        help_and_exit(argv[0])

    fromnicip = argv[1] 
    mcgrpip = argv[2]
    mcport = int(argv[3])


    msg = mc_recv(fromnicip, mcgrpip, mcport)
    print(msg)

if __name__=='__main__':
    main(sys.argv)

시연

가정

편의를 위해 4개의 리눅스 가상 머신을 다음처럼 이름을 만들고 다음 표에 주어진 IPv4 주소가 있다고 가정합니다.

호스트 이름 IPv4 주소
eastny 192.168.56.1
midwood 192.168.56.3
flatbush 192.168.56.4
bushwick 192.168.56.5

두 개의 멀티캐스트 그룹이 있다고 가정합니다.

IPv4 멀티캐스트 그룹 1 IPv4 멀티캐스트 그룹 2
224.1.1.5 234.3.2.1

전송자는 엔드 포인트를 식별하고 UDP를 사용하기로 결정하였고 4개의 호스트로 다음처럼 두 개의 프로그램을 배포합니다.

호스트 프로그램
midwood mccastsend.py
eastny mccastrecv.py
flatbush mccastrecv.py
bushwick mccastrecv.py

시연 실행하기

우리는 다음처럼 프로그램을 실행합니다.

  1. 첫째, 우리는 다음처럼 eastnyflatbush에서 mcastrecv.py를 실행합니다.
brooklyn@flatbush:~$ python mcastrecv.py 192.168.56.104 224.1.1.5 50001
brooklyn@eastny:~$ python mcastrecv.py 192.168.56.101 224.1.1.5 50001
  1. 우리는 bushwick에서 mcastrecv.pyscapy3를 두 개의 터미널에서 둘 다 실행합니다.
brooklyn@bushwick:~$ python mcastrecv.py 192.168.56.105 234.3.2.1 50001
brooklyn@bushwick:~$ sudo scapy3
>>> packets = sniff(prn=lambda p: p.summary(), filter='udp port 50001')
  1. 마지막으로 우리는 mcastsend.pymidwood에서 실행합니다.
brooklyn@midwood:~$ python mcastsend.py 192.168.56.103 224.1.1.5 50001 "Hello, World!"

출력

출력은 다음과 같습니다.

flatbush에서 우리는 다음을 관찰합니다.

brooklyn@flatbush:~$ python mcastrecv.py 192.168.56.104 224.1.1.5 50001
Hello, World!
brooklyn@flatbush:~$

eastny에서 우리는 다음도 관찰합니다.

brooklyn@eastny:~$ python mcastrecv.py 192.168.56.101 224.1.1.5 50001
Hello, World!
brooklyn@eastny:~$

하지만, bushwick에서 mcastrecv.py는 IPv4 주소 192.168.56.101에 의해 식별되는 네트워크 인터페이스로부터 멀티캐스트 그룹 234.3.2.1로 데이터그램을 받지 못했기에 데이터를 아직 기다립니다. (글쎄, 우리는 이 데모에서 우리는 절대 그 그룹에 데이터그램을 보내지 않는다는 점에 주의해야 합니다.)

`brooklyn@bushwick:~$ python mcastrecv.py 192.168.56.105 234.3.2.1 50001

하지만, scrapy3midwood에서 mcastsend.py에 의해 보내진 패킷을 캡쳐했습니다.

>>> packets = sniff(prn=lambda p: p.summary(), filter='udp port 50001')
Ether / IP / UDP 192.168.56.103:52582 > 224.1.1.5:50001 / Raw / Padding

^C>>> hexdump(packets[0])
0000  01005E010105080027A133B408004500 ..^.....'.3...E.
0010  00290DC74000011191E7C0A83867E001 .)..@.......8g..
0020  0105CD66C351001553C948656C6C6F2C ...f.Q..S.Hello,
0030  20576F726C64210000000000          World!.....
>>>

연습과 탐색

다음 시나리오를 고려해 보겠습니다. 우리는 모든 네트워크 인터페이스로부터 멀티캐스트 데이터그램을 수신하기를 원합니다. socket.INADDR_ANY는 모든 주소를 나타뱀을 관찰할 수 있습니다. 우리는 mcastrecv.py의 간단한 수정으로 이 목표를 달성할 수 있다고 가정합다. 수정은

if fromnicip == '0.0.0.0':
        mreq = struct.pack("=4sl", socket.inet_aton(mcgrpip), socket.INADDR_ANY)
else:
        mreq = struct.pack("=4s4s", \
                socket.inet_aton(mcgrpip), socket.inet_aton(fromnicip))
receiver.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

에서 다음으로 대체합니다.

mreq = struct.pack("=4sl", socket.inet_aton(mcgrpip), socket.INADDR_ANY)

우리는 eastny 또는 flatbuash에서 다음처럼 수정된 mcastrecv.py를 실행합니다.

brooklyn@flatbush:~$ python mcastrecv.py 192.168.56.104 224.1.1.5 50001

우리는 midwood에서 mcastsend.py를 실행합니다.

brooklyn@midwood:~$ python mcastsend.py 192.168.56.103 224.1.1.5 50001 "Hello, World!"

우리는 mcastsend가 완료할 동안 mcastrecv.py가 데이터를 아직 기다리고 있음을 관찰할 수 있습니다. scapy3를 사용하여 패킷을 캡처하고 캡처된 패킷을 사용하여 현상을 설명하는 실험을 설계합니다.

관련글

반응형
반응형

출처 : https://www.educba.com/zip-command-in-linux/

Linux에서 Zip 명령 소개

ZIP은 Unix에서 파일 압축 기술 패키징 유틸리티 입니다. 파일은 확장자 .zip으로 하나의 파일에 저장됩니다. Linux에서 Zip 명령은 MSDOS, OS/2, Window NT, Minix, 매킨토시 등과 같은 거의 모든 운영 체제에 의해 주로 지원됩니다. 압축과 tar는 명령어로 사용되며 PKZIP(MSDOS 시스템을 위한 Phil Katz의 ZIP)와 호환됩니다.

문법:

zip [몇가지 옵션]  zip파일 파일디렉터리/파일목록

zip파일은 새로운 혹은 이미 존재하는 zip 압축이며 파일디렉터리/파일목록은 와일드카드를 포함하는 경로입니다. zip 압축과 같은 이름이 발견되면 그것을 갱신할 것입니다.

예시: 만약 폴더/파일_1과 폴더/파일_2가 folder.zip에 포함되어 있고 디렉터리 폴더는 폴더/파일_1과 폴더/파일_3을 포함 합니다. 그렇다면 명령을 실행하기 전에 folder.zip은 다음 파일이 있습니다.

  • 폴더/파일_1
  • 폴더/파일_2

디렉터리 폴더는 다음 파일이 있습니다.

  • 파일_1
  • 파일_3

명령을 실행하면 folder.zip은 다음 파일을 가지고 있습니다.

  • 폴더/파일_1
  • 폴더/파일_2
  • 폴더/파일_3

폴더/파일_1은 교체되며 폴더/파일_3은 새로운 파일입니다. 그래서, folder.zip은 폴더/파일_1, 폴더/파일_2, 폴더/파일_3을 포함하며 폴더/파일_2는 이전과 변화되지 않습니다.

Linux에서 Zip 파일 압축풀기 문법

명령은 Unix 시스템에서 압축으로부터 파일의 압축을 풉니다. 아무런 옵션이 없을 때 특정 ZIP 압축파일로부터 현재 작업 디렉터리(와 그 안에 하위 디렉터리)로 그것의 압축을 풉니다.

문법:

$unzip fold.zip

Linux에서 Zip 명령 옵션

이제 아래의 Zip 명령 옵션에 집중해 봅시다.

1) -u 옵션

파일을 갱신합니다. 이는 압축에서 기존 엔트리도 갱신하며 이미 있는 버전보다 더 많이 수정된 경우에만 갱신됩니다.

명령:

$zip -u 파일명.zip 파일.txt

현재 디렉터리에 아래와 같은 파일이 있다 가정합니다.

  • 파일1.txt
  • 파일2.txt
  • 파일3.txt
  • 파일4.txt

문법:

$zip –u 파일명.zip 파일5.txt

파일명.zip으로부터 파일5.txt를 갱신한 후, unzip 명령으로 파일을 복구할 것입니다.

명령:

$unzip file_name.zip
$ls command

출력:

  • 파일1.txt
  • 파일2.txt
  • 파일3.txt
  • 파일4.txt
  • 파일5.txt

파일5.txt는 zip로 갱신되었습니다.

2) -d 옵션

zip 압축으로부터 파일을 삭제합니다. 이 옵션은 생성된 파일을 삭제합니다. 현재 디렉터리에 다음 파일이 있습니다.

문법:

$zip –u 파일명.zip 파일.txt

명령:

$zip –d file_name.zip file5.txt

파일명.zip으로부터 파일5.txt를 삭제한 후 unzip 명령으로 파일을 복구할 것입니다.

명령:

$unzip file_name.zip
$ls command

출력:

  • 파일1.txt
  • 파일2.txt
  • 파일3.txt
  • 파일4.txt
  • 파일5.txt

파일5.txt는 zip 파일로부터 삭제되었습니다.

3) -m 옵션

zip 압축 후에 original/main 파일을 삭제할 것입니다. zip을 만들고 원래 파일/폴더를 삭제함으로써 파일을 옮길 것입니다.

디렉터리가 파일을 삭제한 후 비어 있으면 해당 디렉토리도 함께 삭제됩니다. zip이 오류 없이 압축을 생성할 때까지 삭제가 완료되지 않습니다. 따라서 이것은 디스크 공간을 유지하는 데 유용하지만 모든 입력 파일을 제거하는 동안 궁극적으로 안전하지 않습니다.

문법:

$zip –m 파일명.zip 파일.txt

아래처럼 현재 디렉터리에 다음 파일이 있다고 가정합니다.

파일_1.txt,파일_2.txt,파일_3.txt,파일_4.txt

명령:

$zip -m 파일명.zip *.txt

터미널의 이 명령을 실행한 후에 결과는 다음과 같습니다.

명령:

$ls command

출력:

  • 파일명.zip
  • // txt(확장자)인 다른 파일은 발견되지 않습니다.

4) -x 옵션

zip을 만들 때 파일을 제외합니다. 현재 디렉토리에 있는 모든 파일을 압축하고 필요하지 않은 몇 개의 파일을 제외하려고 한다고 가정해 보겠습니다. 따라서 -x 옵션을 사용하여 필요하지 않은 이러한 파일을 제외할 수 있습니다.

문법:

$zip –m 파일명.zip 제외될파일.txt

아래처럼 현재 디렉터리에 다음 파일이 있다고 가정합니다.

파일_1.txt,파일_2.txt,파일_3.txt,파일_4.txt

명령:

$zip –x 파일명.zip 파일_3.txt

이 명령은 파일_3.txt 제외하고 모든 파일을 압축할 것입니다.

명령:

$ls command

출력:

  • 파일명.zip // 압축된 파일
  • 파일_3.txt // 압축하는 동안 제외된 파일

5) -r 옵션

재귀적으로 zip을 그 안에 폴더까지 만들 것입니다.

문법:

$zip –r 파일명.zip 디렉터리명

아래처럼 현재 디렉터리 (doc)에 다음 파일이 있다고 가정합니다.

  • a.pdf
  • b.pdf
  • c.pdf

명령:

$zip –r filedir.zip doc

이 명령은 파일_3.txt 제외하고 모든 파일을 압축할 것입니다.

출력:

  • adding: doc/ // 디렉터리 압축
  • adding: doc/a.pdf // 첫 번째 파일 압축
  • adding: doc/b.pdf // 두 번째 파일 압축
  • adding: doc/c.pdf // 번째 파일 압축

6) -v 옵션

자세히(Verbose) 모드 옵션을 사용하여 우리는 분석 정보를 출력할 것입니다. 이 옵션은 압축 도중에 진행상황 표시를 보여주며 zip 구조에 관한 자세한 정보를 요청합니다.

문법:

$zip –v 파일명.zip 파일.txt

아래처럼 현재 디렉터리에 다음 파일이 있다고 가정합니다.

파일_1.txt,파일_2.txt,파일_3.txt,파일_4.txt

명령:

$zip -v file1.zip *.txt

출력:

  • adding: file_1.txt (in=0) (out=0) (stored 0%)

  • adding: file_2.txt (in=0) (out=0) (stored 0%)

  • adding: file_3.txt (in=0) (out=0) (stored 0%)

  • adding: file_4.txt (in=0) (out=0) (stored 0%)

  • total bytes=0, compressed=0 -> 0% savings

Linux의 Zip 명령 사용

Linux의 Zip 명령 사용은 다음과 같습니다.

  • ZIP은 적은 대역폭이나 인터넷 속도가 느릴 때 완벽한 기술이며 당신은 파일 여러개를 전송할 수 있습니다. 그리고 이제 이 명령을 사용하여 당신은 매우 효과적인 방법으로 파일을 압축하고 전송할 수 있습니다.
  • zip 프로그램은 하나 그 이상의 압축된 파일을 이름, 경로, 날짜, 마지막 수정시간, 보호, 파일 무결성을 검증하기 위한 체크 정보와 함께 하나의 zip으로 압축합니다. 전체 디렉터리 구조는 명령 하나로 하나의 zip 압축될 수 있습니다.
  • 압축률이 2:1에서 3:1로 텍스트 파일이 일반적이기 때문에 디플레이션 방식을 사용하거나 압축하지 않고 파일을 저장합니다. 그러면 압축할 각 파일에 가장 적합한 것이 자동으로 선택됩니다.
  • 파일 보관에 매우 편리합니다. 사용하지 않는 파일이나 디렉터리를 압축하여 짧은 시간 동안 배포 및 디스크 공간 절약을 위해 파일 세트를 패키징합니다.

결론

이제 우리는 압축풀기(unzip)와 압축하기(zip)의 개념을 이해하였고 다른 옵션을 사용하여 압축된 파일을 조작하는 방법을 알았습니다. ZIP은 파일 여러개를 전송하기 원하거나 낮은 대역폭이나 인터넷 속도가 느릴 때 완벽한 기술입니다. 이제 이 명령을 사용하여 당신은 zip으로 압축하여 매우 효율적인 방법으로 파일을 전송할 수 있습니다.

반응형
반응형

출처
https://serverfault.com/questions/7689/how-do-i-get-rid-of-sockets-in-fin-wait1-state

FIN_WAIT1 상태를 소켓에서 어떻게 제거하나요?

kill이 필요한 프로세스에 의해 차단된 포트가 있습니다. (충돌한 telnet 대몬). 프로세스가 성공적으로 종료되었지만 포트는 여전히 'FIN_WAIT1' 상태입니다. 그것은 나오지 않으며, 그 시간 초과는 '십년'으로 설정된 것 같습니다.

포트를 해제할 수 있는 유일한 방법은 전체 시스템을 재부팅하는 것인데, 이는 당연히 하고 싶지 않은 일입니다.

$ netstat -tulnap | grep FIN_WAIT1 
tcp        0  13937 10.0.0.153:4000         10.0.2.46:2572 

리부팅 없이 블록되지 않도록 포트를 처리하는 방법에 대해 아시는 분 있나요?


9개의 답변 중 1개의 답변

# tcp_max_orphans의 현재 값을 기록
original_value=$(cat /proc/sys/net/ipv4/tcp_max_orphans)

#tcp_max_orphans를 임시로 0 으로 설정
echo 0 > /proc/sys/net/ipv4/tcp_max_orphans

# /var/log/messages 확인
# 그것은 "kernel: TCP: too many of orphaned sockets"를 뱉어낼 것입니다.
# 접속이 없어지는 데 오래 걸리지 않을 것입니다. 

# 이전에 있던 tcp_max_orphans 의 값을 복구합니다.
echo $original_value > /proc/sys/net/ipv4/tcp_max_orphans

# 다음으로 검증합니다.
netstat -an|grep FIN_WAIT1
반응형
반응형

NH투자증권(QV)

NH투자증권(나무)

한국투자증권

대신증권

하나금융투자

키움증권

IBK투자증권

유안타증권

유진투자증권

참고자료

기타

  • 혹시 틀린 정보가 있으면 댓글 남겨주시면 확인하고 수정하겠습니다.
반응형

'금융' 카테고리의 다른 글

배당기준일 변경 회사 목록 - 지급일 버전  (2) 2024.01.29
배당기준일 변경 회사 목록  (2) 2023.12.18
홍콩거래소 - Parallel trading  (0) 2011.06.29
전량체결주문  (0) 2010.03.24
반응형

출처 : https://stackoverflow.com/questions/3125645/why-use-select-instead-of-sleep

왜 sleep() 대신에 select()를 사용하나요?

저는 iPhone 오디오에 대한 장을 살펴보고 있는데 이해할 수 없는 코드 섹션을 발견했습니다.

while (aqc.playPtr < aqc.sampleLen) 
{
    select(NULL, NULL, NULL, NULL, 1.0);
}

(전체 코드 샘플은 163-166페이지에 있습니다). 코드에 대해 내가 이해한 바에 따르면 오디오가 다른 스레드에서 처리되고 있고 while 루프는 오디오가 여전히 처리되는 동안 메인 스레드가 종료되는 것을 방지하기 위한 것입니다.

제가 이해할 수 없는 것은 왜 select()sleep() 대신에 사용되었는지 입니다.

내가 읽은 것에서 select()는 I/O의 변경 사항을 모니터링하는 데 사용되며 NULL을 전달해도 의미가 없습니다. sleep()을 사용하여 코드를 실행했으며 예상대로 작동합니다. (저수준 POSIX에 대한 나의 지식은 거의 존재하지 않습니다.)


6개의 답변 중 1 개의 답변

정확한 1초 미만 대기 허용을 선택하고 sleep 보다 이식성이 좋습니다. 대기하는 다른 방법이 있는데 이 질문을 참조하십시오.

그러나 select의 timeout 매개변수는 float가 아니라 struct timeval에 대한 포인터여야 합니다. 나는 당신이 보여주는 코드가 심지어 컴파일된다는 것에 놀랐습니다. More : 이 이상한 조건부 선택 다음에 무조건적인 sleep(1)이 뒤따릅니다. 무의미해 보입니다.

반응형
반응형

출처 : https://superuser.com/questions/98974/how-to-use-crontab-to-run-a-script-as-nobody

nobody로 스크립트 실행하기 위해 crontab 사용하는 방법

이는 CentOS 머신입니다. 저는 매일 특정 시간에 (최소 권한으로 사용자로써) 사용자 nobody로 스크립트를 실행하려 합니다. 여기에 nobody가 있습니다.

[root@CentOS % ~] grep "^nobody" /etc/passwd  
nobody:x:99:99:Nobody:/:/sbin/nologin  

루트의 crontab에서 제가 실행하려 한 것입니다.

환경변수 SUDO_USER=nobody로 설정하고
15 17 * * * sudo -u nobody /bin/bash /usr/local/bin/bashscript.sh
15 17 * * * su -c /usr/local/bin/bashscript.sh nobody

저는 모두 가능한 루트의 crontab에 엔트리를 유지하고 싶습니다. 나는 또한 해당 설정에 의존할 수 있는 다른 어떤 것도 깨뜨리고 싶지 않기 때문에 아무도 nobody의 계정을 속이지 않는 것을 선호합니다. 나는 권한이 없는 다른 계정을 만들고 그것이 문제가 되는 경우 실제 쉘을 제공하는 것에 반대하지 않습니다.

저도 약간 당혹스러웠던 점은 인정합니다. 도움이 되지 않는다는 점을 제외하고는 이것이 일상적인 문제라고 가정합니다.

5개의 답변

저는 crontab -e 또는 crontab -l 내용에서 당신이 작성했다고 가정합니다?

이것은 사용자 "루트"에 속한 crontab 파일이며 해당 파일은 (일반적으로 개인 작업을 예약하는 데 사용되는 파일) 명령을 실행할 사용자 지정을 지원하지 않습니다 .
시스템 전체의 crontab이고 추가 필드인 사용자 필드가 있는 /etc/crontab을 보십시오. /etc/crontab에 다음과 같은 줄을 추가해 보십시오.

15 17 * * * nobody /usr/local/bin/bashscript.sh
반응형
반응형

출처 : https://stackoverflow.com/questions/31166594/socket-python-recvfrom

소켓 파이썬 : recvfrom

저는 파이썬의 socket.recvfrom이 blocking 함수인지 알고 싶습니다. 그렇지 않다면 문서에서 답변을 찾을 수 없었습니다. 수신 받은 게 없다면 무엇이 리턴되나요? 빈 문자열 '' 인가요? 다른 경우, 사실 blocking이라면 이를 unblocking 함수로 어떻게 변경할 수 있나요? 저는 settimeout에 관해 들었지만 이것이 올바른 해결책인지는 모르겠습니다.

1개의 답변

기본적으로 그것은 blocking입니다. socket.setblocking(0) 또는 (같은 의미인) socket.settimeout(0)을 통해 non-blocking으로 바뀔 수 있습니다. 이 경우 받은 패킷이 없다면 socket.error 예외가 발생합니다.
다음 문서를 확인하세요.

https://docs.python.org/ko/3/library/socket.html#socket.socket.setblocking

반응형
반응형

출처 : https://stackoverflow.com/questions/33114855/reset-sequence-number-in-quickfix

quickfix에서 시퀀스 번호 리셋

나는 매주의 시작을 제외하고 로그온 시 시퀀스 번호를 리셋하지 않도록 브로커로 작업하고 있습니다. 그러나 시퀀스 번호가 이상하면 로그온 메시지의 태그 141을 사용하여 시퀀스 번호 리셋을 요청해야 합니다. 분명히 시퀀스 번호가 너무 낮아 거부된 로그온이 거부되었는지 확인하고 onlogon에 태그를 설정할 수 있습니다. 그러나 quickfix에 시퀀스 번호를 리셋해야 한다고 어떻게 알릴 수 있습니까? 이것은 시퀀스 번호에 영향을 미치는 연결 문제가 자주 발생하지 않기 때문에 테스트하기 어려운 기능입니다.

저는 quickfix의 C++ 버전을 사용합니다


1개의 답변

당신은 LOGOUT 메세지에서 적절한 메세지를 모니터해야 합니다. "msgseqnum이 너무 작다" 같은 뭔가가 발생하면, 다음 LOGON 메세지에서 리셋하도록 플래그를 설정해야 합니다. 이는 FIX::Application::fromAdmin 구현에서 합니다.

그리고 나서 당신의 FIX::Application::toAdmin 구현에서 메세지에 LOGON이 있는지 확인하고 리셋 플래그를 설정합니다. 그렇다면 당신의 세션(FIX::Session::lookupSession)을 찾아 setNextSenderMsgSeqNum(1)setNextTargetMsgSeqNum(1)를 호출합니다. 또한 당신의 플래그를 리셋합니다 :)

반응형

+ Recent posts