반응형

참고주소 : https://stackoverflow.com/questions/7368163/how-can-i-convert-a-string-to-a-float-in-mysql

mysql에서 문자열을 float으로 어떻게 형변환 할 수 있을까요?

저는 위도와 경도 값을 문자열(VARCHAR)로 저장한 테이블이 있습니다. 이를 FLOAT (10,6)으로 형변환하고 싶습니다.

하지만 CAST()CONVERT()를 사용하여 직관적인 방법으로는 할 수 없는 거 같습니다.

어떻게 이 열(컬럼)을 쉽게 형변환 할 수 있을까요? 한 번에 변환하고 싶습니다.


3개 답변 중 1개

CAST() 설명에서 DECIMAL 부분을 놓쳤음을 알게 되었습니다.

DECIMAL[(M[,D])]
DECIMAL 데이터 타입의 값으로 형변환 합니다. 옵션 값인 M, D는 정확도 (M은 자리수의 전체 수)이며 십진수 값의 소수점 단위(scale, D는 소수점 자리 뒤에 자리수)입니다. 기본 정확도는 소수점 뒤에 2자리 입니다.

그러므로 다음 쿼리는 작동합니다.

UPDATE table SET
latitude = CAST(old_latitude AS DECIMAL(10,6)),
longitude = CAST(old_longitude AS DECIMAL(10,6));
반응형
반응형

코딩 야학 1기 수료식 때 해커톤을 진행하면서 프로젝트를 시작하였습니다.

텔레그램 봇 프로그램인 tellmeit을 소개합니다.

네이버의 실시간 검색어를 크롤링하여 등록된 키워드 단어가 있으면 알람메세지를 보내게 됩니다.

최근에 이 프로그램의 업그레이드를 진행하였습니다.

유튜브 소개 영상도 만든 겸해서 글 남깁니다.

 

홈페이지

https://sdrlurker.github.io/tellmeit/

유튜브 소개

https://youtu.be/Qb7oxmlinBE

감사합니다.

 

---



텔레그램 봇 프로그램인 tellmeit을 소개합니다.

네이버의 실시간 검색어를 크롤링하여 등록된 키워드 단어가 있으면 알람메세지를 보내게 됩니다.

텔레그램에서 tellmeit_bot으로 검색하시면 친구로 등록하실 수 있습니다.

사용법에 대해 설명하겠습니다.

친구로 등록하시면 다음과 같은 화면을 보실 수 있습니다.

키워드를 등록하려면 알람 명령을 사용합니다.

네이버에서 배터리 단어가 실시간 검색어에 등록되어 있는지 확인하고 싶으시면

"/알람 배터리"를 입력합니다.

실시간 검색어에 배터리가 있을 경우 1분마다 알람 메세지를 받게 됩니다.

개인적으로 출근길에 2호선과 4호선이 문제가 있는지 알기 위해 사용 중에 있습니다.

"/알람 2호선 4호선"을 키워드로 등록하여 출근 지하철에 어떤 문제가 있는지 파악하고 있습니다.

이 프로젝트는 생활코딩에서 주최한 코딩야학 1기 수료식 해커톤 때 제작하기 시작하였습니다.

기본적인 홈페이지를 만들고 싶으신 분들께 코딩야학 WEB1 온라인 수업을 추천하고 싶습니다.

