728x90
반응형

6003 : [기초-출력] 출력하기03(설명)(py) 

시간 제한: 1 Sec  메모리 제한: 128 MB

 

 

문제 설명

 

이번에는 줄을 바꿔 출력하는 출력문을 연습해보자.
다음과 같이 줄을 바꿔 출력해야 한다.

Hello
World
(두 줄에 걸쳐 줄을 바꿔 출력)

 

입력

 

입력 없음

 

출력

 

Hello
World

 

내 소스

 

print("Hello")
print("World")

 

모범 답안

 

print("Hello")
print("World")

'''
또는

print("Hello\nWorld")
'''
728x90
반응형
728x90
반응형

이클립스 server를 돌리는데 이런 오류가 떴다. 이클립스 말고도 오라클에서 이런 오류가 뜰 수 있는데

 

이럴때는 이런 방법을 사용하면 된다.

 

서비스 - OracleXE, OracleXETNSListener 확인

 

window+R -> services.msc  

또는 검색 - 서비스 입력한다.

 

OracleXE와 Listener 가 정상 실행 중인지 확인 하고 다시 시작을 누른다!

 

다시시작을 해도 작동이 안될 수도 있는데 이럴때는 cmd에서 확인한다.

 

cmd에서 확인 

 

관리자 모드로 실행하여  lsnrctl status을 입력한다. -> 리스터 상태 확인

 

 lsnrctl status

 

successfully가 나오면 된다.!

 

에러뜰 때 화면
연결되었을 때 화면

 

728x90
반응형
728x90
반응형

It's likely that neither a Result Type nor a Result Map was specified. 라는 오류가 떴다.

 

1. It's likely that neither a Result Type nor a Result Map was specified.

 -> ResultType이나 ResultMap이 없다

2.  A query was run and no Result Maps were found for the Mapped Statement 

 -> 쿼리문은 실행이 되었으나 ResultMap이 없다


SELECT로 결과 값을 가져 왔으면 그것을 출력하기 위해 타입을 맞춰줘야 한다.


변경전

 

변경후

 

나의 경우에는 parameterType -> resultType로 바꿔주니 정상작동하였다.

 

정리

 

select -> resultType

insert -> parameterType
728x90
반응형
728x90
반응형

org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2라는 문구와 함께 파라미터를 발견못한다는 오류가 떴다.

 

 

수정 전

 

수정 후

 

컴파일러가 파라미터를 발견을 못해서 이렇게 직접 파라미터 명시를 해줘야 한다.

 

@Param으로 안될 때는 @RequestParam으로 바꾸면 될 것이다.

728x90
반응형
728x90
반응형

이 포스팅은 html을 화면에 띄우기 까지 자세한 동작 과정을 설명하기 위해 작성되었다.

 

settings에 대한 건 지난 포스팅에 했던 파일에 이어서 했기 때문에 참고하면 좋을 것 같다.

 

 

2021.06.07 - [BACK-END/Django] - [Django] 파이참 설치하고 장고 개발 서버 실행하기

 

[Django] 파이참 설치하고 장고 개발 서버 실행하기

2021.06.07 - [BACK-END/Django] - [Django] cmd로 가상환경 만들기 / 기본환경셋팅 [Django] cmd로 가상환경 만들기 / 기본환경셋팅 cmd를 이용하여 Django에 필요한 가상환경을 만들것이다. 파이썬이 있어야한다..

hello-ming.tistory.com


터미널에 아래의 코드를 치면 hello_world라는 app이 만들어 진다.

 

python manage.py startapp hello_world

 

 

파일이 생성됨을 확인할 수 있다.

 

 

apps에 들어가면 HelloWorldConfig 클래스가 자동 생성됨을 확인할 수 있는데 

 

,

 

mysite - settiings에 자동으로 등록이 안되므로 아래 사진처럼 직접 추가해 준다.

 

 

