반응형

출처 : https://stackoverflow.com/questions/5537876/get-utc-offset-from-time-zone-name-in-python

Python에서 시간대(timezone) 이름으로 UTC 시차(offset) 구하기

Python에서 시간대(timezone) 이름으로 UTC 시차(offset)을 어떻게 구합니까?

예시: 저는 Asia/Jerusalem을 통해 +0200을 얻고 싶습니다.


미국동부시간으로 한국 시간 구하기 예시

import datetime
import pytz

est = datetime.datetime.now(pytz.timezone('America/New_York'))
diff_min = (est.utcoffset().seconds - 86400) // 60 - 540
# ...중략...
# 02:38:00 28.02.20
svr_time = datetime.datetime.strptime(svr_str, "%H:%M:%S %d.%m.%y") - datetime.timedelta(minutes=diff_min)

3개의 답변 중 2개의 답변만 추려냄

pytz 프로젝트와 utcoffset 메소드 사용을 시도하신 적 있으신가요?

예시

>>> import datetime
>>> import pytz
>>> pacific_now = datetime.datetime.now(pytz.timezone('US/Pacific'))
>>> pacific_now.utcoffset().total_seconds()/60/60
-7.0

DST(일광절약시간, 서머타임) 때문에 결과는 그 해의 시간에 따라 다릅니다.

import datetime, pytz

datetime.datetime.now(pytz.timezone('Asia/Jerusalem')).strftime('%z')

# returns '+0300' ('now' 지금은 DST(일광절약시간, 서머타임)이기 때문입니다)

pytz.timezone('Asia/Jerusalem').localize(datetime.datetime(2011,1,1)).strftime('%z')

# returns '+0200' (1월에는 DST(일광절약시간, 서머타임)이 아니기 때문입니다)
반응형
반응형

출처 :https://stackoverflow.com/questions/12523044/how-can-i-tail-a-log-file-in-python

Python에서 로그 파일 tail 하는 방법?

저는 blocking이나 locking 없이 Python에서 tail -F 또는 뭔가 비슷한 방법으로 출력을 하고 싶습니다. 저는 여기에서 이를 할 수 있는 오래된 코드를 찾았지만 같은 것을 할 수 있는 라이브러리나 더 좋은 방법이 있을거라 생각합니다.

저는 더 많은 데이터를 원할때마다 호출할 수 있는 tail.getNewData()처럼 뭔가 있으면 합니다.

12개의 답변 중 1개의 답변만 추려냄

Non Blocking

리눅스에 있다면 (윈도우가 파일에서 select 호출을 지원하지 않기 때문에) select 모듈과 함께 서브 프로세스 모듈을 사용할 수 있습니다.

import time 
import subprocess 
import select 

f = subprocess.Popen(['tail','-F',filename],\ 
        stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
p = select.poll() 
p.register(f.stdout) 
while True: 
    if p.poll(1): 
        print f.stdout.readline() 
    time.sleep(1)

이는 새로운 데이터를 위한 출력 pipe를 poll하고 가능할 때 print 합니다. 일반적으로 time.sleep(1)print f.stdout.readline() 은 유용한 코드로 대체될 수 있습니다.

Blocking

추가적은 select 모듈 호출 없이 subprocess 모듈을 사용할 수 있습니다.

import subprocess
f = subprocess.Popen(['tail','-F',filename],\
        stdout=subprocess.PIPE,stderr=subprocess.PIPE)
while True:
    line = f.stdout.readline()
    print line

이는 추가될 때 새로운 line이 출력될 것이지만, tail program이 f.kill에 의해 닫힐 때까지 blocking 될 것입니다.

반응형
반응형

출처 :https://stackoverflow.com/questions/2472229/insert-into-select-from-on-duplicate-key-update

INSERT INTO … SELECT FROM … ON DUPLICATE KEY UPDATE

저는 만약 키가 이미 있을 경우 대부분의 많은 컬럼이 갱신될 필요가 있는 insert 쿼리를 실행하려 합니다.
다음처럼 진행하려 하는데요.

INSERT INTO lee(exp_id, created_by, 
                location, animal, 
                starttime, endtime, entct, 
                inact, inadur, inadist, 
                smlct, smldur, smldist, 
                larct, lardur, lardist, 
                emptyct, emptydur)
SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, 
       t.inact, t.inadur, t.inadist, 
       t.smlct, t.smldur, t.smldist, 
       t.larct, t.lardur, t.lardist, 
       t.emptyct, t.emptydur 
FROM tmp t WHERE uid=x
ON DUPLICATE KEY UPDATE ...; 
//update all fields to values from SELECT, 
//       except for exp_id, created_by, location, animal, 
//       starttime, endtime

저는 UPDATE 구문을 위한 문법에 무엇이 와야 되는지 확실하지 않습니다. SELECT 구문으로부터 현재 행을 어떻게 참조할 수 있을까요?

2개의 답변 중 1개의 답변만 추려냄

MySQL은 INSERT INTO 구문에서 등호 앞에 부분이 컬럼(필드)명을 참조하고 SELECT 컬럼(필드)를 등호 뒤에 두번째 부분에서 참조한다고 가정합니다.

INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, 
                inact, inadur, inadist, 
                smlct, smldur, smldist, 
                larct, lardur, lardist, 
                emptyct, emptydur)
SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, 
       t.inact, t.inadur, t.inadist, 
       t.smlct, t.smldur, t.smldist, 
       t.larct, t.lardur, t.lardist, 
       t.emptyct, t.emptydur 
FROM tmp t WHERE uid=x
ON DUPLICATE KEY UPDATE entct=t.entct, inact=t.inact, ...

2개의 팁 추가 번역

  • @dnagirl: : PK 컬럼중 어느것도 update하지 마세요. 리스트에서 갱신할 필요가 있는 것만 update하세요.
  • 당신이 제안한 문법은 작동하며 t.가 요구됩니다. 저는 xaprb의 블로그글(xaprb.com/blog/2006/02/21/flexible-insert-and-update-in-mysql)에서 이 문법 on duplicate key update b = values(b), c = values(c)을 보았습니다. 이것도 작동합니다.
반응형
반응형

출처 : https://stackoverflow.com/questions/4936807/how-to-do-ssh-with-a-timeout-in-a-script

script에서 ssh로 timeout을 주는 방법?

저는 원격 호스트로 비밀번호 없는 SSH로 접속하는 script를 실행하고 있습니다. 만약 원격호스트가 실행하는데 무한의 시간이 걸린다면 저는 timeout을 설정하여 그 ssh 세션을 빠져나와 저의 sh script에서 다음 행을 진행하고 싶습니다.

timeout을 어떻게 설정할 수 있나요?


6개의 답변 중 1개의 답변

ssh -o ConnectTimeout=10  <hostName>

10은 초로 된 시간을 의미합니다. 이 timeout은 연셜 생성에만 적용됩니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/5574702/how-to-print-to-stderr-in-python

Python에서 표준에러로 출력하는 방법?

표준 출력으로 쓰는 몇가지 방법이 있습니다.

# Note: 첫번째 문장은 Python 3에서 실행되지 않습니다.
print >> sys.stderr, "spam"

sys.stderr.write("spam\n")

os.write(2, b"spam\n")

from __future__ import print_function
print("spam", file=sys.stderr)

그것은 파이썬의 선 #13†과 모순되는 것처럼 보입니다. 그래서 여기의 차이점은 무엇이며 어떤 방법을 사용하던 장단점이 있습니까? 어떤 방법을 사용해야 합니까?

† 문제를 해결할 하나의 - 바람직하고 유일한 - 명백한 방법이 있을 것이다.

15개의 답변 중 1개의 답변만 추려냄