(https://coding.yah.ac/)

사용해 보시고 궁금한 점이나 추천할 만한 키워드 단어가 있으시면 댓글로 적어주세요.

감사합니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/42988977/what-is-the-purpose-of-pip-install-user

"pip install --user ..."의 목적은?

pip install --help 로부터

--user 당신의 플랫폼의 Python 사용자 설치 디렉터리에 설치합니다. 일반적으로 ~/.local/, 또는 윈도우즈는 %APPDATA$\Python입니다. (전체 세부사항은 site.USER_BASE Python 문서를 보세요.)

site.USER_BASE 문서는 제가 이해하지 못하는 흥미로운 NIX 주제이며 무시무시 합니다.

일반 영어로 --user의 목적은 무엇입니까? 왜 패키지는 ~/.local에 설치되나요? 왜 저의 $PATH에 어딘가 실행 프로그램을 놓지 않을까요?


8개 답변 중 1개

pip는 기본적으로 (/usr/local/lib/python3.4 같은) 시스템 디렉터리에 Python 패키지를 설치합니다. 이는 root 권한이 필요합니다.

pip의 --user는 대신에 당신의 home 디렉터리에 패키지를 설치합니다. 이는 특별한 권한을 요구하지 않습니다.

추가 참고주소 : https://scicomp.stackexchange.com/questions/2987/what-is-the-simplest-way-to-do-a-user-local-install-of-a-python-package

반응형
반응형

출처: https://en.wikipedia.org/wiki/Multiton_pattern

Multiton 패턴

소프트웨어 엔지니어링에서 multiton 패턴은 singleton 패턴을 일반화한 디자인 패턴입니다. singleton은 생성될 클래스의 인스턴스를 하나만 허용하지만, multiton 패턴은 map의 사용을 통해 관리되는 여러개의 인스턴스 생성을 허용합니다.

응용프로그램(예시 java.lang.Runtime) 당 하나의 인스턴스를 가지는 것에 비해 multiton 패턴은 대신에 key 당 하나의 인스턴스를 보장합니다.

대부분의 사람과 교과서는 singleton 패턴을 고려합니다. 예를 들어 multiton은 객체지향 프로그래밍 교과서인 디자인 패턴에 자주 나타나지는 않습니다. (이는 더 유연한 접근인 singleton들의 레지스트리라는 이름으로 나타납니다.)

설명

multiton이 액세스가 동기화된 해시 테이블인 것처럼 보일 수 있지만 두 가지 중요한 차이점이 있습니다. 첫째, multiton은 클라이언트가 매핑을 추가하는 것을 허용하지 않습니다. 둘째, multiton은 null 또는 빈 참조를 반환하지 않습니다. 대신 연결된 키를 사용하여 첫 번째 요청에서 multiton 인스턴스를 만들고 저장합니다. 동일한 키를 가진 후속 요청은 원래 인스턴스를 반환합니다. 해시 테이블은 구현 세부 사항 일뿐 가능한 유일한 접근 방식은 아닙니다. 이 패턴은 애플리케이션에서 공유 객체 검색을 단순화합니다.

객체 풀은 인스턴스가 아닌 클래스와 연결된 멤버이므로 한 번만 생성되기 때문에 multiton은 트리 구조로 진화하는 대신 플랫 동작을 유지합니다.

multiton은 풀의 각 멀티 톤 인스턴스가 자체 상태를 가질 수 있는 multiton의 단일 디렉토리 (즉, 모든 키가 그 자체로 동일한 네임 스페이스에 있음)에 대한 중앙 집중식 액세스를 제공한다는 점에서 고유합니다. 이러한 방식으로 패턴은 시스템에 대한 필수 개체의 색인화된 저장소 (예 : LDAP 시스템에서 제공)를 옹호합니다. 그러나 multiton은 분산 시스템이 아닌 단일 시스템에서 광범위하게 사용되도록 제한됩니다.

단점

Singleton 패턴과 같은 이 패턴은 애플리케이션에 전역 상태를 도입하므로 단위 테스트를 훨씬 더 어렵게 만듭니다.

가비지 수집 언어를 사용하면 객체에 대한 전역적인 강력한 참조를 도입하므로 메모리 누수의 원인이 될 수 있습니다.

구현

Java에서는 인스턴스에 해당하는 유형의 값과 함께 열거 유형을 사용하여 multiton 패턴을 구현할 수 있습니다. 단일 값이 있는 열거 형의 경우 singleton 패턴을 제공합니다.

C#에서는 다음 예제와 같이 열거 형을 사용할 수도 있습니다.

using System.Collections.Generic;

public enum MultitonType {
    Zero,
    One,
    Two
};

public class Multiton {
    private static readonly IDictionary<MultitonType, Multiton> instances =
        new Dictionary<MultitonType, Multiton>();
    private int number;

    private Multiton(int number) {
        this.number = number;
    }

    public static Multiton getInstance(MultitonType type) {
        // Lazy init (not thread safe as written)
        // Recommend using Double Check Locking if needing thread safety
        if (!instances.ContainsKey(type)) {
            instances.Add(type, new Multiton((int)type));
        }
        return instances[type];
    }

    public override string toString() {
        return "My number is " + number.ToString();
    }

    // Sample usage
    public static void main(string[] args) {
        Multiton m0 = Multiton.GetInstance(MultitonType.Zero);
        Multiton m1 = Multiton.GetInstance(MultitonType.One);
        Multiton m2 = Multiton.GetInstance(MultitonType.Two);
        System.Console.WriteLine(m0);
        System.Console.WriteLine(m1);
        System.Console.WriteLine(m2);
    }
}
반응형
반응형

출처 : https://stackoverflow.com/questions/43995886/gradle-could-not-target-platform-java-se-8-using-tool-chain-jdk-7-1-7/44000209

Gradle - Could not target platform: 'Java SE 8' using tool chain: 'JDK 7 (1.7)'

저는 Intellij Idea에서 Gragle 프로젝트를 불러오려고(import) 시도하였고 다음과 같은 메세지가 나왔습니다. Gradle - Could not target platform: 'Java SE 8' using tool chain: 'JDK 7 (1.7)' 누구든지 이렇게 나온 이유가 무엇인지 설명해 주시겠습니까?


7 개의 답변 중 1 개의 답변만 추려냄.

저는 이렇게 해결 하였습니다. (Intellij Idea 2018.1.2)

1) 파일-> 설정-> 빌드, 실행, 배포-> 빌드 도구-> Gradle로 이동합니다.
File -> Settings -> Build, Execution, Deployment -> Build Tools -> Gradle