이전 포스팅에 생성한 mysite(프로젝트) - urls.py에 path를 이용하여 hello_world를 추가한다.

 

hello_world로 들어오면 include로 hello_world앱에 밑에있는 urls.py를 찾는다는 뜻이다.

 

위 말대로 urls.py에 이동하기 위해 hello_world 파일안에 urls.py를 만들어준다.

 

hello_world/urls.py

from django.urls import path

from hello_world import views

app_name = 'hello_world'
urlpatterns=[
    path('',views.hello_world, name='hello_world'), #views안의 hello_world파일과 연결

]

views 밑에 hello_word 함수로 들어온다는 뜻이다.

 

view 파일에 hello_world 함수를 만든다.

 

hello_world/views.py

from django.shortcuts import render

# Create your views here.
def hello_world(request):
    return render(request,'hello_world/hello_world.html',{})

request가 들어오면 hello_world폴더 안에 hello_word.html을 반환한다.

 

 

hello_world.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
안녕하세요?
</body>
</html>

 

서버를 돌린다.

 

브라우저가 뜨자마자 이 화면이 뜨는데 /hello_world/를 붙여주면 된다!

 

 

hello_world.html의 화면과 동일하게 나왔다.

 

728x90
반응형
728x90
반응형

2021.06.09 - [BACK-END/Django] - [Django] (투표하기)-모델 만들기 / makemigrations / migrate

 

[Django] (투표하기)-모델 만들기 / makemigrations / migrate

2021.06.08 - [BACK-END/Django] - [Django] admin 커스터마이징 / MySQL 연동 [Django] admin 커스터마이징 / MySQL 연동 2021.06.07 - [BACK-END/Django] - [Django] 파이참 설치하고 장고 개발 서버 실행하기 [..

hello-ming.tistory.com

 

전 포스팅에서 Questions와 Choices 모델을 만들었다. 지난 포스팅에 이어 계속해서 Django 공식 튜토리얼을 토대로 참고 자료로 내용을 덧붙여 포스팅하도록 하겠다.


이번에 추가할 뷰는 총 네 가지이다.

 

1. index : 최근의 질문들을 표시한다.

 

2.  detail : 질문 내용과 투표할 수 있는 서식을 표시한다.

 

3.  results : 특정 질문에 대한 결과를 표시한다.

 

4.  vote : 질문에 대해 선택을 할 수 있는 투표 기능을 제공한다.

 

from django.http import HttpResponseRedirect
from django.shortcuts import render, get_object_or_404

# Create your views here.
from django.urls import reverse

from polls.models import Question, Choice


# 함수 형 view , 클래스형 view
def index(request):
    latest_question_list = Question.objects.all().order_by('-pub_date')[:5]
    context = {'latest_question_list': latest_question_list}
    return render(request, 'polls/index.html', context)

def detail(request, question_id):
    question = get_object_or_404(Question,pk=question_id)
    return render(request,'polls/detail.html',{'question':question})

def results(request, question_id):
    question = get_object_or_404(Question,pk=question_id)
    return  render(request, 'polls/results.html',{'question':question})
def vote(request, question_id):
    question =get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except(KeyError ,Choice.DoesNotExist):
        #질문 투표 형식을 다시 표시함
        return render(request, 'polls/detail.html',{
            'question':question,
            'error_message':'당신은 선택한 항목이 없습니다.'
        })
    else :
        selected_choice.votes +=1
        selected_choice.save()
        return HttpResponseRedirect(reverse('polls:results',args=(question.id,)))

 

[코드 설명]

 

index

새로운 index() 뷰 하나를 호출했을 때, 시스템에 저장된 최소한 5개의 투표 질문이 콤마로 분리되어, 발행일에 따라 출력된다.

polls/index.html 템플릿을 불러 온 후, context를 전달한다. context는 템플릿에서 쓰이는 변수명과 Python 객체를 연결하는 사전형 값이다. 


vote

Post 데이터를 성공적으로 처리가 된 후 HttpResponseRedirect를 반환한다.

이것은 사용자가 back 버튼을 누르면 두 번 글이 등록되는 것을 방지하기 위해서 이다.

reverse는 url을 해당 url을 찾을 때 사용함 기본적으로 url을 가지고 이동하는데 반대로 url을 찾아야 하므로 거꾸로라는 reverse를 호출한다.


 

URLconf를 통해 URL 패턴을 뷰에 연결하는 작업이 필요하므로 path() 함수를 이용해 호출을 추가하여 작성한 새로운 뷰를 polls.urls 모듈에 연결한다.

 

polls/urls.py를 생성해서 내용을 추가한다.

from django.urls import path

from polls import views

app_name = 'polls'
urlpatterns=[
    path('',views.index, name='index'), #views안의 index파일과 연결
    path('<int:question_id>/', views.detail, name='detail'),
    path('<int:question_id>/results/', views.results, name='results'),
    path('<int:question_id>/vote', views.vote, name='vote'),
]

 

runserver를 돌려 /admin으로 접속한다.

Choices와 Questions에 각각 +add 를 눌러 항목을 만든다.

 

 

그리고 또한 MySQL에서 Question을 생성할 수 있다.

 

 


디자인을 위해 templates를 작성할 것이다.

 

polls - templates - polls 디렉토리를 생성한 후 detail.html,  index.html, results.html을 생성한다.

 

index.html

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>가능한 여론(polls)가 없어요</p>
{% endif %}

 웹 브라우저에 "/polls/"페이지를 불러오면 이전에 작성한 질문이 포함된 질문 리스트가 표시된다. 각 질문 링크는 해당 질문에 대한 세부 페이지를 가리키고 있다.

 

detail.html

<h1> {{ question.question_text}}</h1>
{% if error_message  %}<p> <strong> {{error_message}} </strong></p> {% endif %}

<form action ="{% url 'polls:vote' question.id %}" method="post">
    {% csrf_token %}
    {% for choice in question.choice_set.all %}
        <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}"/>
        <label for="choice{{ forloop.counter }}"> {{ choice.choice_text }}</label> <br/>
    {% endfor %}
    <input type="submit" value="Vote"/>