저는 짧고 유연하고 이식하기 좋고 읽기 좋은 유일한 방법을 찾았습니다.

from __future__ import print_function
import sys

def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)

함수 eprint는 표준 print 함수와 같은 방법으로 사용될 수 있습니다.

>>> print("Test")
Test
>>> eprint("Test")
Test
>>> eprint("foo", "bar", "baz", sep="---")
foo---bar---baz
반응형
반응형

출처 : https://bitdatatechie.com/2019/09/13/spark-journal-return-multiple-dataframes-from-a-scala-method/

Spark Journal: Scala 메소드로부터 여러 개의 dataframe을 리턴

지금까지, 저는 Spark에 한해서 글을 남기는 데 집중하였지만, Spark Framework를 사용할 때 사용되는 주요 언어 중 하나는 당신이 알 듯이 Scala입니다. 흥미로운 사용 사례를 보여주기 위해 Spark API와 Scala 언어 모두 사용할 것입니다.

이번 작업은 Scala 메소드로부터 여러 개의 dataframe을 리턴하는 것입니다. Int, String, Dataframe일 수 있는 리턴 값이 있을 때 메소드의 리턴 부분에 1개의 값만으로 이 작업을 해왔습니다.
저의 동료와 Architect는 이를 매우 쉽게 할 수 있는 다른 옵션을 저에게 보여주었고 도움이 되었습니다.

더 읽기 전에 StackOverflow의 이 게시물을 살펴 보는 것이 좋습니다. 이 방법은 Scala에서 List와 Tuple의 개념적 차이를 분명히 하는 데 도움이 됩니다.

접근 1
리턴 값으로 List를 사용

import org.apache.spark.sql.DataFrame

def returMultipleDf  : List[DataFrame] = {
    val dataList1 = List((1,"abc"),(2,"def"))
    val df1 = dataList1.toDF("id","Name")

    val dataList2 = List((3,"ghi","home"),(4,"jkl","ctrl"))
    val df2 = dataList2.toDF("id","Name","Type")

    List(df1, df2)

}

val dfList = returMultipleDf 
val dataFrame1 = dfList(0)
val dataFrame2 = dfList(1)

dataFrame2.show

+---+----+----+
| id|Name|Type|
+---+----+----+
|  3| ghi|home|
|  4| jkl|ctrl|
+---+----+----+

접근 2
리턴 값으로 Tuple을 사용

import org.apache.spark.sql.DataFrame

def returMultipleDf : (DataFrame, DataFrame) = {
    val dataList1 = List((1,"abc"),(2,"def"))
    val df1 = dataList1.toDF("id","Name")

    val dataList2 = List((3,"ghi","home"),(4,"jkl","ctrl"))
    val df2 = dataList2.toDF("id","Name","Type")

    (df1, df2)

}

val (df1, df2) = returMultipleDf


df2.show

+---+----+----+
| id|Name|Type|
+---+----+----+
|  3| ghi|home|
|  4| jkl|ctrl|
+---+----+----+
반응형
반응형

출처 : https://stackoverflow.com/questions/29523954/distinguishing-between-two-quickfix-initiator-sessions

2개의 QuickFix initiator 세션을 구분하기

저는 broker로 접속하기 위한 Python binding으로 QuickFix를 사용하고 있고 config 파일에서 2 개의 initiator 세션이 있습니다. 하나는 가격을 위한 것이고 다른 것은 주문 세션을 위한 것입니다.

제 질문은 그들 중 하나만 온라인일 때 뭔가를 하고 싶습니다.

initiator = fix.SocketInitiator(application, storeFactory, settings, logFactory)
if initiator.isLoggedOn():
    function()

가격이나 주문 세션이나 로그인 된 둘 다에 관련하여 function이 호출될 것입니다. 저는 특정 initiator가 로그인되어 있을 때 알아낼 수 있을까요?


1개의 답변 중 1개의 답변

언급하신대로, 메소드 bool Initiator::isLoggedOn()는 어떤 세션이든 현재 로그인 되었는지 당신에게 알려줍니다.

특별한 세션을 확인하기 위해 bool Initiator::isConnected( const SessionID& sessionID )를 사용하세요.

SocketInitiatorInitiator로 부터 이들 둘 다를 상속합니다.

반응형
반응형

출처 : https://serverfault.com/questions/84430/whats-wrong-with-my-cronjob-syntax-im-trying-to-use-a-backtick

cronjob 문법에서 backtick(`)을 사용하려는데 무엇이 잘못되었습니까?

제가 자동화 하고 싶은 것이 여기 있습니다.

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +%Y-%m-%dZ%I:%M`"

하지만 다음처럼 오류 메세지가 나옵니다.

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

4개의 답변 중 1개의 답변만 추려냄

cronjob(5)에서

"여섯"번째 필드 (라인의 마지막)은 실행할 명령어입니다. 그 행의 전체 명령 부분 개행문자 혹은 %까지 /bin/sh에 의해 실행되거나 crontab 파일의 SHELL 변수에 정의된 shell에 의해 실행됩니다. 명령어에서 퍼센트 표시(%)가 backslash()에 의해 escape되지 않으면 이는 개행문자로 변경되고 첫번째 % 이후 모든 데이터는 표준 입력의 명령어로 보내집니다. 하나의 명령 행을 여러 행으로 나누지 않으려면 shell ""를 붙여야 합니다.

% 표시 앞에 backslash를 추가하면 됩니다.

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"
반응형
반응형

출처 : https://www.shellscript.sh/tips/getopts/

Shell Script 튜토리얼 - 팁 Getopts

명령줄 인자 파싱하기

대부분의 Unix, Linux 명령은 "마이너스" 심볼을 앞에 붙여 옵션을 사용합니다. 예를 들어 파일 목록을 긴 포멧으로, (역순으로) 시간순으로 정렬할 때 당신은 ls -l -r -t를 사용하거나 ls -lrt를 사용할 수 있습니다.
몇가지 명령은 인자를 가지는데, 당신은 "myfiles" 디렉터리를 "mytarfile.tar"로 압축할 수 있습니다. tar -c의 경우, 압축 하기 위해 파일 목록을 취하는 옵션이 오게 됩니다.

The tl;dr lowdown

여기에 "너무 길어 읽지 않았다"처럼 빠른 개요가 있습니다. 다음처럼 getopts를 사용할 수 있습니다.

while getopts 'srd:f:' c
do
  case $c in
    s) ACTION=SAVE ;;
    r) ACTION=RESTORE ;;
    d) DB_DUMP=$OPTARG ;;
    f) TARBALL=$OPTARG ;;
  esac
done

간단한 "-f" 형식 대신 "--filename"과 같은 긴 형식 인수를 구문 분석하는 외부 유틸리티 getopt도 있습니다. 당신도 그 게시물을 읽고 싶을 것입니다.

그렇습니다. 바쁜 사람들은 위 예시에 만족할 것이며 getopts가 무엇인지 어떻게 작동하는지와 당신의 스크립트에서 어떻게 유용하게 사용할 수 있는지 알아보겠습니다.

getopts 소개

당신을 위해 이 옵션들을 파싱하는 편리한 유틸리티를 getops라 부릅니다. 그 사용법은 조금 이상하게 느껴지지만, 이 기술은 당신의 스크립트가 옵션을 표준화되고 친근하게 느끼는 방법으로 처리하도록 합니다..

getopts를 통해 당신이 전달한 첫번째 인자는 그것이 받아들일 어떤 문자(혹은 숫자, 또는 다른 한개의 글자))의 목록입니다. 각 글자 뒤에 colon(:)는 tar -f mytarfile 처럼 인자가 따라온다는 의미입니다. tar -f는 tar 파일의 이름이 항상 따라와야 합니다. 이 옵션 인자는 $OPTARG 변수에서 당신의 스크립트로 보내집니다.

getopts$OPTIND 변수도 세팅하는데 나중에 다룰 것입니다.

당신이 getopts로 전달하는 두번째 인자는 현재 switch의 문자가 위치하게 될 변수의 이름입니다. 주로 이는 opt 또는 c로 불리며, 아무 이름으로 올 수 있습니다.

이 예시 스크립트는 tarball로 파일을 저장하고 복구할 수 있습니다. 당신은 그것에 -s(저장) 또는 -r(복구)로 그것에 전달해야 합니다. 만약 당신이 -d databasefile을 전달하면 데이터베이스를 덤프(또는 복구)하는 이름으로 사용될 것입니다. 만약 -f tarball을 전달하면 파일을 생성(또는 해제하는) tarball의 이름으로 사용될 것입니다.

이 첫 번째 스크립트 초안에서 다루지 않는 몇 가지 사항이 있습니다. -s-r을 모두 전달하는 것은 유효하지 않습니다. 그렇게 하면 이 스크립트는 마지막으로 전달한 것을 취하므로 dbdump.sh -s -r -d 또는 dbdump.bin -s -r -s는 마지막으로 처리 한 것이 저장 명령이므로 (복원하지 않고) 저장합니다.

마찬가지로 -d-f 중 하나 이상을 전달하지 않으면 아무 일도 일어나지 않습니다.

DB_DUMP TARBALL ACTION 설정이 안되는 이유는 스크립트가 이미 설정된 환경 변수의 영향을 받지 않기 때문입니다. 이는 실행중인 스크립트의 범위에만 영향을 미칩니다. 호출 쉘은 변수가 변경되지 않습니다.

간결하게하기 위해 여기서 save_database(), save_files(), restore_database()restore_files() 함수를 정의하지 않았습니다. 다운로드 가능한 스크립트에는 더미 기능이 있어 스크립트가 실제로 실행됩니다. 수행할 작업만 표시하지만 실제로는 파일에 아무런 작업을 수행하지 않습니다.

이 스크립트 다운로드(getops1.sh)

#!/bin/bash

unset DB_DUMP TARBALL ACTION

while getopts 'srd:f:' c
do
  case $c in
    s) ACTION=SAVE ;;
    r) ACTION=RESTORE ;;
    d) DB_DUMP=$OPTARG ;;
    f) TARBALL=$OPTARG ;;
  esac
done

if [ -n "$DB_DUMP" ]; then
  case $ACTION in
    SAVE)    save_database $DB_DUMP    ;;
    RESTORE) restore_database $DB_DUMP ;;
  esac
fi

if [ -n "$TARBALL" ]; then
  case $ACTION in
    SAVE)    save_files $TARBALL    ;;
    RESTORE) restore_files $TARBALL ;;
  esac
fi

getopts 명령은 while 루프에 대한 인수입니다. 루프를 통해 매번 switch를 처리하고 $c 변수를 switch의 문자로 설정합니다. 기본 튜토리얼에서 루프case에 대해 자세히 읽을 수 있습니다.

이 스크립트를 dbdump.sh -s -r -d /tmp/dbdump.bin -f /tmp/files.tar -s로 호출하면 -s를 처리하고 $c=s를 설정하고 처음으로 case`` 구문을 실행합니다.$c=s$ACTION=SAVE를 설정하고 그 줄의 끝에는 처리를 중지하라고 알려주고 while 루프 주위의 다음 실행을 위해 getopts로 돌아갑니다. 논리적으로 의미가 없는 -r을 읽지만 (백업을 저장하고 동시에 백업을 복원 할 수는 없지만) 스크립트는 이를 알지 못하므로$c=r을 설정합니다. case 문은$ACTION = RESTORE를 설정하고 다음 인수를 처리하기 위해getopts`로 돌아갑니다.

이제 getopts는 $c=d를 설정하고 $OPTARG = /tmp/dbdump.bin 도 설정합니다. getopts 호출에서 'd:는 -d 다음에 인수 (데이터베이스 덤프 파일의 이름)가 옵니다. 실행은 case 문으로 진행하여 $DBDUMP=/tmp/dbdump.bin을 설정합니다. 스크립트의 본문에 들어갈 때 $ DBDUMP 변수에 값이 있으면 데이터베이스를 해당 파일에 저장하거나 해당 파일에서 복원합니다.

다음 옵션은 -f /tmp/files.tar 이며 동일한 프로세스가 수행됩니다. getopts는 $c=f 를 설정하고 $OPTARG=/tmp/files.tar도 설정합니다. case 문은 이것을 읽고 $TARBALL=/tmp/files.tar를 설정합니다.

마지막으로 또 다른 -s 스위치를 전달하여 $ACTION 변수를 다시 SAVE로 변경합니다.

기본 스크립트가 시작되면 $DB_DUMP가 설정되어 있는지 확인한 다음 $ACTION 값을 확인하고 $ACTION 값에 따라 $DB_DUMP를 사용하여 데이터베이스를 저장하거나 복원합니다.

마찬가지로 $TARBALL이 설정되어 있는지 확인하고 $TARBALL을 인수로 사용하여 파일을 저장하거나 복원합니다.

반응형
반응형

어떻게 접속이 끊어졌을 때 자동으로 재접속할 수 있나요?

issue 414를 보세요.


재접속을 위한 공통 패턴

pgrandinetti님 질문

몇 개의 제 프로젝트에서 접속 오류나 재접속 시도가 발생할 수 있는 시나리오를 다루기 위해 다음처럼 진행합니다.

async def listen_forever(self):
        while True:
        # 접속을 실패할 때마다 밖의 루프는 재실행됨
            try:
                async with websockets.connect(self.url) as ws:
                    while True:
                    # listener loop
                        try:
                            reply = await asyncio.wait_for(ws.recv(), timeout=***)
                        except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed):
                            try:
                                pong = await ws.ping()
                                await asyncio.wait_for(pong, timeout=self.ping_timeout)
                                logger.debug('Ping OK, keeping connection alive...')
                                continue
                            except:
                                await asyncio.sleep(self.sleep_time)
                                break  # 안쪽 loop
                        # dreply 객체로 작업을 진행합니다.
            except socket.gaierror:
                # 뭔가 로그를 남깁니다.
                continue
            except ConnectionRefusedError:
                # 뭔가 다른 것을 로그로 남깁니다.
                continue

저는 (1)이것이 괜찮은지 궁금하고요. (2) websockets에 이미 반복적인 행위같은 것을 처리하기 위해 제공되는 지름길 같은 방법이 있는지도 궁금합니다. (맞다고 가정합니다!)

aaugustin님 답변

이를 구현한 웹소켓에서 지름길 같은 방법은 없습니다.

이 사용 사례에 관해 이전에 들었고 저는 유효하다고 갱각합니다.

저는 좋은 API를 제공할 수 있을 지 확실하지는 않습니다. -- 저는 사용자 코드가 접속할 때 혹은 접속이 끊어졌을 때 이 작업(재접속)을 해야될 것으로 예상되지만 어떻게 이를 처리해야할지는 확실하지 않습니다.

heckad님 질문

이 특징을 추가하기 위해 필요한 것은 무멋이 있을까요?

aaugustin님 추가 제안

이 특징을 위해 저는 다음을 제안합니다.

  • 첫째, 이 특징이 정확히 반응하는지 묘사하는 문서가 필요합니다.
  • 우리가 그것에 동의하면 테스트와 함께 구현하겠습니다.

pgrandinetti 님 답변

@heckad 저는 최소한의 재생산 가능한 예시를 여기에 작성하였습니다.
https://gist.github.com/pgrandinetti/964747a9f2464e576b8c6725da12c1eb

반응형

+ Recent posts