2) Gradle JVM : 버전 1.8로 변경

3) Gradle 작업 다시 실행

반응형
반응형

출처 : https://stackoverflow.com/questions/32456881/getting-values-from-functions-that-run-as-asyncio-tasks

asyncio 작업(task)으로 실행한 함수에서 값 얻어오기

저는 다음 코드를 작성하였습니다.

import asyncio

@asyncio.coroutine
def func_normal():
        print("A")
        yield from asyncio.sleep(5)
        print("B")
        return 'saad'

@asyncio.coroutine
def func_infinite():
    i = 0
    while i<10:
        print("--"+str(i))
        i = i+1
    return('saad2')

loop = asyncio.get_event_loop()

tasks = [
    asyncio.async(func_normal()),
    asyncio.async(func_infinite())]

loop.run_until_complete(asyncio.wait(tasks))
loop.close()

저는 이 함수의 변수에서 값들을 어떻게 얻는지 모르겠습니다. 다음처럼 했는데 안 됩니다.

asyncio.async(a = func_infinite())

위처럼 keyword 인자로 값을 넘겼습니다. 함수 리턴값을 얻으려면 어떻게 해야 할까요?


3개의 답변 중 1개를 추려냄

코루틴은 기존처럼 작동합니다. loop.run_until_complete()로부터 리턴 값을 바로 사용하시면 되고 여러개의 결과를 모으기 위해 asyncio.gather()를 호출 합니다.

#!/usr/bin/env python3
import asyncio

@asyncio.coroutine
def func_normal():
    print('A')
    yield from asyncio.sleep(5)
    print('B')
    return 'saad'

@asyncio.coroutine
def func_infinite():
    for i in range(10):
        print("--%d" % i)
    return 'saad2'

loop = asyncio.get_event_loop()
tasks = func_normal(), func_infinite()
a, b = loop.run_until_complete(asyncio.gather(*tasks))
print("func_normal()={a}, func_infinite()={b}".format(**vars()))
loop.close()

출력

--0
--1
--2
--3
--4
--5
--6
--7
--8
--9
A
B
func_normal()=saad, func_infinite()=saad2
반응형
반응형

출처 : https://stackoverflow.com/questions/6318809/how-do-i-grab-an-ini-value-within-a-shell-script

shell 스크립트에서 INI 파일 설정값을 얻는 방법은?

다음과 같은 parameters.ini 파일이 있습니다.

[parameters.ini]
    database_user    = user
    database_version = 20110611142248

bash 쉘 스크립트 내에서 parameters.ini 파일에 지정된 데이터베이스 버전을 읽고 사용하여 처리하려고 합니다.

#!/bin/sh
# 스크립트에서 사용하기 위해 parameters.ini 파일에서 데이터베이스 버전을 가져와야 함
PHP app/console doctrine:migrations:migrate $DATEBASE_VERSION

이를 어떻게 할 수 있을까요?


31개의 답변 중 1개

해당 라인의 값을 grep 하고난 뒤 awk를 사용하는 것은 어떨까요?

version=$(awk -F "=" '/database_version/ {print $2}' parameters.ini)
반응형
반응형

출처 : https://stackoverflow.com/questions/22683269/how-to-parse-a-config-file-conf-in-shell-script

shell 스크립트에서 설정 파일 (*.conf) 파싱하는 방법

저는 shell 스크립트 신입입니다. app.conf 파일이 다음처럼 있습니다.

[MySql]
user = root
password = root123
domain = localhost
database = db_name
port = 3306

[Logs]
level = logging.DEBUG

[Server]
port = 8080

저는 shell 스크립트에서 이 파일을 파싱하여 mysql 설정 정보를 추출하고 싶습니다. 어떻게 할 수 있을까요?

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

저는 다음처럼 하였습니다.

pw=$(awk '/^password/{print $3}' app.conf)
user=$(awk '/^user/{print $3}' app.conf)

echo $pw
root123

echo $user
root

$()는 변수 pw를 내부 명령의 출력으로 설정합니다. 안쪽의 명령은 app.conf 파일에서 password 로 시작하는 줄(line)에서 세 번째 필드를 출력합니다.

편집됨

설정 파일에서 많은 값을 파싱하려면 설정 파일 이름에 대한 변수를 만듭니다.

CONFIG=app.conf
pw=$(awk '/^password/{print $3}' "${CONFIG}")
user=$(awk '/^user/{print $3}' "${CONFIG}")

2개의 다른 포트가 있다면... 올바른 section이 나왔을 때 flag를 1로 설정하고 당신이 찾는 포트가 나왔을 때 종료(exit) 합니다.

mport=$(awk '/^\[MySQL\]/{f=1} f==1&&/^port/{print $3;exit}' "${CONFIG}")
sport=$(awk '/^\[Server\]/{f=1} f==1&&/^port/{print $3;exit}' "${CONFIG}")

역자 추가내용

저 같은 경우에는 다음처럼 파싱처리 하였습니다.

pw=$(awk -F "=" '/^\[MySQL\]/{f=1} f==1&&/^password/{print $2;exit}' "${CONFIG}")
반응형
반응형

출처 : https://stackoverflow.com/questions/30506489/python-multiprocessing-leading-to-many-zombie-processes/32442923

많은 좀비 프로세스를 이끄는 파이썬 멀티프로세싱

저는 worker의 pool을 사용하여 파이썬의 멀티프로세싱 라이브러리를 구현하고 있습니다. 저는 다음 코드를 구현하였습니다.

import main1
t1 = time.time()
p = Pool(cores) 
result = p.map(main1, client_list[client])
if result == []:
    return []
p.close()
p.join()
print "Time taken in performing request:: ", time.time()-t1
return shorted(result)

하지만, 프로세스를 실행한 후에 저의 응용프로그램에 백그라운드 프로세스가 많이 나왔습니다. 저의 응용프로그램에 ps aux를 실행한 후에 스냅샷입니다.

Stackoverflow에서 멀티프로세싱 모듈에 의해 생성된 좀비 프로세스를 죽이는 방법 같은 비슷한 질문을 많이 읽었습니다. 이미 구현한 .join()을 사용해야 하며 여기에서 Python Multiprocessing Kill Processes에서 이러한 모든 프로세스를 종료하는 방법을 배웠습니다. 그러나 제 코드에 무엇이 잘못 될 수 있는지 알고 싶습니다. main1 함수에서 모든 코드를 공유할 수는 없지만 main 코드의 오류로 인해 좀비 프로세스가 발생할 수 있는 경우를 피하기 위해 try catch 블록에 전체 코드 블록을 넣었습니다.

def main1((param1, param2, param3)):
    try:
       resout.append(some_data) # 오류가 없는 경우 resout
    except:
        print traceback.format_exc()
        resout = []  # 오류가 발생한 경우 비어 있는 resout 리턴
    return resout

저는 병렬 프로그래밍 및 디버깅 문제라는 개념에 대해 아직 매우 신입이고 매우 까다롭습니다. 어떤 도움이든 매우 감사하겠습니다.


1개의 답변

보통 가장 보편적인 문제는 pool이 생성되었지만 닫지 않는 것입니다.

제가 알고있는 최고의 방법은 try/finally 구문을 사용하여 pool이 닫히도록 보장하는 것 입니다.

try:
    pool = Pool(ncores)
    pool.map(yourfunction, arguments)
finally:
    pool.close()
    pool.join()

multiprocessing과 싸우고 싶지 않다면, 저는 제 인생(잠재적으로 당신의 인생도)을 더 쉽게 멀티프로세싱을 wrapping 한 parmap이라 불리는 간단한 패키지를 작성하였습니다.

pip install parmap

import parmap
parmap.map(yourfunction, arguments)

여기서부터는 parmap 사용법 입니다.

  • 간단한 병렬처리 예시:
import parmap
y1 = [myfunction(x, argument1, argument2) for x in mylist]
y2 = parmap.map(myfunction, mylist, argument1, argument2)
y1 == y2
  • 튜플의 리스트를 순회하기
# 당신이 원하는 것:
z = [myfunction(x, y, argument1, argument2) for (x,y) in mylist]
z = parmap.starmap(myfunction, mylist, argument1, argument2)


# 당신이 원하는 것:
listx = [1, 2, 3, 4, 5, 6]
listy = [2, 3, 4, 5, 6, 7]
param = 3.14
param2 = 42
listz = []
for (x, y) in zip(listx, listy):
    listz.append(myfunction(x, y, param1, param2))
# 병렬로 실행:
listz = parmap.starmap(myfunction, zip(listx, listy), param1, param2)
반응형
반응형

출처 : https://stackoverflow.com/questions/40286841/what-is-the-best-way-to-raise-request-errors

저는 다음 방법으로 나쁜 요청(requests)에 대해 오류를 발생하는 소스 코드를 읽고 있습니다.

import requests

response = requests.get("www.google.com")   # http:// 가 없기 때문에 작동하지 않습니다.
if response.ok is False or response.json()['status'] != 'success':
    raise Exception("API error: {}".format(response.json()['message']))

저는 마지막 2줄을 다음 구문으로 대체해야겠다고 생각하였습니다.

response.raise_for_status()

오류가 리턴한 내용에서 차이점을 발견하지 못했습니다. 2가지 모두 다음과 같이 나왔습니다.

Traceback (most recent call last):
  File "/home/kurt/Documents/Scratch/requests_test.py", line 3, in <module>
    response = requests.get("www.google.com")   # This won't work because it's missing the http://
  File "/home/kurt/.local/lib/python2.7/site-packages/requests/api.py", line 69, in get
    return request('get', url, params=params, **kwargs)
  File "/home/kurt/.local/lib/python2.7/site-packages/requests/api.py", line 50, in request
    response = session.request(method=method, url=url, **kwargs)
  File "/home/kurt/.local/lib/python2.7/site-packages/requests/sessions.py", line 451, in request
    prep = self.prepare_request(req)
  File "/home/kurt/.local/lib/python2.7/site-packages/requests/sessions.py", line 382, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "/home/kurt/.local/lib/python2.7/site-packages/requests/models.py", line 304, in prepare
    self.prepare_url(url, params)
  File "/home/kurt/.local/lib/python2.7/site-packages/requests/models.py", line 362, in prepare_url
    to_native_string(url, 'utf8')))
requests.exceptions.MissingSchema: Invalid URL 'www.google.com': No schema supplied. Perhaps you meant http://www.google.com?

raise_for_status()는 더 간결하고 아마도 원래 예외에 대한 정보를 잃지 않는 것 같습니다 (참조. "except Exception"대 파이썬에서 "except ... raise" 사용). 이것이 실제로 더 나은 접근법일까요?


1개의 답변

response.raise_for_status()는 응답의 상태 코드가 200이 아닌 응답일 때만 예외(Exception)를 발생합니다. 두 번째 경우인 response.json()['status'] != 'success'가 만족할 경우, 커버하지 않습니다.

하지만 다른 오류가 있습니다. requests.get() 호출에 의해 예외가 발생하므로 if 테스트에 도달하지 않습니다. 스키마를 전달하지 못했습니다 (문자열 앞에 http:// 또는 https:// 없음). requests.get() 표현식에서 예외가 발생하므로 다음 행은 절대로 실행되지 않습니다. 요청도 전송되지 않으므로 응답에 대한 assertion도 만들 수 없습니다.

테스트는 더 많은 문제가 있습니다.

  • requests.ok is False 관용적인 파이썬 표현이 아닙니다. 대신에 not requests.ok를 사용하는 것이 좋습니다.
  • 만약 requests.ok is False를 만족하면, requests.json()은 대부분 실패할 것입니다. 그래서 response.json()['message']를 사용한 다음 줄은 다른 오류를 발생할 것입니다.
반응형

+ Recent posts