</form>

■ 각 질문 선택 항목를 라디오 버튼으로 표시한다. 각 라디오 버튼의 value는 연관된 질문 선택 항목의 ID이다. 각 라디오 버튼의 name은 "choice"이므로 누군가가 라디오 버튼 중 하나를 선택해 폼을 제출하면, POST 데이터인 choice=#을 보낼 것이다. 여기서 #은 선택한 항목의 ID이다.

 

■ 폼의 action을 {%url 'polls:vote' question.id%}로 설정하고 method="post"를 설정한다(metho="get"이 아니라). method="post"를 사용한다는 점이 굉장히 중요하다. 그 이유는 폼의 송신은 서버쪽의 데이터의 갱신으로 연결되기 때문이다. 서버쪽의 데이터를 갱신하는 폼을 작성할 경우는 method="post"을사용하자. 이것은 장고 고유의 특징이 아닌 웹 개발에 전체에 통용되는 것이다.

 

■ forloop.counter은 for태그의 루프가 몇 번 실행되었는지 표시하는 값이다.

 

■ (데이터가 변조될 위험이 있는) POST 폼을 작성하고 있으므로, Cross Site Request Forgeries에 대해 신경써야할 필요가 있다. 다행히도, 장고가 이에 대해 대응하기 위해 사용하기 쉬운 구성품을 제공하고 있으므로 그렇게 걱정할 필요는 없다. 짧게 말하자면, 내부 URL 대상의 모든 POST 폼은 {% csrf_tokem %} 템플릿 태그를 써야한다. 

 

results.html

<h1>{{ question.question_text}}</h1>
<ul>
    {% for choice in question.choice_set.all %}
        <li> {{ choice.choice_text }} -- {{ choice.votes }} vote {{ choice.votes | pluralize }} </li>
    {% endfor %}
</ul>

<a href="{% url 'polls:detail' question.id %}">다시 투표하실래요?</a>

 

웹 브라우저의 /polls/1/ 페이지에서 투표를 할 수 있을 것이고 투표할 때마다 값이 반영된 결과 페이지를 확인할 수 있다.

 

만약 투표를 하지 않았다면 오류 메시지를 확인할 수 있을 것이다. 

[ 동작 화면 ]

 

728x90
반응형
728x90
반응형

python manage.py makemigrations 하는데 오류가 떴다...

no changes detected

 

에러 발생 이유

연동된 database에서 변경된 부분이 없을 때 발생한다고 한다...

 

해결방법

 

setting.py의 INSTALLED_APPS에 추가해주면 된다. 

polls.apps.PollsConfig

나는 위의 코드를 추가해 주었고

 

polls 파일 안에 있는 apps.py에 polls가 있는지 확인한다. 없으면 추가하면 된다!

 

 

터미널에 이제 해보면 되는데  기존 방식과의 차이점은 뒤에 polls를 붙이는 것이다.

python manage.py makemigrations polls

 

 

이렇게 하면 될 것이고

 

 

 

migrate 마저 해주면 

 

해결될 것이다!

728x90
반응형
728x90
반응형

 

* 본 포스팅은 주피터 노트북에서 진행하였다.

 

!pip install matplotlib
import matplotlib.pyplot as plt
data = [1,2,3,4,3,2,1]
plt.figure('그래프 이름')
plt.plot(data)
plt.show()

 

import matplotlib.pyplot as plt
x = [10, 20, 30, 40, 50, 60, 70]
y = [1,2,3,4,5,2,1]
plt.figure('그래프 이름')
plt.plot(x,y)
plt.show()

 

 

import matplotlib.pyplot as plt
import numpy as np
time = np.arange(0,10,0.01)
y = np.sin(time)
plt.figure('그래프 이름')
plt.plot(time,y)
plt.show()

 

이 코드의 arange는 0부터 10까지 0.01간격으로 등분

 

 

import matplotlib.pyplot as plt
import numpy as np
time = np.arange(0,10,0.01)
sin_y = np.sin(time)
cos_y = np.cos(time)
plt.figure('그래프 이름')
plt.plot(time,sin_y)
plt.plot(time,cos_y)
plt.show()

 

import matplotlib.pyplot as plt
import numpy as np
time = np.arange(0,10,0.01)
sin_y = np.sin(time)
cos_y = np.cos(time)
plt.figure('sin, cos 그래프')
plt.plot(time,sin_y, label='sin')
plt.plot(time,cos_y,label='cos')
plt.legend() #범례
plt.xlabel('time')
plt.ylabel('value')
plt.title('sin, cos Grapeh') #그래프 이름
plt.grid() #그리드 설정
plt.show()

 

import matplotlib.pyplot as plt #막대 그래프
import numpy as np
data=[10,20,30,55]
x=[0,1,2,3]
plt.bar(x,data,width=0.3)
plt.show()

 

가로형 막대 랜덤 으로 생기기

 

1.

import matplotlib.pyplot as plt #막대 그래프
import numpy as np
y_data = []
x_data = []
for i in range(6):
    x_data.append(i)
    y_data.append(np.random.rand()*20)
plt.bar(x_data, y_data,width=0.5)
plt.show()

 

2.

import matplotlib.pyplot as plt #막대 그래프
import numpy as np
a = np.random.random(4)
data = np.random.random(4)
plt.bar(a,data,width=0.1)

 

가로형 막대 그리기

import matplotlib.pyplot as plt #막대 그래프
import numpy as np
data=[10,20,30,5]
x=[1,2,3,4]
plt.barh(x,data,height=0.3)
plt.show()

 

