반응형

Python 2.7 Single Linked list 구현


참고자료 : starmooc.kr kaist 문일철 교수 데이터구조 및 분석 인강


class Node:

value = ''

nextnode = ''

binhead = False

bintail = False


def __init__(self, value='', nextnode='', binhead=False, bintail=False):

self.value = value

self.nextnode = nextnode

self.binhead = binhead

self.bintail = bintail

def getValue(self):

return self.value

def setValue(self, value=''):

self.value = value

def getNext(self):

return self.nextnode

def setNext(self, nextnode=''):

self.nextnode = nextnode

def isTail(self):

return self.bintail

def isHead(self):

return self.binhead




class SinglyLinkedlist:

nodehead = ''

nodetail = ''

size = 0


def __init__(self):

self.nodetail = Node(bintail = True)

self.nodehead = Node(binhead = True, nextnode = self.nodetail)

def insertAt(self, objInsert, idxInsert):

nodeNew = Node(value=objInser)

nodePrev = self.get(idxInsert - 1)

nodeNext = nodePrev.getNext()

nodePrev.setNext(nodeNew)

nodeNew.setNext(nodeNext)

self.size = self.size+1

def removeAt(self, idxRemove):

nodePrev = self.get(idxRemove - 1)

nodeRemove = nodePrev.getNext()

nodeNext = nodeRemove.getNext()

nodePrev.setNext(nodeNext)

self.size = self.size - 1

return nodeRemove.getValue()

def get(self, idxRetrieve):

nodeReturn = self.nodeHead

for itr in range(idxRetreve + 1):

nodeReturn = nodeReturn.getNext()

return nodeReturn

def printStatus(self):

nodeCurrent = self.nodehead

while nodeCurrent.getNext().isTail() == False:

nodeCurrent = nodeCurrent.getNext()

print nodeCurrent.getValue(),

print

def getSize(self)

return self.size


반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python]sqlalchemy 사용법  (0) 2022.12.07
[PYTHON] 파이썬 함수 매개변수  (0) 2022.08.11
[Python] flask_restful fields  (0) 2021.10.08
창원시 버스 API 사용하기  (1) 2016.02.22
반응형

Opensource python chatbot : ChatterBot 


Opensource url : https://github.com/gunthercox/ChatterBot


실행 환경 : Ubuntu 16.04.3 LTS


설치 방법 : Terminal에 pip install chatterbot 입력. (pip 설치를 따로 해야됨)


* 한글입력을 하기 위해 Ubuntu 한글 세팅을 미리 해줘야 함.


한글 지원이 안되기 때문에 한글 데이터를 추가 해줘야 함.

  ~/.local/lib/python2.7/site-package/ 경로에 chatterbot library가 설치됨.

  ~/.local/lib/python2.7/site-package/chatterbot_corpus/data 경로에 korean 폴더를 만든 후 english폴더 내 있는 파일들 중 .json 파일과 .yml 파일 형식에 맞게 한글로 된 파일을 만들어 추가한다.


실행 소스

# -*- coding: utf-8 -*-

from chatterbot import ChatBot

from chatterbot.trainers import ChatterBotCorpusTrainer

chatbot = ChatBot(

"Name",

input_adapter = 'chatterbot.input.TerminalAdapter',

output_adapter = 'chatterbot.output.TerminalAdapter'

)

chatbot.set_trainer(chatterBotCorpusTrainer)

chatbot.train("chtterbot.corpus.korean")

while True:

try:

b = chatbot.get_response(None)

except(KeyboardInterrupt, EOFError, SystemExit):

break


위 소스를 실행시키면 한국어가 되는 chatterbot이 실행된다.

하지만 원활한 대화를 하기 위해서는 많은 양의 korean corpus data가 필요하다.

실행하면 sqlite로 대화했던 내용과 corpus data에 없는 내용이 입력되면 자동적으로 데이터를 추가하여 답변을 해준다. 하지만 그 답변은 내가 이전에 사용한 대화 내용 중에 있는 내용이다.


위 방식 말고도 다양하게 corpus데이터를 학습하는 방법이 github project에 소개되어 있다.

반응형
반응형

//숫자외 입력을 받으면 새로 입력을 받게한다. 숫자 입력받을 시 프로그램 종료.


#include "iostream"

using namespace std;


void main()

{

int num=0;

cout << "숫자를 입력하세요;" << endl;

while (!(cin >> num)) {

cin.clear();

cin.ignore(INT_MAX,'\n');

cout << "잘못된 값을 입력하셨습니다. 숫자만 입력해주세요.\n";

}

}


