has_key

menu = {"ham" : 1, "cucumber" : -12, "egg" : 100}

if menu.has_key("ham"):
    print "네, 찾는 것이 있네요"
else:
    print "그런 메뉴는 없습니다."

 

파이썬 3을 사용중이면 아래 에러 문구가 나오면 처리되지 않음

  AttributeError: 'dict' object has no attribute 'has_key' 

has_key는 파이썬에서 지양하는 함수로, 파이썬 2를 사용하는 분들도 사용하면 안된다.

  http://stackoverflow.com/questions/1323410/has-key-or-in

get / in

1. get

menu = {"ham" : 1, "cucumber" : -12, "egg" : 100}

if menu.get("ham"):
    print "네, 찾는 것이 있네요"
else:
    print "그런 메뉴는 없습니다."
2. in
menu = {"ham" : 1, "cucumber" : -12, "egg" : 100}

if "ham" in menu:
    print "네, 찾는 것이 있네요"
else:
    print "그런 메뉴는 없습니다."

get은 키에 해당하는 값을 넘겨주기 때문에 값이 있다면 True고 없다면 False(...일 것 같지만 실제로는 None을 리턴한다. None False가 아니긴 하지만.... 어차피 키 값 판별이니 True가 아니므로 없는 메뉴에 대해서는 else로 빠진다.) 가 된다.

 

참고

https://www.pymoon.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%97%90%EC%84%9C-%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC-%ED%82%A4-%EA%B0%92-%EC%B2%B4%ED%81%AC%ED%95%98%EA%B8%B0

 

replace

일반적으로 한 두개 정도의 간단한 치환

# 대문자를 소문자로
> ex = "Korea is Great"
> ex.replace('K','k').replace('G','g')
'korea is great'

translate

여러 문자를 한번에 치환

유의해야 할점은 maketrans 함수 안에 두 개의 인자의 길이(length)가 똑같아야함

# 모음없애기(소문자 외 대문자까지 한방에 가능하다)
> ex = "Korea is Great"
> table = str.maketrans('aieouAIEOU', '          ')
> ex.translate(table)
'K r    s Gr  t'

> table = str.maketrans('aieouAIEOU', '1234567890')
> ex.translate(table)
'K4r31 2s Gr31t'

 

참고

https://velog.io/@keywookim/Python-translate-%ED%95%9C-%EB%B2%88%EC%97%90-%EC%97%AC%EB%9F%AC-%EB%AC%B8%EC%9E%90-%EC%B9%98%ED%99%98%ED%95%98%EA%B8%B0

에러 문구

too many values to unpack

원인

설정한 변수의 개수와 리턴해 주는 변수의 개수가 차이가 날때 발생

예를 들어 리턴 받는 값의 개수가 3개로 맞춰야 정상인 경우
aa, bb, cc = ss.run([a,b,c])

아래 경우는 오류 발생
bb, cc = ss.run([a,b,c])
> too many values to unpack

해결

리턴 받는 값의 개수를 맞춰주면 해결

 

참고 

https://wotres.tistory.com/entry/too-many-values-to-unpack-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%EB%B2%95

 

현상

높은 비중의 Thread State 상태가 유지되면서, CPU사용량이 높아지면서 성능 이슈가 발생

원인

Front-End 서버에서 MySQL에 만들어둔 SP 사용시 SP의 Body 호출이 필요함

MySQL.PROC에 해당 정보가 있지만 권한이 없어 INFORMATION_SCHEMA 정보를 가져가게 되면서 발생

해결 방안

db 접속 계정에 MySQL DB의 PROC 테이블에 SELECT 권한 부여

test_acc 계정에 권한 추가하는 경우

GRANT SELECT ON `mysql`.`proc` TO 'test_acc'@'%';

 

※현상

DB를 single_user에서 multi_user로 변경하는 도중 프로세스 Deadlock 발생

원인

DB 커넥션이 존재하는 상황에서, 사용자 세션이 master를 바라보는 도중 DB  커넥션을 모두 off시켜,

사용자 세션이 DB를 바라보지 않아 system 내부에서 DB의 소유자를 찾지 못하는 상태

deadlock이 발생하는 세션을 끊으려 하여도 사용자 세션이 아닌 시스템 세션이라 kill이 불가한 상태 

해결방안

1번으로 작업해야 하지만, 이미 deadlock이 발생한 상태라면 2번으로 해결

1. 작업하려는 DB를 소유하고 single_user로 변경

use [작업DB]
 
alter database [작업DB] set single_user WITH ROLLBACK IMMEDIATE-- immediate 커넥션 한번에 off
go
  
-- 작업 할 쿼리 내역
  
alter database [작업DB] set multi_user
go

2. Deadlock 발생 시, DB 재기동 후 아래 쿼리 실행

SET DEADLOCK_PRIORITY HIGH -- 교착상태 최상위 레벨로 격상
GO
 
ALTER DATABASE [작업DB] SET MULTI_USER WITH ROLLBACK IMMEDIATE -- 작업 DB multi_user로 변경
GO
  
-- https://myadventuresincoding.wordpress.com/2014/03/06/sql-server-alter-database-in-single-user-mode-to-multi-user-mode/

현상

MySQL의 SP를 사용하는 DB에서 지속적으로 Memory가 상승하는 현상 발생

원인

MySQL 내부적으로 SP 내 Subquery 사용 시 Memory Leak 이 발생

참조: The optimizer sometimes generates an index for a derived table (subquery in the FROM clause).