원형 그래프 그리기

import matplotlib.pyplot as plt #막대 그래프
import numpy as np
data=[10,20,30,5]
plt.pie(data)
plt.show()

728x90
반응형
728x90
반응형

* 본 포스팅은 주피터 노트북에서 실행하였다.

 

txt, csv 파일을 만들 것이다.

 

txt 저장

file = open('1.txt','w')
file.close()
pwd

에 위치한 곳에 1.txt로 저장이 된다.

 

 

들어가보면 빈 화면인데 이것의 내용을 with 키워드로 채워보자!

 

with open('1.txt','w') as f:
    f.write("사랑\n")
    f.write("믿음\n")
    f.write("증오\n")

 

실행시키고 아까 봤던 1.txt 파일을 열어보면 

 

이제 응용으로 블로그에서 크롤링해서 파일에 저장해보도록 하자

 

import requests as rq
from bs4 import BeautifulSoup
url = "https://hello-ming.tistory.com/"
res=rq.get(url).text #get방식으로 접근
soup = BeautifulSoup(res,'lxml')
soup

 

resp = soup.select('div')
for i,j in enumerate(resp):
    print(i,j)

with open('2.txt','w',encoding='utf-8') as f:
    f.write(str(resp))

 

 

csv 저장

 

columns = ["이름", "나이", "주소"]

names = ["철구", "맹구", "짱구", "유리"]
ages = ["20", "21", "20", "22"]
address = ["경기도", "강원도", "경상도", "전라도"]
with open('4.csv',"a") as f:
    column = ','.join(columns) +"\n"
    f.write(column)
    
    for i in range(0,len(names)):
        row =('%s,%s,%s\n')%(names[i], ages[i], address[i])
        f.write(row)

pandas로 보이게 했다.

 

engine='python'  /  encoding='utf-8  / encoding='CP949

 

를 활용하면 한글 깨짐을 막을 수 있다.

 

 

 나이가 21보다 큰 사람을 고르자

 

전라도에 사는 사람만 골라서 CSV 파일에 저장하기

 

 

 

728x90
반응형
728x90
반응형

 

2021.06.09 - [Data Analysis/web crawling] - [Crawling] Slack Bot 만들기

 

전 포스팅과 연결되어 있다. 이번에는 슬랙에서 봇채팅 치는 것을 하겠다!

 

슬랙에 들어가 왼쪽 편을 봐보자 

 

아 그리고 나는 test라는 채널을 추가했다.

 

 

세로로 나열된 점 세개를 누른다.

 

 

앱을 누른다.

 

hello를 눌러주면 

 

여기에 내가 만든 봇이 뜨는데 만약 안 뜨더라도 검색하면 뜰 것이다.

 

이렇게 뜨고 동그라미로 표시한 부분을 눌러준다.

 

 

이 앱을 채널에 추가 를 눌러 원하는 채널에 초대해준다.

 

나는 test 채널에 초대할 것이다.

 

 

 

추가를 누르고 test 채널에 가보면 이게 뜰 것이다.

 

이제 파이썬으로 채팅을 해볼 것이다.

 

나는 주피터 노트북을 이용했는데 상관없다.!

 

from slackclient import SlackClient
import requests as rq
from bs4 import BeautifulSoup
import time

slack_token = 'xoxb-460297928240-2145122313062-cafL1R4QG7nFNRn4QMIrJeiR' #발급 받은 토큰
sc = SlackClient(slack_token)
    
    #메세지 전달
def notification(message):
    sc.api_call(
        "chat.postMessage",
        channel="#test", #{#채널}의 형태로 채널 지정
        text=message
    )

 

발급받은 토큰과 채널 이름은 사람마다 다를 것이다. 바꿔준 후

 

notification('안녕')

 

그전에 만들어둔 봇이 떴다..! 

 

 

728x90
반응형

+ Recent posts