실행환경 : Visual studio 2017 C++ / Windows 10


반응형

'프로그래밍 > C/C++' 카테고리의 다른 글

패킷과 구조체 그리고 패딩비트  (0) 2019.05.09
[C++] STL(Standard Template Library)  (0) 2017.04.17
반응형

C++에는 표준 템플릿 라이브러리라는 STL이 있다.


STL 구성


Sequence containers: 연속된 자료형


Container adaptors: 자료구조


Associative containers: key:value 형식의 자료형


Unordered associative containers: 순서 없는 컨테이너(자바 hash랑 비슷?)


* 참조 사이트 : http://www.cplusplus.com/reference/stl/

반응형

'프로그래밍 > C/C++' 카테고리의 다른 글

패킷과 구조체 그리고 패딩비트  (0) 2019.05.09
[C++] 숫자만 입력받기 예제  (0) 2017.04.24
반응형

CSS Display 속성

- 어떤 식으로 요소를 보여줄지 설정하는 property


속성 값

inline : 기본값으로 일반적으로 표시된다. <span> 태그와 유사.

block : 대상 좌우로 줄바꿈 된다. <p> 태그와 유사

inline-block : block 형식으로 된 대상이 inline값 처럼 표시됩니다.

table : <table>태그처럼 표시

table-row : <tr>태그처럼 표시

table-column : <col>태그처럼 표시

tatble-cell : <td>태그처럼 표시

table-header-group : <thead>태그처럼 표시

table-row-group : <tr>태그처럼 표시

inherit : 부모 요소의 표시값을 상속받는다.



반응형
반응형

class BUS():

        def __init__(self):

                self.key = "KQdls/1w4hLXiAkOO8N46/1rvqV26sMnIvRYj1cg75yCl5aR9yRRJtMkxeOJ8Zx2MlKIVajs4ZVJMrNEgnGOUA=="; # 창원시 버스 API홈페이지 샘플 key사용.

                self.url = "http://openapi.changwon.go.kr/rest/bis/"

# 문서로 저장된 기반정보 열기

                BusI2N = open("./howie/BusID-NM.txt","r") 

                BusN2I = open("./howie/BusNM-ID.txt","r")

                StatI2N = open("./howie/StationID-NM.txt","r")

                StatN2I = open("./howie/StationNM-ID.txt","r")


                self.BusI2N_dic = {}


                self.BusN2I_dic = {}


                self.StatI2N_dic = {}


                self.StatN2I_dic = {}




                for BIN in BusI2N:

                        tmp = BIN.split(':')

                        self.BusI2N_dic[tmp[0]] = tmp[1].replace('\n','')


                for BNI in BusN2I:

                        tmp = BNI.split(':')

                        self.BusN2I_dic[tmp[0]] = tmp[1].replace('\n','')


                for SIN in StatI2N:

                        tmp = SIN.split(':')

                        self.StatI2N_dic[tmp[0]] = tmp[1].replace('\n','')


                for SNI in StatN2I:

                        tmp = SNI.split(':')

                        self.StatN2I_dic[tmp[0]] = tmp[1].replace('\n','')



        def station(self,station):

                station = station.replace(" ","")

                if station not in self.StatN2I_dic.keys():

                        print "no station"

                        return


                station = self.StatN2I_dic[station]

                full = self.url + "BusArrives/?serviceKey=" + self.key + "&station="+station       # 정류장 도착정보 url

 data = requests.get(full).content                                                                        # requests라이브러리를 사용하여 xml 데이터 획득


                temp = minidom.parseString(data)                                                                     #  minidom라이브러리를 사용하여 스트링 파싱


                row = temp.getElementsByTagName('row') # row요소를 찾는다


                arrive_set = set()


                for el in row:

                        TMP = el.getElementsByTagName('ROUTE_ID')[0].childNodes[0].data        # row안 ROUTE_ID를 찾아 저장된 값을 얻는다.

                        if TMP in self.BusI2N_dic.keys():

                                arrive_set.add(self.BusI2N_dic[TMP])


                return arrive_set

반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python]sqlalchemy 사용법  (0) 2022.12.07
[PYTHON] 파이썬 함수 매개변수  (0) 2022.08.11
[Python] flask_restful fields  (0) 2021.10.08
Single Linked list 구현  (0) 2018.03.22
반응형

JavaScript에서 xml문서를 파싱하는 방법



DOM파서 이용

DOM파서는 xml파일을 읽을때 문자열로 읽어져서 그 문자열을 xml객체로 만들어줄 때 사용한다.

var parser = new DOMParser();

xmlDoc = parser.parseFromString(text,"text/xml"); //text에 xml파일에서 읽은 문자열들이 들어있다.


XML객체에서 데이터를 얻는 방법

xmlObject.documentElement;    //xml 객체에서 문서 요소를 얻는다.

xmlObject.documentElement.childNodes // 얻은 문서 요소 내 하위 노드들을 가진다.


위 방법처럼 계속 하위노드들을 파고들어 필요한 내용을 얻을 수 있다.


다른 방법으로는 xml문서를 object나 json 객체로 바꿔서 xml 객체 내 정보들을 이용할 수 있다.


네이버에서 제공해주는 xml문자열 파싱 함수

네이버에서 제공해주는 xml문자열을 Object로 바꿔주는 함수이다. 파라미터로 xml형식으로 된 문자열을 넣어주면 된다.

이 함수는  CDATA로 value가 선언된 xml 형식 문자열에서 사용해야한다.

알아보니 한국 웹 사이트에서 사용되는 xml문서들은 CDATA형식이지만 외국 사이트에서 제공해주는 xml 문서는 제대로 작동 안될 수 도 있다.


    var JINDO = new Object();

    JINDO.xml2obj = function(xml) 

    { 

        var obj = {}, que = [], depth = 0;


        // attribute를 해석하기 위한 함수        

        var parse_attr = function(oobj, str) {

                str.replace(/([^=\s]+)\s*=\s*"([^"]*)"/g, function(a0,a1,a2) {

                        oobj[a1] = a2;

                });

        }

        

        // 주석, XML선언, 태그 사이 공백 등의 의미 없는 코드를 삭제

        xml = xml.replace(/<(\?|\!-)[^>]*>/g,'').replace(/>\s+</g, '><');

        

        // 하위 노드가 없는 태그는 하나의 닫힌 태그로 수정

        xml = xml.replace(/<([^!][^ >]+)(\s[^>]*)?><\/\1>/g, '<$1$2 />').replace(/^\s+|\s+$/g, '');


        // 함수 객체를 정규 표현식 처리의 인자로 줘서 iterator로 사용

        xml = xml.replace(/<\/?([^\!][^ >]*)(\s[^>]*)?>(<\/$1>|<\!\[CDATA\[(?:(.|\s)*?)\]\]>|[^<>]*)/g, function(a0,a1,a2,a3)

        {

                // IE에서 일치하는 내용이 없으면 undefined로 전달되므로

                // 빈 문자열로 변경해 다른 브라우저와의 호환성을 맞춤

                if (typeof a1 == 'undefined') a1 = '';

                if (typeof a2 == 'undefined') a2 = '';

                if (typeof a3 == 'undefined') a3 = '';

                

                if (a0.substr(1,1) == '/') { // 현재 태그가 닫는 태그라면,

                        // 깊이를 1만큼 감소 

                        depth--;

                } else if (que.length == 0) { // 객체 큐에 객체가 없다면,

                        que[depth] = obj; // 초기의 객체를 큐에 넣고

                        parse_attr(obj, a2); // attribute를 해석

                } else {

                        var k  = a1, o = {}, is_closed = false;

                        

                        is_closed = (a2.substr(-1,1) == '/');

                        if (a3.length > 0 || is_closed) { // 텍스트 노드가 있다면

                                o = a3; // 추가할 객체는 문자열 객체

                                

                                // CDATA라면 전달받은 그대로 리턴하고

                                // 그렇지 않다면 decode 해서 리턴

                                if (o.substr(0,9) == '<![CDATA[' && o.substr(-3,3) == ']]>') o = o.substring(9, o.length-3);

                                else o = o.replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&');

                        }

                        

                        // 객체를 할당하기 전에 태그 이름이 이미 존재하는지 살펴보고

                        // 이전에 존재하는 태그라면, 배열로 만든다. 이미 배열이라면 현재의 객체를 배열에 추가

                        if (typeof que[depth][k] == 'undefined') {

                                que[depth][k] = o;

                        } else {                                

                                var v = que[depth][k];

                                if (que[depth][k].constructor != Array) que[depth][k] = [v];

                                que[depth][k].push(o);

                        }


                        // attribute를 해석

                        parse_attr(o, a2);

                        

                        if (!is_closed) que[++depth] = o;       

                }

                

                return '';

        });

        return obj;

    }


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

구글에서 검색해서 찾은 xml 객체를 JSON으로 바꿔주는 함수

이 함수는 xml 문서를 Json객체로 바꿔주는 함수이다.


