ubuntu에서 pycharm에서 라이블러리를 추가 할때 ImportError: No module named pip 에러가 난다면 


(pip를 설치 했어도 계속 난다면!!)


python에 대한 권한을 설정해 주시면 됩니다.



sudo chmod -R a+rX /usr/local/lib/python2.7/dist-packages/
sudo chmod -R a+rX /usr/local/lib/python3.4/dist-packages/


python2.7 / 3.4 버전의 권한을 추가해 주시면 정상 작동 합니다.

저작자 표시
신고

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret

음.. SQLAlchemy를 해보고 있는데 정말 수 많은 도큐먼트와 Q&A를 뒤져가며 설치 했지만 계속


 ImportError: No module named 'MySQLdb'


가 반복한다면  pymysql도 설치한다음

('mysql://'...)

이 부분을

('mysql+pymysql://'..)

이렇게 바꿔보세요.
거짓말처럼 됩니다...-_-...


저작자 표시
신고

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret


에러다!! 또 에러..

msyql-python을 설치하려 했더니 에러가 똬악!!


간단한 해결

1.update

$sudo apt-get update


2. python-dev install

$sudo apt-get install python-dev


3. install 

$sudo pip install mysql-python

저작자 표시
신고

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret



python의 timeit으로 콘솔에서는 쉽게 함수 수행시간을 알수 있지만 콘솔이 아닌 ide 환경이나 파일로 timeit 을 import로 해야 합니다 .


수행하려는 함수가 다음과 같습니다. 


sorting.py 


def insertion():
list = [33, 11, 99, 1, 22, 88, 55, 44, 66, 77]
for i in range(len(list)):
if i+1 < len(list):
pin = i+1
for j in reversed(range(0, pin)):
if list[j] > list[pin]:
list[pin], list[j] = list[j], list[pin]
pin = j
else:
break
return list


다른 파일에서 다음과 같습니다. 

import timeit
print(timeit.timeit("insertion()",
setup="from sorting import insertion", number=100))


timeit() 함수 안에 


첫번째 인자는 해당 함수이름 

두번째 인자는 setup으로 해당 py파일을 지정

세번째 인자는 number로 디폴트로 10000입니다.  (number는 해당 숫자만큼 실행한후 평균값 리턴합니다. 위에선 100번 수행후 리턴)



이제 테스트 시간 측정은 timeit 으로 하시면 됩니다. 




자세한 사항은  : https://docs.python.org/2/library/timeit.html

참 쉽죠?!






저작자 표시
신고

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret


그 유명한 travis ci 를 이제서야 써봤습니다. (요즘 CI에 관심이 많습니다.)


뭐 대부분이 젠킨스를 쓰고 계시겟지만 젠킨스의 단점은 서버가 필요하고 설치를 해야 하는것이죠. (물론 설치가 쉽습니다.)


travis ci 는 github 와 연동하여 자동으로 테스트 할수 있는 서비스 입니다. (더 복잡한 처리도 가능합니다.)


travis는 상당히 많은 언어를 지원해 줍니다.  현재 공식으로 지원해주는 언어만


네. 그냥 다 된다고 보시면 됩니다.


해당 언어마다 테스트 하는 라이블러리는 당연히 다른데요.  지원하는 테스트 라이블러리는 아래와 같습니다. 


  • nose
  • py.test
  • mock
  • wheel



그러면 github 와 travis 연동입니다. 


1. 먼저 https://travis-ci.org/  에서 signup을 눌러 줍니다.



2.  github auth와 연동됩니다. 권한등에 대해서 설명해줍니다. authorize application 버튼을 눌러줍니다.




3. 해당 github에서 레파지토리 리스트를 가져옵니다. 원하는 프로젝트를 클릭하여 switch on 시켜 주면 해당 프로젝트와 연동 끝! (쉽죠?)



4. travis ci 예전 버전에서는 해당 프로젝트마다 settings에 들어가서  webhooks 를 설정해 줘야 되었지만 이젠 자동으로 연계됩니다. 

(젠킨스는 연동하려면 서버 키를 등록시켜 줘야 하지만 github에서 travis 를 잘 연계시켜 줍니다. )



5. 이제 프로젝트에서 travis를 연동시킬 파일이 필요합니다. 

프로젝트에 새파일로 .travis.yml 이름으로 파일을 만듭니다.

그리고 아래와 같이 넣어줍니다. 


language: python
python:
- "3.5"

install:
- pip install pymysql

# command to run tests
script:
- py.test

저의 경우 파이썬 3.5버전.

mysql을 사용해서 pymysql모듈을 설치

테스트는 pytest 를  사용으로 명시한것입니다. 


혹시 프로젝트에 따로 설치 해야 하는 모듈이 있다면 

https://docs.travis-ci.com/user/ci-environment/

여기를 참고하세요.



6. 5번과 같이 한 다음 해당 프로젝트를 github에 푸시 하면 자동으로 웹훅이 발동하여 travis에서 빌드를 시작합니다!!! 오!!!!


