반응형

출처 : https://stackoverflow.com/questions/21524642/splitting-string-with-pipe-character

파이프 글자로 문자열 분리하기("|")

저는 이 문자열을 값으로 분리할 수 없습니다.

"Food 1 | Service 3 | Atmosphere 3 | Value for money 1 "

저의 현재 코드입니다.

String rat_values = "Food 1 | Service 3 | Atmosphere 3 | Value for money 1 ";
String[] value_split = rat_values.split("|");

출력

[, F, o, o, d, , 1, , |, , S, e, r, v, i, c, e, , 3, , |, , A, t, m, o, s, p, h, e, r, e, , 3, , |, , V, a, l, u, e, , f, o, r, , m, o, n, e, y, , 1, ]

기대하는 출력

Food 1
Service 3
Atmosphere 3
Value for money 1

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

|는 정규식에서 메타글자입니다. 당신은 파이프를 escape 할 필요가 있습니다.

String[] value_split = rat_values.split("\\|");
반응형
반응형

출처 : 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을 인수로 사용하여 파일을 저장하거나 복원합니다.

반응형

+ Recent posts