-
Swift MVVM(작성중)
스탠포드 대학 CS193p 강의 중 MVVM 관련 내용을 번역하며 정리해봄 Model-View-ViewModel 코드를 구성하는 아키텍쳐의 디자인 패러다임의 하나이다. “반응형” 유저인터페이스 개념과 함께 작동하며, SwiftUI를 학습하기 전에 선행되어야 하는 개념이다. UIKit을 사용하는 구식 스타일 iOS의 MVC와는 다르다. MVVM은 모델과 뷰를 분리하려고 한다는 점에서 MVC와 비슷한 면이 있다. 모델과 뷰를 먼저 살펴본 후 MVVM이 이 두 요소를 어떻게 연결하는지 알아보도록 하자. Model 과 View Model 모델은 UI 독립적이다. 모델은 SwiftUI를 사용하지 않는다. (UIKit도) 모델은 데이터와 로직을 캡슐화 한다....
-
qtfaststart in Swift
mp4 파일중 스트리밍이 지원되지 않는 파일이 존재하였고, 이를 최적화 시켜주는 C라이브러리를 Swift로 컨버젼했음 Mp4 atoms mp4 파일 중 스트리밍이 되지 않는 파일들이 존재하는데, 이는 mp4 파일을 구성하는 요소인 atom 배치에 따른 것이었다. 데이터를 담고있는 mdat atom과 데이터에 대한 정보를 담고 있는 moov atom의 순서에 따라 스트리밍 가능 / 불가능 여부가 결정되는데, 스트리밍이 가능한 mp4는 moov atom이 mdat atom보다 앞에 배치되어 있었고, 스트리밍이 불가한 mp4는 moov atom이 파일의 가장 뒷부분에 붙어있었다. 이를 수정하여 mp4를 스트리밍해줄 수...
-
Arrange Multi-line UILabel in UIStackView with SnapKit
Multi Line UILabel을 UIStackView 안에서 정렬하기 위한 방법 정리 방법 UILabel을 UIView안에 넣고, UIView를 UIStackView에 넣으면 된다. 코드 class ExampleView: UIView { private lazy var titleLabel = UILabel() private lazy var contentLabel: UILabel = { let label = UILabel() label.numerOfLines = 0 return label }() private lazy var contentView: UIView = { let view = UIView() view.addSubview(self.contentLabel) return view }() private lazy var spacer: UIView = { let view = UIView() view.setContentHuggingPriority(.defaultLow, for: .horizontal) return...
-
[Swift-Design Pattern] 데코레이터 패턴 (Decorator pattern)
데코레이터 패턴이란 객체간 결합을 통해 기능을 유연하게 확장할 수 있도록 돕는 디자인 패턴이다. 예시 네비게이션의 도로 표시 방식을 통해 데코레이터 패턴을 학습해 본다. AS-IS 도로 표시 클래스 class RoadDisplay { func draw() { print("기본 도로 표시") } } draw()를 이용해 기본적인 도로만 표시하는 클래스이다. 도로 + 차선 표시 클래스 class RoadDisplayWithLane: RoadDisplay { override func draw() { super.draw() self.drawLane() } private func drawLane() { print("+ 차선 표시") } } draw()를 호출하면 차선도 함께 표시해주는 클래스이다....
-
[Swift-Design Pattern] 커맨드 패턴 (Command pattern)
Command Pattern은 실행될 기능을 추상화, 캡슐화 하여 한 클래스에서 여러 기능을 실행할 수 있도록 하는 패턴이다. 예시 여러 기능을 수행할 수 있는 버튼 클래스를 만들며 커맨드 패턴을 익혀본다. AS-IS 버튼 클래스와 램프 클래스 class Lamp { func turnOn() { print("Lamp On") } } class Button { private let lamp: Lamp init(lamp: Lamp) { self.lamp = lamp } func pressed() { self.lamp.turnOn() } } Button을 생성할 때 lamp를 인자로 전달받도록 작성되었다. 클라이언트 let lamp = Lamp()...
-
[Swift-Design Pattern] 옵저버 패턴 (Observer pattern)
Observer Pattern은 한 객체의 상태 변화에 따라 다른 객체의 상태도 연동 되도록 1 대 N 객체간 의존 관계를 구성하는 디자인 패턴이다. 예시 점수 저장소인 ScoreRecord 클래스와 점수를 출력하는 View 클래스를 이용해 옵저버 패턴을 이해해 본다. AS-IS 점수 저장 클래스 class ScoreRecord { private var scores = [Int]() private var dataSheetView: DataSheetView? func setDataSheetView(dataSheetView: DataSheetView) { self.dataSheetView = dataSheetView } func addScore(_ score: Int) { self.scores.append(score) self.dataSheetView?.update() } func getScoreRecord() -> [Int] { return self.scores }...
-
[Swift-Design Pattern] 싱글톤 패턴 (Singleton Pattern)
Singleton Pattern은 객체를 하나만 생성하여, 생성된 객체를 어디서든 참조할 수 있도록 하는 패턴이다. Thread-safe 하게 작성하여 멀티스레드에서 사용해도 문제가 없어야 한다. JAVA와는 다르게, Swift에서는 간결하게 구현이 가능한 듯 하다. 코드 클래스 class Printer { static let shared = Printer() private init() {} func printDoc(_ doc: String) { print(doc) } } static 변수에 Singleton 패턴을 적용할 클래스의 인스턴스를 할당해주면 된다. 클라이언트 Printer.shared.printDoc("Print Document") 클라이언트에서는 Printer 클래스의 shared 변수를 불러와 사용하면 된다.
-
[Swift-Design Pattern] 스트래티지 패턴 (Strategy pattern)
Strategy Pattern은 클래스의 행위를 캡슐화 하여 동적으로 행위를 자유롭게 바꿀 수 있도록 돕는 패턴이다. 예시 로봇 프로토콜과 그것을 따르는 태권V, 아톰 객체를 생성하는 예시를 통해 스트래티지 패턴을 학습해본다. AS-IS Robot 클래스 protocol Robot { var name: String { get } init(name: String) func attack() func move() } class TaekwonV: Robot { var name: String required init(name: String) { self.name = name } func attack() { print("I launch Missle") } func move() { print("I can only...
-
[Swift-Design Pattern] 스위프트를 이용한 디자인 패턴
Swift를 이용한 디자인 패턴 JAVA로 되어있는 GoF 디자인 패턴 책을 스위프트로 바꿔가며 공부해보도록 한다. 스트래티지 패턴 (Strategy Pattern) 싱글톤 패턴 (Singleton Pattern) 옵저버 패턴 (Observer Pattern) 커맨드 패턴 (Command Pattern) 데코레이터 패턴 (Decorator Pattern) Reference JAVA 객체지향 디자인 패턴(한빛미디어) 디자인 패턴 종류 (in JAVA)
-
Swift Fullscreen Share Extension 만들기
기존의 iOS Share Extension은 ShareViewController라는 작은 창을 이용하게 되어있다. 이 Share Extension을 요구사항에 맞게 풀스크린으로 제작하는 방법을 공유해본다. 작업환경 Xcode 9.4.1 Swift 4.1 iOS 11.3, 11.4 EntryViewController 작성 우선 공유 익스텐션에 접근시 가장 먼저 띄워줄 EntryViewController를 작성해준다. 기존에는 ShareViewController를 MainInterface.storyboard를 통해 팝업시켜주도록 되어있는데, 추후에 Info.plist를 수정하여 EntryViewController를 최초로 띄워주도록 변경하게 된다. import UIKit @objc(EntryViewController) class EntryViewController : UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) let shareVC = ShareViewController() shareVC.sharingData = self.extensionContext let nav...
-
Django를 이용한 Rest API 서버 구축
Django를 이용해 Restful한 API 서버를 구축하는 방법을 익혀본다. Ubuntu 16.04-64-server Python 3.5.2 Django 2.0.5 django-rest-swagger 2.2.0 환경 세팅 파이썬 버전을 확인해 준다. 파이썬 3.x 버전이 없다면 설치해준다. $ python --version $ python3 --version 이어서 가상환경을 세팅해주기 위해 virtualenv를 설치해준다. $ apt-get install virtualenv virtualenv 설치가 완료되었다면 학습을 위한 가상환경을 생성한다. $ virtualenv -p python3 rest_env 가상환경이 생성완료 되면, 가상환경을 activate 시켜준다. 정상적으로 가동되었다면 터미널 입력창 앞에 (rest_env)가 붙어있을 것이다. $ source ~/rest_env/bin/activate 이어서 필요한 Django...
-
Core ML 과 Vision: iOS11의 머신러닝 튜토리얼
출처 : Core ML and Vision: Machine Learning in iOS 11 Tutorial iOS11에서 새로이 업데이트 되는 머신러닝 기술인 Core ML과 Vision을 활용하는 적절한 튜토리얼이 있어 번역하며 공부해본다. 이 튜토리얼은 Xcode 9 Beta 버전 그리고 Swift4 와 iOS11 에서 정상작동한다. 머신 러닝의 인기가 대단하다. 많은 사람들이 그것에 대해 들어보았겠지만, 정확히 무엇을 이야기하는지 아는 사람은 그리 많지 않다. 이 튜토리얼은 Core ML과 Vision이라는 iOS11에서 처음 수개 된 프레임워크에 대해서 설명하고 있다. 특히 이미지의 장면을 분석하기 위해 Places205-GoogLeNet이라는...
-
Swift 기초 - 특징, 변수, 상수, 타입
출처 : SWIFTER 블로그 Swift에 대한 기본 개념을 정리하며 공부해본다. 스위프트의 특징 변수, 상수, 타입 변수와 상수 Bool 타입 Numeric 타입 String 타입 Array<Element> 타입 Dictionary<Key, Value> 타입 Optional<Wrapped> 타입 Any 타입 튜플 타입 타입 캐스팅 스위프트의 특징 Swift는 정적인 프로그래밍 언어이다. 정적 프로그래밍 언어란, 컴파일 등 프로그래밍 언어가 실행되기 이전 단계에서 변수/상수의 타입을 결정하는 언어를 의미한다. 정적인 언어는 동적 언어와 비교해 실행이 되기 전에 프로그램의 타당성이 검증되기 때문에 안정성이 높으며, 대규모 프로그램 개발에 적합하다는...
-
JWT(Json Web Token)을 이용한 모바일 인증
토큰 방식의 모바일 유저 인증에 대해 잘 정리되어 있는 글이 있어 번역하며 정리해본다. 출처: The Ultimate Guide to Mobile API Security 모바일 API 보안의 문제점 모바일 API보안에 OAuth2 도입하기 액세스 토큰 작동방식 모바일 API 보안의 문제점 가장 기초적인 API 보안의 형태는 HTTP Basic Authentication(HTTP 기본 인증)이다. 이 방식은 매우 간결하게 작동하기 때문에 API 서버를 만드는 사람이나 API를 활용할 개발자 모두에게 편리함을 제공해준다. 기본적인 작동방식은 다음과 같다. 개발자에게 API키(보통 ID와 PW)가 주어진다. 이 API키는 다음과 같은...
-
IGListKit 셀 선택시 배경 변경하기
IGListKit을 이용해 SideMenu를 구성하는 과정 중, 메뉴에서 해당하는 셀을 선택하면 아래의 이미지와 같이 활성화 된 셀의 배경색이 변경되게 구현하고자 한다. 처음에 기본적 형태만 구현한 상태에서는 탭을 해도 색상이 변하지 않고 해당 셀에 지정된 action만 행할 뿐이었다. 구현하기 원하는 기능은 탭을 하면 선택된 셀의 배경색이 변하고, 선택되지 않은 셀의 배경들은 투명 혹은 배경과 같은 색깔을 띄는 것이었다. IGListKit의 예제를 보고 응용해보면, 한 섹션의 색은 잘 변하지만, 다른 섹션의 셀 색깔은 개별 섹션컨트롤러에서 변경하는 것이 불가능했다. 결국...
-
IGListKit 튜토리얼
출처: IGListKit Tutorial: Better UICollectionViews iOS의 UICollectionView를 개선한 IGListKit의 튜토리얼을 번역하며 따라해본다. 시작하기 IGListKit 소개 UICollectionView를 IGListKit으로 대체하기 일지(Journal) Loader 추가하기 컬렌션 뷰 추가하기 IGListAdapter와 데이터소스 첫 Section Controller 만들기 메세지 기능 추가하기 화성의 날씨 업데이트 수행하기 마치며 대부분의 어플리케이션의 시작은 비슷비슷하다. 몇개의 스크린, 몇개의 버튼 그리고 한두개의 리스트. 하지만 시간이 지나고 어플리케이션의 규모가 커지면 기능들이 넘쳐나게된다(feature-creep). 당신의 깔끔했던 데이터 소스들은 데드라인과 PM의 압박에 시달리며 먼지가 되어간다. 잠시후, 당신은 거대한 뷰 컨트롤러(MVC, Massive View Controller)를...
-
Linux 공부 14 - 개념 정리
앞서 풀어보았던 150개의 문제중에 짚고 넘어갈만한 명령어와 개념을 정리해본다. 명령어 파일시스템 ls chown chmod du df free cat dd rm mount ln tar touch mkdir 검색 find grep 프로세스 at cron kill nice ps top 네트워크 netstat nslookup ssh iptables 텍스트 처리 awk cut head / tail sed more vi wc split sort 그외 usermod 모듈 패키지 관리자 yum rpm apt-get 일반적 지식 리다이렉션 히스토리 작업제어 환경변수 기타 포트 디렉토리 구조 쉘 변경 스크린 정규식...
-
Linux 공부 13 - 문제풀이3
문제풀이 3 문제를 풀어보면서 리눅스(Unix)의 개념을 학습해본다. 1. 소유자가 george이고 그룹이 others일때 data파일의 소유자와 그룹을 동시에 변경하시오 $ chown george:others data 2. 현재 로그인한 사용자의 목록에서 2016-01-07에 접속한 사용자를 출력하시오. $ who | grep '2016-01-07' 3. 접근권한이 775인 data 디렉토리를 생성하시오. $ mkdir -m 755 data -m옵션은 디렉토리의 mod를 설정 4. 현재 디렉토리에서 링크 파일만 찾는 lnfind란 alias를 생성하시오. $ alias lnfind='find ./ -type l' 5. 현재 디렉토리에서 24시간 이내에 수정된 파일을 찾으시오. $ find...
-
Linux 공부 12 - 문제풀이2
문제풀이 2 문제를 풀어보면서 리눅스(Unix)의 개념을 학습해본다. 1. 수정된 지 100일이 지난 파일 목록을 출력하시오 (명령어: find) $ find -mtime +100 find 명령을 이용해 각종 파일이나 디렉토리를 검색할 수 있다. 옵션은 아래와 같다. $ find -name filename # 파일 이름으로 검색 $ find -mtime +n # n일 이전에 수정된 파일 검색 $ find -mtime -n # n일 이내에 수정된 파일 검색 $ find -perm nnn # 권한이 nnn인 파일을 검색 $ find -type x #...
-
Linux 공부 11 - 문제풀이1
문제풀이 1 문제를 풀어보면서 리눅스(Unix)의 개념을 학습해본다. 1. ‘chmod() spool.sh’를 사용하여 spool.sh파일의 권한을 ‘rw-r-x-r-x’로 만들고자 한다. ()안에 알맞은 것은? chmod는 리눅스 시스템의 권한을 설정을 하는 명령어이다. change mod의 줄임말이다. r,w,x로 구성되어있는데, 각각 다음을 의미한다. r: read, 읽기권한 w: write, 쓰기권한 x: excute, 실헹권한 뒤에 따라 오는 숫자는 rwx|rwx|rwx로 나누어 이진수로 변환해주면 되므로 655가 된다. chmod에서 사용할 수 있는 옵션은 다음과 같다. -c: 변경된 파일만 자세하게 보여준다. -f: 에러메세지를 출력하지 않는다. -v: 작업상태를 자세히 보여준다. -R:...
-
iOS Notification 만들기
iOS Notification 만들기 본 포스팅은 OS X, Xcode 8, ios 10, Swift3.0 기반으로 작성되었습니다. APNS: Apple Push Notification Service APNS를 이용해 ios 어플리케이션에 notification을 전송하는 방법을 기록해봅니다. 애플 개발자 아이디가 있으며, 계정에 테스트를 진행할 기기가 등록되어 있다는 조건하에 진행합니다. 작업은 아래와 같은 순서로 진행됩니다. iOS Notification 만들기 개발자 계정 세팅 인증서 요청 생성 APP ID 생성 APNS 인증서 발급 서버용 APNS 인증서 발급 프로비저닝 생성 iOS Application 작성 프로젝트 설정 AppDelegate.swift 수정 구동 테스트 APNS...
-
Linux 공부 10 - 입출력 리다이렉션
입출력 리다이렉션 표준입출력(Standard I/O)기능은 입력/출력을 다루는 기본적인 방법을 제공한다. 기본 입출력 스트림에는 표준입력, 표준츨력 그리고 표준에러 세 가지 종류가 있다. 표준출력(stdout) = 정상적인 출력 표준에러(stderr) = 에러메세지 표준입력(stdin) = 특별한 지정이 없으면 키보드로부터 입력을 읽어들임\ 특별한 지정이란? cat afile bfile처럼 파일명을 지정하면 프로그램은 표준입력을 무시한다. $ cat afile bfile this is a file this is b file $ cat afile bfile >cfile $ cat cfile this is a file this is b file 표준출력을 cfile로...
-
Linux 공부 9 - 작업제어
작업 제어 멀티 태스킹은 Unix 시스템 최고의 장점 중 하나이다. Unix는 포그라운드와 백그라운드로 프로그램을 구별한다. 이 기능 덕분에 터미널에서 동시에 여러 개의 프로그램을 실행시킬 수 있다. 포그라운드와 백그라운드 포그라운드에서는 한번에 오직 한개의 프로그램만 실행할 수 있는 반면, 백그라운드에서는 여러 프로그램을 동시에 실행시킬 수 있다. 프로그램을 백그라운드에서 실행시키려면 명령행 끝에 앰퍼샌드(&)를 붙이면 된다. $ gcc test.c & [1] 2573 위 명령어를 사용하면 test.c라는 파일을 백그라운드에서 컴파일하고, 컴파일이 진행되는 동안 다른 일을 할 수 있다. 쉘은 작업...
-
Linux 공부 8 - 히스토리
히스토리 대부분의 쉘은 이전에 입력했던 명령어를 반복하거나 그것들을 약간 변형하여 다시 사용할 수 있도록 하는 히스토리라는 강력한 기능이 있다. 이러한 기능은 복잡하거나 긴 명령어를 입력할 때 매우 유용하다. bash는 ~/.bashrc에 HISTSIZE라는 값으로 히스토리의 사이즈를 정하고 있다. $ cat ~/.bashrc | grep HISTSIZE HISTSIZE=1000 history 명령어는 이전에 입력한 명령어들을, 쉘이 실행된 후 몇 번째로 입력된 명령어인가를 나타내는 번호화 함께 출력한다. history뒤에 숫자를 붙이면 출력 갯수를 제한할 수 있다. $ history 4 2117 ls 2118 lsㅣㅑ 2119...
-
Linux 공부 7 - 앨리어스
앨리어스 앨리어스(alias)는 긴 명령어 또는 연속으로 입력해야 하는 여러 개의 명령어들을 간단히 할 수 있는 쉬운 방법이다. 모든 쉘은 쉘 함수를 갖고 있다. 쉘 함수들은 앨리어스로부터 쉘 스크립트까지 포함한다. 커스텀 명령어를 위한 앨리어스 C쉘과 ksh 그리고 bash는 자주 사용되는 명령어들을 간단한 명령어로 치환할 수 있는 앨리어스 만들기 기능을 가지고 있다. 앨리어스의 가장 간단한 종류는 예전에 사용되던 명령어를 새로운 이름으로 정의 하는 것이다. $ alias dir='ls' dir는 이제 새로운 이름이다. 앞으로는 dir를 ls와 동일한 명령어로 사용할...
-
Linux 공부 6 - 명령행에서 시간 절약하기
UNIX의 가장 좋은 특징 중의 하나는 쉘의 명령행(Command Line)이다 요즘의 모든 운영체제들은 명령행을 가지고 있다. 그렇다면 무엇이 Unix를 특별하게 만드는 걸까? Unix 쉘 명령행은 많은 단축값(shorcut)을 제공한다. 이들 중 어떤 것들은 다른 운영체제에서 발견할 수도 있지만 그렇지 않을 수도 있다. 이 장에서는 이러한 많은 단축값들에 대해서 알아본다. 라인 삭제 및 단어 삭제를 사용해 빠르게 라인 수정하기 일반적인 유저는 백스페이스나 DEL키를 연타해 오타가 있는 명령행을 지운다. 하지만 단축키를 몇 개 외워두면 훨씬 간단히 작업할 수 있을...
-
Linux 공부 5 - 쉘의 명령어 해석 방법
명령어를 쉘이 해석하는 방법 Shell은 또 하나의 프로그램이고 이 프로그램은 사용자가 입력한 명령어들을 해석하며,일반적으로 4~5가지의 쉘이 주로 사용된다. 쉘이 하는 일 쉘의 해석 과정 -> 명령행을 단어로 분리 -> 앨리어스히스토리 쉘 변수 및 환경변수들을 확장 -> 표준 입력과 출력 스트림을 초기 입력한 명령어를 쉘이 파싱하는 방법을 이해해야 진정한 파워유저가 될 수 있다. bash의 소개 90년대 초까지 주로 C쉘이나 Bourn쉘을 이용하였다. 이후 무료로 쉽게 구할 수 있고, 더 풍부한 기능을 가진 tcsh과 bash가 주목을 받게 되었다....
-
Linux 공부 4 - 쉘 변수와 환경 변수
쉘 변수와 환경 변수 자주 필요한 정보를 저장하여 사용자가 사용하기 편리하게 해주는 것, 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들의 모임이다. 기본적 사용법 $ echo $TERM xterm-256color $ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/jsh/shell echo 명령어를 통해 환경변수들을 출력해볼 수 있다. $ printenv SHELL=/bin/bash TERM=xterm-256color USER=root ... printenv 명령어를 통해 현재 설정되어있는 환경변수들을 출력해볼 수 있다. $ export TEST='testing' $ echo $TEST testing export 명령어를 통해 환경변수를 설정할 수 있다. $ unset TEST $ echo TEST unset...
-
Linux 공부 3 - 홈 디렉토리 구조
홈 디렉토리 구조 유닉스 파일시스템의 디렉토리 구조는 파일을 잘 분류해서 담아두기 편리하다. 전체 경로를 작성하지 않고 명령어만을 작성하여 실행하기 위해서는 $PATH에 설정을 해두어야 한다. Ubuntu $ vi /etc/environment centOS $ vi ~/.bash_profile 유닉스의 파일명은 최대 256자까지 지원해준다. 디렉토리 만들기 mkdir directory #diretory라는 이름의 디렉토리 생성 mkdir -p ~/bin/src/directory #하위 디렉토리까지 생성 mkdir -m 755 ~/bin/src/directory #755권한으로 디렉토리 생성 폴더를 생성하려면 부모 디렉토리에 쓰기 권한이 있어야 한다. -p 옵션은 하위 디렉토리까지 생성해주게 되는데 한번에 모두 만드는...
-
Linux 공부 2 - 로그인/로그아웃
로그인 쉘 함수와 환경변수, 명령어 앨리어스, 쉘 함수등을 취향에 맞추어 꾸미어 놓았더라도, 로그아웃을 하면 모든 설정값이 날아가버린다. 따라서 로그인 할 때마다 동일한 설정값을 적용되도록 하기 위해 홈디렉토리의 쉘 설정 파일에 필요한 내용을 저장해두어야 한다. 쉘 설정 파일 쉘 설정 파일을 이해하려면 쉘이 ‘로그인 쉘’ / ‘비로그인 쉘’ 이라는 두 가지 모드 중 하나로 동작한다는 사실을 이해해야 한다. Unix시스템에 로그인 -> login 프로그램이 쉘을 시작 -> 쉘이 로그인 쉘임을 나타내는 플래그 생성 플래그가 설정되어있지 않은 쉘은...
-
Linux 공부 1 - 기본개념
Unix 파워툴 책을 기반으로 유닉스와 리눅스에 대해 학습하고 기록해본다. 기본 개념 작동방식 사용자는 쉘이라는 프로그램과 대화 (키보드 입력이 바로 Unix와 대화를 의미하는 것이 아님) 쉘은 사용자로부터 Unix를 보호하며, 또한 Unix로부터 사용자를 보호 유닉스의 모든 일은 소위 커널이 처리 프로그램들 만이 시스템 콜을 통해 커널과 대화 쉘은 사용자가 입력한 명령어를 해석해서 실행시키거나 또는 다른 프로그램에게 넘겨주는 역할 Example m으로 시작하는 4자로 된 파일들의 이름을 출력하기 위한 명령은 아래와 같다. $ cat m??? Shell이 이름 조건에 맞는...
-
카카오톡 자동응답 API로 학식봇 구현
카카오톡의 옐로아이디 자동응답 API로 동국대학교 학생식당의 메뉴를 알려주는 봇을 구현해보았다. Python3와 Django를 이용했으며, Mac OS X를 기반으로 작성했다. 구현된 모습 위의 사진과 같이 동국대학식봇을 친구로 추가하고, 대화창에서 해당 식당의 버튼을 클릭하면 메뉴를 출력해주는 방식으로 구현했다. 시작 및 키보드 구현하기 우선 시작을 하기 위해선 옐로아이디 등록과 카카오 앱 등록이 필요한데, 이는 다른 블로그에도 많이 나와있으므로 생략한다. 카카오 옐로아이디 앱을 등록하고, API형 자동응답을 하기 위해서는 일단 기본적으로 카카오 API중에서 https://your_server_url/keyboard/요청에 알맞게 반응하도록 해야한다. 이제부터 Python과 Django를 이용해...
-
Django Class-based View
Django에는 Class-based view라는 강력한 기능이 있는데, 이를 공부 하기 위해 Documentation을 번역해본다. Class-based view는 view를 Python의 function 대신 object의 형태로 상속받을 수 있는 방법을 제시한다. 이것은 function-based view를 대체하는 것이 아니지만, function-based view와 비교했을 때 확실한 차이점과 이점이 존재한다. 특정 HTTP 메소드(GET,POST,etc)와 관련된 코드들을 조건을 이용해 분기처리 하는 대신 메소드의 형태로 사용할 수 있다. Mixin(다중상속)과 같은 객체지향 테크닉을 활용해 재사용가능한 컴포넌트의 형태로 코드를 짤 수 있다. Generic views, class-based views, class-based generic view의 관계와 역사...
-
Python Script를 Crontab으로 실행하기
학식을 스크래핑해서 페이스북에 포스팅하는 봇을 제작중인데, 서버에 올려놓고 Crontab을 활용해 자동으로 실행되게 하고자 한다. (우분투, Python3.4, Pyenv-virtualenv환경을 기준으로 작성됨) Python 파일 세팅 우선 실행하고자 하는 파이썬 파일 제일 윗 칸에 파이썬 인터프리터의 경로를 입력해야 한다. 우분투 기본 환경의 파이썬을 사용하고 있다면 #!/usr/bin/python을 입력하면 된다. 나의 경우는 pyenv-virtualenv환경에서 python3.4.1을 사용하고 있으므로 경로를 찾아서 스크립트 제일 위에 입력해주면 된다. python >>> import sys >>> sys.path ['', '/root/.pyenv/versions/3.4.1/lib/python34.zip', '/root/.pyenv/versions/3.4.1/lib/python3.4' ...] >>> exit() bash창에서 python을 입력하면 파이썬 스크립트 창으로...
-
Python Facebook SDK를 활용해 페이지에 글 쓰기
Python과 Facebook API를 사용해 글을 써 주는 프로그램을 제작하고자 한다. 일단은 기초적인 API를 사용해 페이지에 ‘테스트’라고 적힌 포스팅만 게시하는 프로그램을 만들어 보고, 추후에 원래 목적이었던 학식을 파싱해서 올리는 것으로 완성하려고 한다. Python 3.4.1, Mac OS X 기반으로 쓰인 글임 페이지 만들기 개인 담벼락이나 그룹이 아닌 페이지에 글을 포스팅하기를 원하기 때문에 페이지를 만들어야 한다. 임의의 페이지를 만들고 정보 창에서 Facebook 페이지 ID 를 복사하여 메모해둔다. 페이스북 앱 만들기 Facebook Developer 사이트로 이동하여 개발자로 등록을 한다. Facebook...
-
Beautifulsoup로 학식 테이블 스크래핑하기
처음 파이썬에 관심을 가지게 된 이유는 크롤러와 스크래퍼 때문이었다. 이번에는 BeutifulSoup를 활용해 동국대학교 학식 식단표를 스크래핑해본다. (Mac OS X, Python 3.4.1 환경에서 실행된 내용임) BeatifulSoup 설치 user$ pip install beautifulsoup4 위의 명령어를 입력하여 BeutifulSoup를 설치한다. 스크래핑할 페이지 갖고오기 from bs4 import BeautifulSoup from urllib.request import urlopen html = urlopen('http://dgucoop.dongguk.edu/store/store.php?w=4&l=2&j=0') source = html.read() html.close() print(source) 우선 BeautifulSoup을 import하고 홈페이지를 얻어오기 위해 urllib의 urlopen을 import해온다. 그리고 동국대학교 학식 식단표 페이지의 주소를 갖고 오도록 urlopen을 사용한 뒤 가져온...
-
Pyenv + VirtualEnv로 파이썬 가상 개발환경 구축하기
프로젝트를 진행하다보면 같은 파이썬 프로젝트라도 요구되는 파이썬 버전이나 사용하는 프레임워크의 버전이 다를 수 있다. 이런 문제를 해결해줄 수 있는 것이 pyenv와 Vvrtualenv이다. Mac OS X 기준으로 pyenv와 virtualenv를 setup 하고 설정하는 방법에 대해 기록해본다. pyenv: 로컬에 다양한 파이썬 버전을 설치하고 사용할 수 있도록 한다. pyenv를 사용함으로써 파이썬 버전에 대한 의존성을 해결할 수 있다. virtualenv: 로컬에 다양한 파이썬 환경을 구축하고 사용할 수 있도록 한다. 일반적으로 Python Packages라고 부르는 ( pip install을 통해서 설치하는 ) 패키지들에 대한...
-
Django fixture json파일 만들고 불러오기
app의 post데이터를 fixture로 만들기 >>> python manage.py dumpdata app.Post --indent 4 > post.json --indent 옵션을 이용하면 생성된 json파일이 좀 더 깔끔하게 출력된 것을 확인할 수 있다. (생략도 가능하다.) post.json 픽스쳐를 DB로 불러오기 >>> python manage.py loaddata post.json 위 명령어를 사용하면 해당 json파일을 DB로 불러올 수 있다.
-
Python study - Dictionary
지금 진행하고 있는 Django프로젝트에는 Dict자료형으로 데이터를 주고받는 경우가 많다. Dict를 처음 접해본 나로서는 헤매고, 구글링 하며 여러 자료를 찾아보곤 했었는데, 마침 좋은 자료가 있어서 이렇게 정리해 본다. Dictionary 딕셔너리는 사전형 자료구조로 key와 value사이의 관계를 저장한다. dict = {key: value} 생성하기 >>> d = {'jan': 1, 'feb': 2, 'mar': 3} >>> print d['jan'], d['feb'], d['mar'] 1, 2, 3 위 예시에서 'jan', 'feb', 'mar'는 d라는 딕셔너리의 Key에 해당하고, 1, 2, 3은 Value에 해당한다. >>> d = dict(jan=1,...