7. 이제부턴 필요한 테스트 모듈을 넣어줘서 자동으로 테스트 하게끔 만들어 주면 됩니다. 참 쉽죠?!



- 흠...역시 서버가 도커로 되어 있군요. 빌드 할때마다 도커 인스턴스가 생성되는것을 볼수 있습니다. (오픈 소스이니 자체 서버에 설치해서 도커로 연습할수 도 있겠군요. ㅎ)


Using worker: worker-linux-docker-64e8129c.prod.travis-ci.org:travis-linux-2


- travis 의 자세한 api는 아래를 참조하세요!

https://docs.travis-ci.com/user/trusty-ci-environment/





저작자 표시
신고

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret


해당 문장이 긍정인지 부정인지 판단하는 프로그램~ (실은 홈페이지로 만들려고 했으나..... 한글 형태소 분석에 자원을 너무 많이 써서 서버가 멈추는... 돈이 없어서 가장 성능 낮은 서버를 쓰고 있으니..프로그램 하나 안돌아간......ㅜㅡㅜ)



먼저 조건부 확률은 (https://ko.wikipedia.org/wiki/%EC%A1%B0%EA%B1%B4%EB%B6%80_%ED%99%95%EB%A5%A0 )

확률 공간 Ω에서의 두 사건 A, B에 대해서 P(B) > 0일 때 사건 B가 일어났을 때 사건 A의 조건부 확률은





긍정 부정 두가지 상황이 있으므로 


P(c) = 1/2 

 

P1(x|c) = count(해당 문장에서 긍정 단어 리스트 수 ) / count(전체 긍정 단어 리스트 수 )


P2(x|c) = count(해당 문장에서 부정 단어 리스트 수 ) / count(전체 부정 단어 리스트 수 )



if p1 > p2: 
  
   긍정

else:
 
  부정

이 된다.



자세한 사항은 http://newpower.tistory.com/127 참조



from konlpy.tag import Kkma
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', passwd='123qwe', db='word', charset='utf8')
cur = conn.cursor()
kkma = Kkma()


#조건부 확률 계산
def conditional_probability(test, train_table, all_count, table_count):
    counter = 0
    list_count = []

    #해당 문장이 해당 테이블에 존재 하는지 확인
    for word in test:
        cur.execute("SELECT count(*) as cnt  FROM "+train_table+" where word = '"+word+"'")
        for cnt in cur:
            if int(cnt[0]) > 0:
                counter += 1

        list_count.append(counter)
        counter = 0

    print(list_count)

    cal_list = []
    for j in range(len(list_count)):
        #다음에 * 연산할떄 0이 되지 않기 위해 +1을 해줌
        cal_list.append((list_count[j]+1)/float(table_count+all_count))
    result = 1
    for j in range(len(cal_list)):
        result *= float(round(cal_list[j], 6))

    return_value = float(result)*float(1.0/2.0)
    print(return_value)
    return return_value

# get the data
input_file = open('input.txt', 'r')

list_positive = []
list_negative = []

#형태소 분리
input_line = input_file.readline()
input_kkma = kkma.pos(input_line)

print(input_kkma)

test_output = []
for i in input_kkma:
    test_output.append(i[0])

#긍정 단어 전체 갯수
cur.execute("SELECT count(*) as cnt  FROM positive ")
positive_count = 0
for response in cur:
    positive_count = int(response[0])

#부정 단어 전체 갯수
cur.execute("SELECT count(*) as cnt  FROM negative ")
negative_count = 0
for response in cur:
    negative_count = int(response[0])

# naive bayes 값 계산
result_pos = conditional_probability(test_output, 'positive', positive_count+negative_count, positive_count)
result_neg = conditional_probability(test_output, 'negative', positive_count+negative_count, negative_count)

if result_pos > result_neg:
    print(u'긍정')
else:
    print(u'부정')




결과


" 너는 아름답다."  는 다음과 같이 나옵니다.




끝.

저작자 표시
신고

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret

먼저 


$ sudo pip intall gensim


error!! ndg-httpsclient 관련 패키지를 설치하라고 뜬다.



$ sudo pip install --upgrade ndg-httpsclient


error! ssl 관련 패키지를 설치하라고 뜬다. 


$ sudo apt install libpq-dev python-dev libxml2-dev libxslt1-dev libldap2-dev libsasl2-dev


#include <ffi.h>

                     ^

    compilation terminated.

    error: command 'x86_64-linux-gnu-gcc' failed with exit status 1


해당 파일을 찾을수 없다고 뜬다.. 


$ sudo apt-get install libffi-dev


#include <openssl/e_os2.h>

                               ^

    compilation terminated.

    error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

 해당 파일을 찾을수 없다고 뜬다. 


$ sudo apt-get install libssl-dev


$ sudo pip install --upgrade ndg-httpsclient


$ sudo pip install gensim


error!!!!!

ValueError: list.remove(x): x not in list

    

    ----------------------------------------

  Rolling back uninstall of numpy

Command "/usr/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-15qfrQ/numpy/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-ok5VqF-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-15qfrQ/numpy/


--이젠 방법을 모르겠다. 에러조차 너무 광법위하고 읽을수가 없음.


easy_install pip==1.2.1 로 변경

easy_install --upgrade gensim


헐..된다.. (공식 홈페이지에선 easy_install시 ssl 과 numpy를 설치하라고 써있는데 위에서 설치하여 따로 할 필요는 없다.)

...당혹스럽지만 pip버전을 낮춰서 하던지 아니면 easy_install로 설치하는것을 추천;;;(이것때문에 몇시간을...)





저작자 표시
신고

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret

프로젝트하는 도중 재미있는 현상을 발견하여 글을 써 봅니다. 


서로 발급된 키로 sha1으로 암호화 하여 통신하는 api를 개발하는 도중 java 와 python의 sha1의 값이 다르게 나오는것을 발견하였습니다. 


아래는 java의 sha1 암호화의 기본 소스 입니다. 



import java.security.MessageDigest;
import java.security.Security;
import java.security.NoSuchAlgorithmException;


public class HelloWorld{
     public static void main(String []args) throws NoSuchAlgorithmException{

         String return_sha1 = makeSHA("81014614b19daf89e35c46ee299ff7ff1c2239e0641874ab");

        System.out.println(return_sha1);
     }

     public static String makeSHA(String inputText) throws NoSuchAlgorithmException{

      String test = inputText;
      MessageDigest md = MessageDigest.getInstance("SHA-1");
      md.update(test.getBytes());
      byte[] digest = md.digest();


      StringBuffer sb = new StringBuffer();
      
      for(byte b : digest){
       sb.append(Integer.toHexString(b & 0xff));
      }

      return sb.toString();
     }
}


그리고 해당 결과 값은 "4728865bb77267f77ddac8d7dbb579f447d27c" 가 나옵니다. 


다음엔 python의 소스 입니다.



import hashlib
m = hashlib.sha1()
str_sha1 = "81014614b19daf89e35c46ee299ff7ff1c2239e0641874ab"
m.update(str_sha1)
print m.hexdigest()

python의 결과 값은 "47028865bb77267f77ddac8d7dbb579f4407d27c" 가 나옵니다. 


java        4728865bb77267f77ddac8d7dbb579f447d27c

python   47028865bb77267f77ddac8d7dbb579f4407d27c


자세히 보시면 java에서 두자리가 나오지 않은것을 확인할수 있습니다.


해당 이슈는 java의 암호화 방식에 있습니다. 

java에서 sha1으로 암호화시 byte->hex로 변환하지만 해당 변환이 암호화된 값이라 다르게 표현됩니다. 

반면 인터프린터 언어(python포함)에서는 string 자체를 sha1으로 변환해주기 때문에 위와 같이 sha1으로 암호화 했어도 다른 값이 나오게 됩니다. 


이런 경우를 대비해서 java에 소스를 추가해 주시면 됩니다. 



import java.security.MessageDigest;
import java.security.Security;
import java.security.NoSuchAlgorithmException;
import javax.xml.bind.DatatypeConverter;
import javax.xml.bind.DatatypeConverter.*;

public class HelloWorld{
     public static void main(String []args) throws NoSuchAlgorithmException{

         String return_sha1 = makeSHA("81014614b19daf89e35c46ee299ff7ff1c2239e0641874ab");
        System.out.println(return_sha1);
     }
     
     public static String makeSHA(String inputText) throws NoSuchAlgorithmException{

      String test = inputText;
      MessageDigest md = MessageDigest.getInstance("SHA-1");
      md.update(test.getBytes());
      byte[] digest = md.digest();
      String result = DatatypeConverter.printHexBinary(digest);

      return result;
     }
}

위의 소스로 변경하면 정상적으로 "47028865BB77267F77DDAC8D7DBB579F4407D27C" 을 출력합니다. 


추가한 소스는 javax의 DatatypeConverter으로 xml의 데이터 변환에 사용되는 함수 입니다. 

해당 함수를 사용하면 기존의 byte->hex 변환 필요 없이 sha1의 데이터를 가져 올수 있습니다. 


- java간의 통신이라면 굳이 수정할 필요는 없습니다.

- 위의 방법을 쓰지 않으면 sha1의 키값에 따라 정상적으로 나올수도 아닐수도 있습니다. (결과값에서 byte->hex 변환시 달라질수 있기 때문입니다.)

저작자 표시
신고

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret



JetBrains edit is do not have font size control in that menu.


so YOU use keymap font size and that contorl font size.

1 . menu->preferences->keymap


2. search font and Editor Actions->Decrease Font Size / Increase Font Size setting(double click) Add Keyboard Shortcut. 


3. and YOU setting key it worked!

 


저작자 표시
신고

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret





from operator import itemgetter


temp_list = []

temp_dict = dict()

temp_dict["status"] = 1

temp_list.append(temp_dict)

temp_dict = dict()

temp_dict["status"] = 10

temp_list.append(temp_dict)

 sorted(temp_list, key=itemgetter('status'), reverse=True)





저작자 표시
신고

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret