반응형
https://github.com/syujisu/Django_instagram

 

초기 설정

photo app 생성

모델 설계

<초기 설정>

- 가상환경 생성
$ python -m venv myvenv

- 가상환경 실행
$ source myvenv/Scripts/activate
(myvenv) 

 

-장고 설치 
$ pip install django 

 

- 프로젝트 시작
$ django-admin startproject config
(myvenv) 


- DB 초기화 (project 상단 이름을 바꿔줍니다 -> instagram)

$ cd instagram

$ python manage.py migrate

 

 

 

<photo app>

- app 생성(/instagram)

$ python manage.py startapp photo

 

- settings.py에 installed app에 photo 추가해주기

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'photo.apps.PhotoConfig'
]

 

- photo model 생성(/instagram/photo/models.py)

class Photo(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user')
    #장고에서 구현하는 user 불러와 photo를 fk로 연결
    text = models.TextField(blank=True)
    image = models.ImageField(upload_to = 'timeline_photo/%Y/%m/%d')
    #timeline_photo 폴더에 연, 월, 일 만들어 사진 저장
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return "text : " + self.text
        #admin 사이트 화면 표시 구현 

    class Meta:
        ordering = ['-created']
        #ordering 정렬

 

-settings.py 에서 media 루트 설정 (/instagram/config/settings.py)

STATIC_URL = '/static/'



MEDIA_URL = '/res/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
#MEDIA_URL 을 설정하고 ROOT를 잡아주어서 저기로 사진이 저장되도록 한다.

 

-모델 설계 이후 migration

  1. Image파일을 업로드 하기 위해 pip install Pillow를 해줘야 한다.
    1. pip install Pillow
  2. python manage.py makemigrations photo
  3. python manage.py migrate

-admin site 등록(/instagram/photo/admin.py)

from django.contrib import admin
from .models import Photo
# Register your models here.

admin.site.register(Photo)

 

- 확인해보기

$ python manage.py createsuperuser
Username (leave blank to use 'user'): admin
Email address: 282532@naver.com
Password: 
Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
  1. python manage.py runserver (기본값은 8000 포트 입니다)
  2. 해당 링크의 /admin으로 이동하여 글 등록해보기

admin 사이트
사진 올려서 이렇게 나오면 완성 :)

반응형

'Web > Django' 카테고리의 다른 글

[Django] Instagram 클론 코딩(2)  (0) 2020.03.19
[Django_심화]4 - (1)pagination  (0) 2020.03.18
[Django_심화]3 - viewset & router  (2) 2019.11.03
[Django_심화]2 - Rest, Serializer  (0) 2019.11.03
[Django_심화]1 - 준비운동  (0) 2019.11.02
반응형

NULL 값은 더하거나 빼거나 곱하거나 나눌 수 없는 값

=> 필요에 따라 NULL 값을 '0' 또는 '원하는값'으로 변경할 수 있어야 한다. 

 

위의 테이블과 같이 컬럼이 비어있는 것을 "No Name"으로 채워서 처리하고 싶을 때  여러가지 방법이 있다.

 

1. CASE

: True / False를 판단하여 조건식에 맞게 값을 변환할 때 사용

사용 예시)
CASE WITH 조건식1 THEN 식1
            [WHEN 조건식2 THEN 식2 ...
              ELSE  식3]
END

 

//실제 사용예시
SELECT 
    ANIMAL_TYPE,
    CASE
        WHEN NAME IS NULL THEN "No name"
        else NAME

    END AS NAME,
    SEX_UPON_INTAKE
FROM ANIMAL_IN

 

2. COALESCE

: 입력받은 여러 개의 인자 중 NULL이 아닌 값을 반환

사용 예시)
SELECT COALESCE(ID, VALUE)
FROM 테이블

- 주의 사항 

   1. ELSE 문 꼭 사용 -> 기재하지 않으면 NULL 값

   2. NULL 값 체크 시 " = " 을 사용하지 않는다. 

 

SELECT
    ANIMAL_TYPE,
    COALESCE(NAME, "No NAME") AS NAME,
    SEX_UPON_INTAKE

FROM ANIMAL_INS

 

3. IFNULL()

: 해당 필드의 값이 NULL 반환할 때, 다른 값으로 출력할 수 있도록 하는 함수 

  하나의 필드 값 뿐 아니라, 연속적으로도 활용할 수 있다.

 

사용 예시)
SELECT IFNULL(필드명, "대체할 값") FROM 테이블명; 
SELECT
    ANIMAL_TYPE,
    IFNULL(NAME, "No name") as NAME,
    SEX_UPON_INTAKE
from ANIMAL_INS
반응형

'Database Study > SQL' 카테고리의 다른 글

[SQL]LOCK이란?  (0) 2020.06.02
[SQL]Join VS Union  (0) 2020.05.26
[MySQL]프로그래머스_입양 시각 구하기(2) (UNION/변수선언)  (2) 2020.03.10
[Oracle DB]Join 종류  (0) 2020.01.06
[Oracle DB] 커서 (CURSOR)  (0) 2020.01.06
반응형

문제 설명

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

 

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_OUTCOME VARCHAR(N) FALSE

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

 

예시

SQL문을 실행하면 다음과 같이 나와야 합니다.

 

HOUR COUNT
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 3
8 1
9 1
10 2
11 13
12 10
13 14
14 9
15 7
16 10
17 12
18 16
19 2
20 0
21 0
22 0
23 0

다른 문제들과 달리 레벨4 라 조금 어려웠고, 새로운 이론도 알 수 있었던 문제였다.

 

방법 1. UNION  함수 사용

- UNION 이란?

  • 2개 이상의 쿼리를 결합할 때 사용
    • UNION : 결합 시 중복 제거 
    • UNION ALL : 결합 시 중복 제거 X

- 해결 방법

 

  • 0~23시 모든 시간에서, 
    해당 시각에 입양된 기록이 없어도(NULL 이어도) COUNT 0으로 출력하는 것이 관건

  • UNION으로 0~23 모든 시간을 가진 TABLE을 생성 후
    여기에 LEFT JOIN과 IFNULL을 사용해 문제 해결

SELECT H1.HOUR, IFNULL(OUTS.COUNT,0) AS COUNT 
FROM ( 
    SELECT 0 AS HOUR 
    UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 
    UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 
    UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12
     UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 UNION SELECT 16 
     UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20 
     UNION SELECT 21 UNION SELECT 22 UNION SELECT 23 ) H1 
     LEFT JOIN ( 
         SELECT HOUR(DATETIME) AS 'HOUR', COUNT(*) AS 'COUNT' 
         FROM ANIMAL_OUTS 
         GROUP BY HOUR) AS OUTS ON H1.HOUR = OUTS.HOUR

 

 

 

 

방법 2. 변수 사용

- 0 ~ 23 시 모든 HOUR을 출력하기 위해 변수 사용

 

- MySQL 변수 선언 방법

  • SET @변수명 = '값';   => " = " : MySQL에서 대입연산자, 비교연산자 로 사용됨(SET 명령어에서만 대입 연산자로 인식)

  • SET @변수명 := '값';  => " := "

  •  

  • SET을 제외한 다른 쿼리문(SELECT 등)은 '=' 를 비교연산자(comparison operator)로 인식하기 때문에, SET이 아닌 쿼리문에서는 반드시 대입 연산자(assignment operator) ':='을 사용

- 해결 방법

  • SET으로 HOUR_LIST라는 변수 선언하고 +1 씩 하며 0 ~ 23시 까지 모든 시간에 대한 COUNT 출력

SET @HOUR_LIST = -1; 
SELECT 
(@HOUR_LIST := @HOUR_LIST + 1) AS 'HOUR', 
(SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @HOUR_LIST) AS 'COUNTS' 
FROM ANIMAL_OUTS 
WHERE @HOUR_LIST <23;

 

반응형

'Database Study > SQL' 카테고리의 다른 글

[SQL]Join VS Union  (0) 2020.05.26
[MySQL] CASE, COALESCE, IFNULL NULL 처리  (1) 2020.03.11
[Oracle DB]Join 종류  (0) 2020.01.06
[Oracle DB] 커서 (CURSOR)  (0) 2020.01.06
[Oracle DB]PL / SQL 기초  (0) 2020.01.06
반응형

(1)편에서 이어집니다. :)

 

앞에서 그냥 Jekyll 사용해서 깃허브 상에서하려고했는데 루비를 깔고.. clone 받아 진행해보려고 합니다. 

 

 

1. 루비 설치 

- Jekyll는 루비 기반입니다. 

- MACos 에는 Ruby가 기본적으로 설치되어있습니다. 

- 전 윈도우 이기 때문에 루비를 깔아주고 시작하겠습니다.

- 설치 후 이렇게 확인해보시면 끝 :)

 

 

2. Jekyll 설치

- 로컬에서 설치 

 

3. Jekyll 테마 선택 후 자신의 repo에 colne 


를 해야한다고 생각했지만 .. 그냥 클론하고, 넣고 싶은 것 넣고 그러면 되서 조금 민망.....

 

저 처럼 그냥 에디터에 git clone하여 불러와도 좋고 그냥 깃허브 자체에서 파일을 고쳐도된다고..

 

고쳐야하는 부분이라면 

 

_config.yml 파일

   => base.url = ""

   => url = "현재 사용하는 도메인 주소"

   => 나머지 부분들은 취향대로 넣으시면됩니다. 

 

 

그리고 nav가 테마에 있고 이곳에 Markdown페이지를 만들어 연결하거나, html을 만들어서 연결하려면

우선, 각 페이지에 들어갈 파일을 먼저 만들어주고 위에 메타데이터를 선언해줍니다. 

저는 나머지 파일들은 html보다 마크다운페이지로 만들어주려고 하기 때문에 이런식으로 선언하여 확인해보았습니다. 

 

이런식으로 파일 작성해주고 url 연결해주면 

navbar을 통해 아래 처럼 페이지로 나올 수 있도록 해줍니다. 

뭐 처음에는 조금 어려운 것이라 생각해서 정리해볼까 했는데 막상 만들어보니 쉬워서 ㅎㅎ 

루비 기초만 아시는 분들도 금방하실 것 같습니다 :) 

반응형

'Web > Git' 카테고리의 다른 글

Git push가 안되는 경우 (fatal: refusing to merge unrelated histories)  (0) 2020.04.14
Github 포토폴리오 만들기(1)  (0) 2020.03.06
Git 동작 원리  (0) 2020.03.05
Git 사용법(Git Bash)  (0) 2020.03.05
반응형

지킬(Jekyll) 을 활용하고 Github 서버를 사용해서 포토폴리오를 만들어볼까합니다

 

그냥 웹사이트 하나 만드는게 편하다고 생각하시겠지만.. 전.. 프론트쪽에 관심이 없고.. 못하기때문에 ..

템플릿을 가져오는 거 보단, 요즘 깃허브 공부하는 겸.. ㅎㅎ 쉬운게 좋은 거라고 생각하기 때문에 ..GG :)

 

깃허브 가입과 Git Bash 설치를 전제로 진행하겠습니다. 

 

1. 깃을 깔고  Git Bash  실행 -> 사용자 등록합니다. 

git config --global user.name "깃허브네임"
git config --global user.email "깃허브이메일"

 

 

2. 테마를 다운 받습니다. 

- 구글링하면 다 나옵니다. 전 아래 사이트,  phantom 테마를 선택하였습니다. 

https://jekyllthemes.io/jekyll-portfolio-themes

- 테마를 클릭하고 아래로 내리면 "get 테마이름 on github" 버튼이 존재하고 이를 클릭합니다.

 

 

3. 우측 상단의 fork버튼을 눌러 이 페이지 저장소를 본인의 repo에 복제합니다. 

 

4. 본인의 닉으로 복제한 저장소가 생성됩니다. 

5. Settings  => Repository name에 자신의 닉네임을 적어 이를 도메인으로 만들어줍니다

닉네임.github.io

    (원하는 도메인명이 있다면 도메인을 사시면됩니당)

 

 

6. 조금만 기다리고 settings => Githup page 부분으로 스크롤을 내리시면 이렇게 초록색 부분으로 바뀌게 되고 이 링크를 클릭시 사이트에 들어갈 수 있습니다. fork한 프로젝트 이기 때문에, css, js가 다 깨져있는 상태이므로 path 설정을 통해 바꿔보겠습니다. 

반응형

'Web > Git' 카테고리의 다른 글