function xmlToJson(xml) 

{    

    // Create the return object

    var obj = {};


    if (xml.nodeType == 1) { // element

        // do attributes

        if (xml.attributes.length > 0) {

        obj["@attributes"] = {};

            for (var j = 0; j < xml.attributes.length; j++) {

                var attribute = xml.attributes.item(j);

                obj["@attributes"][attribute.nodeName] = attribute.nodeValue;

            }

        }

    } else if (xml.nodeType == 3) { // text

        obj = xml.nodeValue;

    }


    // do children

    if (xml.hasChildNodes()) {

        for(var i = 0; i < xml.childNodes.length; i++) {

            var item = xml.childNodes.item(i);

            var nodeName = item.nodeName;

            if (typeof(obj[nodeName]) == "undefined") {

                obj[nodeName] = xmlToJson(item);

            } else {

                if (typeof(obj[nodeName].push) == "undefined") {

                    var old = obj[nodeName];

                    obj[nodeName] = [];

                    obj[nodeName].push(old);

                }

                obj[nodeName].push(xmlToJson(item));

            }

        }

    }

    return obj;

};


반응형

'웹 프로그래밍 > JavaScript' 카테고리의 다른 글

window.onload vs $(document).ready() vs $(window).load()  (0) 2018.10.16
JavaScript xml 사용  (0) 2016.01.27
JavaScript 함수 선언  (0) 2016.01.04
반응형

처음 FreeNas를 이용했을 때 CentOS와 비슷하다고 생각해 설정을 변경할때 그냥 /etc/폴더에서 변경하였다.

그런데 이게 어찌된 일인지 바뀐 설정이 다시 원래대로 복구 되는 경우가 생겨 계속 다시 변경해줘야하는 경우가 있었다.

이게 왜 그런지 알아보니 FreeNas는 /conf/base/etc/라는 폴더에 있는 설정을 바꿔줘야 한다고 한다.

추측컨데 재부팅 될 때랑 어느 시점마다 /conf/base/etc/를 /etc/에 붙여넣는것 같다.


기본 설정 변경

/conf/base/etc /


일시적으로 설정 변경

/etc/

반응형
반응형


자바스크립트에서 Api를 사용하기 위해 xml를 사용해야 하는 경우가 있다.


function Xml(){

var xmlHttp = new XMLHttpRequest();    //xml 요청을 받을 변수를 선언해서 만든다.

xmlHttp.open("GET","http://openapi.naver.com/search?key="+NAVER_SEARCH_API_KEY+"&query="+targetSearch+"&target=news&start=1&display=6",false);    //open함수로 xml문서를 받아온다.

xmlHttp.send(null);

console.log("XML",xmlHttp);    //로그를 찍어 잘 받아왔는지 확인.

}


NAVER_SEARCH_API_KEY는 네이버에서 발급받은 검색 API 인증키이다.

targetSearch는 검색할 검색어이다.

위 방법은 네이버 검색 API에서 xml문서를 받아올 때 사용하는 저가 찾은 방법입니다.

반응형

'웹 프로그래밍 > JavaScript' 카테고리의 다른 글

window.onload vs $(document).ready() vs $(window).load()  (0) 2018.10.16
JavaScript xml 파싱  (0) 2016.02.05
JavaScript 함수 선언  (0) 2016.01.04
반응형

자바 JTable을 사용하다보면 안에 있는 자료길이가 길어 셀에서 ...으로 먹히는 경우가 있는데 최대한 그런 경우가 발생하지 않게 하기 위해 하는 함수를 소개한다.


public void resizeColumnWidth(JTable table) {
    final TableColumnModel columnModel = table.getColumnModel();
    for (int column = 0; column < table.getColumnCount(); column++) {
        int width = 50; // Min width
        for (int row = 0; row < table.getRowCount(); row++) {
            TableCellRenderer renderer = table.getCellRenderer(row, column);
            Component comp = table.prepareRenderer(renderer, row, column);
            width = Math.max(comp.getPreferredSize().width +1 , width);
        }
        columnModel.getColumn(column).setPreferredWidth(width);
    }
}


위 소스를 사용하면 자동으로 내용 길이에 맞춰 JTable column 넓이를 조절해 준다.

반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

Gradle  (0) 2023.09.04
Titleborder 색 변경  (0) 2015.12.27
[팁] JarBundler 이용법.  (0) 2015.12.08
[팁] application bundle 위치  (0) 2015.12.08
JAVA L&F(Look & Feel)  (0) 2015.12.05

+ Recent posts