If this occurred for a statement executed within a stored program, a memory leak could occur. (Bug #76349, Bug #20728894)

해결방안

해당 버그가 5.6.27 이후 fixed 된 것으로 확인되어 MySQL upgrade

upgrade 후 memory leak 현상 해소

 

방법

라인의 마지막 부분에 \ 을 추가한다.

// validation
$(".adjustment, .info input, .includesAndTiming input, \
    .independentAdj, .generalAdj, .executiveAdj \
    #officeExpense, #longDistanceExpense, #digitalImages, #milesReimbursment, #driveTime, #statementTranscription").keypress(function (event) {

 

참고

https://stackoverflow.com/questions/10514873/line-continuation-characters-in-javascript

html

<textarea id="textarea_summernote" name="textarea_summernote">
  textarea 내용 입력
</textarea>

javascript

html에서 생성한 textarea_summernote textarea를 summernote()를 사용하여 초기화 진행

이미지 파일 처리를 위해 onImageUpload 함수 등록

uploadSummernoteImageFile 함수에서 첨부한 파일 정보를 ajax를 이용하여 flask로 전달하여 저장소에 저장

setSummernoteValue 함수는 Summernote에 값을 추가하는 예시

// summernote 초기화
$(function () {
    // Summernote
    $('#textarea_summernote').summernote({
        callbacks : {
            // 이미지 첨부하는 부분
            onImageUpload : function(files){
                uploadSummernoteImageFile(files[0],this);
            },
            onPaste : function(e) {
                var clipboardData = e.originalEvent.clipboardData;

                if(clipboardData && clipboardData.items && clipboardData.items.length){
                    var item = clipboardData.items[0];
                    if(item.kind === 'file' && item.type.indexOf('image/') !== -1){
                        e.preventDefault();
                    }
                }
            }
        }
    });  
});


// summernote - 이미지 파일 업로드
function uploadSummernoteImageFile(file, editor){

    // 프로젝트 코드
    var project_code = 'test'
    
    var data = new FormData();
    data.append('file',file);
    data.append('project_code', project_code);

    //file 정보를 python으로 전달
    $.ajax({
        data: data,
        type : "POST",
        url : "/test/uploadSummernoteImageFile",
        contentType : false,
        processData : false,
        success : function(data){
            alert('File Upload Success')
            $(editor).summernote('insertImage', data.filepath);
        }
    });
}


function setSummernoteValue(value) {

    // value가 문자열인 경우
    $('#textarea_summernote').summernote('insertText', value);
    
    // value가 html 태크 형태인 경우
    $('#textarea_summernote').summernote('pasteHTML', value);
}

python

프로젝트 코드(또는 메뉴등의 그룹)별 파일을 저장하기 위해 폴더에 서비스 코드 추가

파일명이 겹치지 않도록 파일명 앞에 현시간을 추가

@project_blueprint.route('test/uploadSummernoteImageFile', methods =['POST'])
@login_required
def project_test_uploadSummernoteImageFile():

    try :
        file = request.files['file']
        project_code = request.form['project_code']
        default_path = 'test/img/'

        host_path = default_path + project_code + '/'
        if not os.path.exists(host_path):
            os.mkdir(host_path)

        now_date = datetime.datetime.now()
        prefix_date = now_date.strftime('%Y%m%d_%H%M%S_')

        img_name = host_path + prefix_date + file.filename
        file.save(img_name)

        return jsonify(filepath = img_name[3:])

    except (RuntimeError, TypeError, NameError, SQLAlchemyError) as e:
        print("#### img upload Failed !! " + str(e))

        return jsonify(message=str(e))

참고

https://summernote.org/deep-dive/#pastehtml

html

<table id="test_table" class="table table-bordered">
  <tbody id="test_tbody">
    <tr>
      <td>title</td>
      <td>id</td>
      <td>name</td>
      <td>detail</td>
    </tr>
    <tr>
      <td>abs</td>
      <td>1</td>
      <td>Lee</td>
      <td>888</td>
    </tr>
  </tbody>
</table>

javascript

첫번째 row(tr)의 값을 조회
document.getElementById("test_table").getElementsByTagName("tr")[0].innerHTML
document.getElementById("test_tbody").getElementsByTagName("tr")[0].innerHTML
첫번째 row(tr)의 값을 'asdf'로 변경
document.getElementById("test_table").getElementsByTagName("tr")[0].innerHTML = 'asdf'

첫번째 row(tr)의 첫번째 td값을 조회
document.getElementById("report_tbody").getElementsByTagName("tr")[0].getElementsByTagName("td")[0].innerHTML
첫번째 row(tr)의 두번째 td값을 조회
document.getElementById("report_tbody").getElementsByTagName("tr")[0].getElementsByTagName("td")[1].innerHTML
첫번째 row(tr)의 첫번째 td값을 'qwer'로 변경
document.getElementById("report_tbody").getElementsByTagName("tr")[0].getElementsByTagName("td")[0].innerHTML = 'qwer'

참고

https://stackoverflow.com/questions/8508262/how-to-select-td-of-the-table-with-javascript

정보

Windosws에서 서비스는 사용자 관리자(service.msc)에 의해 실행

리눅스의 경우 명령어 뒤에 &를 붙여서 백그라운드 실행가능

Windows의 경우 sc.exe를 실행하여 생성 가능

 

등록 방법

telegraf.exe을 등록하는 예
(관리자권한으로 cmd 실행)

sc create telegraf_agnet binpath= "C:\Program Files\Telegraf\telegraf.exe" displayname= "telegraf_Agent" start= auto

(참고) 서비스 삭제
sc delete telegraf_agent

 

참고

https://docs.microsoft.com/ko-KR/windows-server/administration/windows-commands/sc-create

https://gentian.tistory.com/1


to Top