Git push가 안되는 경우 (fatal: refusing to merge unrelated histories)  (0) 2020.04.14
Github 포토폴리오 만들기(2)  (0) 2020.03.06
Git 동작 원리  (0) 2020.03.05
Git 사용법(Git Bash)  (0) 2020.03.05
반응형

문제설명

대구 달성공원에 놀러 온 지수는 최근에 새로 만든 타일 장식물을 보게 되었다. 타일 장식물은 정사각형 타일을 붙여 만든 형태였는데, 한 변이 1인 정사각형 타일부터 시작하여 마치 앵무조개의 나선 모양처럼 점점 큰 타일을 붙인 형태였다. 타일 장식물의 일부를 그리면 다음과 같다.

그림에서 타일에 적힌 수는 각 타일의 한 변의 길이를 나타낸다. 타일 장식물을 구성하는 정사각형 타일 한 변의 길이를 안쪽 타일부터 시작하여 차례로 적으면 다음과 같다. [1, 1, 2, 3, 5, 8, …] 지수는 문득 이러한 타일들로 구성되는 큰 직사각형의 둘레가 궁금해졌다. 예를 들어, 처음 다섯 개의 타일이 구성하는 직사각형(위에서 빨간색으로 표시한 직사각형)의 둘레는 26이다.

타일의 개수 N이 주어질 때, N개의 타일로 구성된 직사각형의 둘레를 return 하도록 solution 함수를 작성하시오.

제한 사항

N은 1 이상 80 이하인 자연수이다.

입출력 예

5 26
6 42

풀이

이 문제는 동적프로그래밍으로 차근차근 작은 거 부터 실행해나가며 된다. 

def solution(N):
    #메모이제이션
    dp = [0] * int(N+2)
    
    if N == 1:
        return 4
    if N == 2:
        return 6
    dp[0], dp[1], dp[2] = 0, 1, 1
    
    for i in range(3, N+2):
        dp[i] = dp[i-1] + dp[i-2]

    return 2*dp[N-1] + 4*dp[N]
반응형

'Algorithm Study > Programmers' 카테고리의 다른 글

스킬트리/java  (0) 2019.08.28
N개의 최소공배수/java  (0) 2019.08.28
피보나치 수 / java  (0) 2019.08.28
자연수 뒤집어 배열로 만들기/java  (0) 2019.08.28
약수의 합 / java  (0) 2019.08.28
반응형

기본적으로, 깃 프로젝트 담겨있는 데이터  => 파일 시스템 상에서의 스냅샷(Snapshot)

 

파일 자체를 저장하기 보다는 실제 프로젝트를 커밋하여 적용할  순간을 중요시 여겨 그 수정 내역 자체를 저장

 

 

<Git 프로젝트 3가지 구성요소 >

 

- Working Directory: 작업할 파일이 있는 디렉토리(내 컴퓨터 작업 공간)

- Staging Area: 커밋(Commit)을 수행할 파일들이 올라가는 영역

- Git Directory: Git 프로젝트의 메타 데이터와 데이터 정보가 저장되는 디렉토리

 

 

 

 

??저장소란??

  저장소(Repo)는 실제 소스코드가 담겨 있으면서 커밋(Commit) 내역 등의 모든 작업 이력이 담겨 있는 공간을 의미합니다. 실제로 프로젝트의 메타 데이터를 포함해 각종 데이터는 .git 폴더에 담기게 됩니다. 실제로 이 폴더를 열어 보면 각종 데이터와 해시 값 등이 담겨 있습니다.

 

  어떠한 파일을 Commit 하게 되면 각 작업들을 분류하기 위해 내부적으로 해당 작업에 대한 해시(Hash) 값을 이용하는 것입니다. 일반적으로 해시 값은 충돌이 발생하지 않기 때문에 정확히 커밋 내역들을 관리할 수 있습니다.

 

 

출처: https://ndb796.tistory.com/187 [안경잡이개발자]
반응형
반응형

Git 이용하는 2가지 방법

  • SourceTree : Git GUI 툴 (접근하기 좋고 현재 상태에 대해 파악하기 좋아 협업에서는 많이 사용되지만,
                                     좀 더 디테일한 명령어를 다룰 수 없기에 좋아하지 않는다 ㅎㅎ)
  • Git Bash

 

기본적인 명령어 

  • 화면 초기화 : Ctrl + L
  • 한 행의 처음과 끝 : Ctrl + A, Ctrl + E
  • 목록 보기 : ls 또는 dir
  • 파일의 내용 보기 : cat
  • 특정 문자를 검색 : grep
  • 디렉터리로 이동 : cd
  • 디렉터리 생성 : mkdir
  • 파일 삭제 : rm
  • 파일 생성 : touch

 

git config (최초 1회 실행)

// git commit에 사용될 username

git config --global user.name "your_name"

 

// git commit에 사용될 email

git config --global user.email "your_email@example.com"

 

// 설정한 내용을 확인할 수 있다.

git config --list

git init 

//현재 디렉토리를 로컬저장소로 설정한다

// 로컬저장소로 설정할 프로젝트 위치로 이동

cd 프로젝트path

 

// 로컬저장소로 설정

// (master) 브랜치로 보이면 성공!

git init

 

// 만약 init을 취소하려면 아래의 명령어를 입력

rm -r .git

 

git status

//로컬 저장소의 현재 상태 보여줌

 

git add

//파일을 준비영역(Staging Area)으로 옮김 (GitHub와 연동하려면 git remote로 원격 저장소와 연결해야 함)

// a.html 파일만 추가

git add a.html

 

// 워킹 디렉터리 내 모든 파일을 추가

git add .

 

// 명령 프롬프트에서 상호작용하면서 추가 (나갈땐 q를 입력)

git add -i

 

// 진행중인 파일일 경우, Staging Area에서 워킹 디렉터리로 옮긴다.

$git rm --cached a.html

$git rm -r --cached .

 

git commit

// 준비영역(Staging Area) 의 파일을 로컬저장소에 저장

// 에디터가 출력되고, 에디터에서 커밋 메시지 입력 후 저장하면 커밋됨

git commit

 

// 간단한 커밋 메시지를 입력후 커밋

git commit -m "커밋 메시지"

 

// Staging Area에 들어간 파일에 대해서만 (워킹 디렉터리는 적용 X)

git commit -a -m "커밋 메시지"

 

 

git log

//로컬 저장소의 커밋 이력을 조회

// 커밋 이력 상세조회
git log 

 

// 커밋 이력중 커밋ID, 타이틀 메시지만 조회

git log --oneline

 

// 모든 브랜치 커밋 이력 조회

git log --oneline --decorate --graph --all

 

// 특정 파일의 변경 커밋 조회

git log -- a.html

 

git remote

//로컬 저장소와 원격 저장소를 연결

// Github 원격저장소와 연결한다.

git remote add origin [자신의 Github 원격저장소 주소]

 

// 연결된 원격저장소 확인한다.

git remote -v

 

git push

//원격 저장소에 저장

// 원격저장소에 저장한다.
git push -u origin master

 

// 에러 - ! [rejected] master -> master (fetch first)

// 이미 변경된 파일이 원격저장소에 있을경우 발생

git pull origin master 

 

// 에러 - ! [rejected] master -> master (non-fast-forward)

git push origin +master

 

 

git branch

//브랜치 생성, 수정, 삭제

//브랜치 보기
$git branch

//브랜치 생성
$git branch [브랜치명]

//브랜치 수정
$git branch -m [브랜치명] [바꿀이름]

//브랜치 삭제
$git branch -d [브랜치명]

 

 

git checkout

//워킹 디렉토리 소스를 특정 커밋이나 특정 브랜치로 변경

//특정 브랜치로 워킹 디렉터리 변경
$git checkout [브랜치명]

//특정 커밋으로 워킹 디렉터리 변경
$git checkout [Commit ID]

 

//특정 파일을 해당 브랜치 또는 커밋 상태로 변경 (원복)
$git checkout [돌아갈 Commit ID] -- [파일 경로]
*충돌 방지를 위해 브랜치명을 확인하고, 파일 추가 및 수정한 뒤 커밋해야 한다.

//브랜치 생성 및 체크아웃을 같이 할 경우
$git checkout -b develop

 

git merge

//다른 두 개의 브랜치 소스 병합

$git checkout master
$git merge develop

*같은 파일의 같은 위치의 내용이 변경된 경우 충돌이 발생한다.
반응형

+ Recent posts