남명 조식 선생 상소문

명종 10년에 단성 현감에 제수되었을 때 사직하며 올린 상소 ... 전하의 국사는 이미 잘못되고 나라의 근본이 망하여 천의도 인심도 벌써 떠났습니다. 비유하자면 백 년 된 큰나무에 벌레가 속을 다 갉아먹어 진액이 모두 말라버렸는데 회오리바람과 사나운 비가 언제 닥칠지 모르는 것 같은 상황입니다. ... 소관들은아래에서 시시덕거리며 주색이나 즐기고 대관들은 위에서 어물거리며 재물만 불립니다. 백성의 고통은 아랑곳하지 않은 채 내신들은 후원하는 세력을 심어 용을 물에 끌어들이듯 하고 외신들은 백성의 재산을 긁어들여 이리가 들판에서 날뛰듯 하면서도 가죽이 다 해지면 털도 붙어 있을 데가 없음을 모릅니다. 자전께오선 생각이 깊으시나 깊숙한 궁중의 한 과부에 지나지 않고 전하께오선 어리시어 단지 선왕의 외로운 후사에 지나지 않습니다. 천 백가지의 천재와 억만 갈래의 민심을 무엇으로 감당할 것이며 어떻게 수습하시겠습니까? ... 전하께서 좋아하시는 것은 어떤 일들입니까? 학문을 좋아하십니까? 풍류와 여색을 좋아하십니까? 군자를 좋아하십니까? 소인을 좋아하십니까? 전하께서 좋아하시는 것에 나라의 존망이 달려 있습니다. ... 이에 대한 명종의 답변이다 읽어보니 비록 간절하고 강직한 듯하나 자전에 대해 공손치 못한 표현이 있으니 군신의 의리를 모르는 것 같아 매우 한심스럽다. 이런 사람을 군신의 명분을 안다고 천거했는가? 임금이 아무리 어질지 못하기로 신하로서 어찌 차마 욕을 한단 말인가? 군상을 공경하지 않는 죄로 다스리고 싶지만 초야의 선비이므로 묻지 않겠다. 박시백의 조선왕조실록 09편 199-200

XCode 8.1 에서 Swift 3.0.1 으로 Realm 사용기

데이터베이스를 Realm 을 사용하기로 했다. 쉽고 간단하게 사용할 수 있다고 하며 매뉴얼이 잘되어 있다. 한번 따라 해보기로 했다. 프레임 워크를 수동으로 추가했다. 수동 추가 방법은 Target - General - Embedded Binaries 에서 + 버튼을 클릭하여 추가하면 된다. 반드시 다운받은 폴더에서 3.0.1 의 프레임 워크 파일을 선택해야 한다. Swift 3.0 폴더를 선택해서 한동안 알수 없는 오류로 마음고생을 해야 했다. 이제 프레임 워크를 임포트를 한다. import RealmSwift import Realm 그리고 데이터베이스에 사용할 클래스 구조를 선언한다. Class 와 Struct 의 차이는 참조 와 값 전달의 차이이다. class WorkList: Object {   dynamic var id: Int = 0 } 이를 사용하려면 let myWork = WorkList() myWork.id = 2 입력할 자료를 생성하고 let realm = try! Realm() do {   realm.beginWrite()   realm.add(myWork)   try realm.commitWrite() } catch {   print("realm error: \(error)") } 이렇게 하면 입력이 된다. 파일을 생성해서 할 수 도 있는데 그냥 default 를 사용해야한다. config 에 FileURL 을 설정하여 하는 방법이 인터넷에 있길래 받아서 했는데 되지 않는다. realm browser 에서 보이지 않는다. 파일을 읽으려면 let results = realm.objects(WorkList.self) print(results) 객체 안에 타입을 넣는데 이건 선언한 타입을 넣어야 한다. myWork.self 를 넣어서 한동안 마음고생을 했다. MaxOS sierra 에서 realm 파일은 이곳에...

Swift 에서 두개의 Array을 순차적으로 합치는 방법

이미지
Swift 에서 두개의 Array 을 합치는 방법으로 각각의 열을 맞춰야 한다. 이럴땐 zip 이란 함수를 사용하면 된다. 위의 방법은 3개의 Array 를 각각의 순서대로 합친 결과이다. 즉 ["홍길동", "전우치", "강감찬"] 과 [3, 7, 6] 과 [2015-08-16, 2016-10-30, 2016-10-31] 의 Array에 각각의 값을 각 1항끼리 합칠 경우에 사용한다. flatMap 은 배열의 배열로 되어 있는 경우를 배열로 만들어 준다.

EKEventStore requestAccess 사용할때 접근되지 않고 오류날 때 조치방법(Swift3, Xcode 8.1, iOS 10.1)

이미지
일단 오류는 아래와 같은 오류입니다. 기존에 잘되던게 업데이트 하고 나서 안되는 경우입니다. info.plist 에 Privacy - Calendars Usage Description 추가하면  접근 메시지가 보여야 하는데 보여지지 않고 아래와 같은 오류가 나는 겁니다. 오류에 대한 대처는 전부 다 해본거 같습니다. 아래와 같이 수정하니 이부분의 오류는 나지 않고 잘 넘어갑니다. 접근 메시지도 잘 나옵니다, 결론은 error: Error? 이부분에서 ? 를 넣어주니 오류가 안납니다. 옵셔널 값에 대한 널을 허가 해주는 부분인거 같습니다.

Xcode 8 에서 GoogleMobileAds 추가하는 방법

이미지
XCode 8 에서 GoogleMobileAds 를 추가하는데 보통 cocoapods 을 사용한다. 하지만 이부분이 오류가 나서 되지 않는다. 그래서 수동으로 추가하니 No Such Module 오류가 난다. 매뉴얼을 보니 수동으로 추가하는 방법은 이렇다. Xcode -> File -> Add Files to "Project name" 를 클릭한다. 그러면 새로운 파일 선택 창이 뜬다. 여기서 다운 받은 Framework 파일 들을 선택한다. GoogleMobileAds.framework FirebaseAnalytics.framework FirebaseInstanceID.framework GoogleInterchangeUtilities.framework GoogleSymbolUtilities.framework GoogleUtilities.framework 위와 같은 파일은 선택하고 반드시 if need copy 를 체크해야 한다. 그러면 Xcode 왼쪽 프로젝트 파일 부분에 추가가 된다. 이제 소스에서 import GoogleMobileAds 를 추가해보자. 난 이렇게 하니 오류가 나지 않는다.

source code 이쁘게 나타내는 방법

설정의 템플릿에 헤더 부분에 아래 두개의 자바스크립트를 추가한다. https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/github.min.css 스위프트 코드 시험 func LongPress(_ gestureRecognizer:UIGestureRecognizer) { if gestureRecognizer.state == UIGestureRecognizerState.began { typingPlayer?.play() if view.subviews.contains(tableViewUser) { tableViewUser.removeFromSuperview() } userTextField.text = ShiftUserArray[selectedIndex] userTextField.layer.zPosition = userButton.layer.zPosition + 0.1 userTextField.isHidden = false userTextField.becomeFirstResponder() } }

swift 3 에서 AutoLayout 적용 후 하위 뷰의 width 값이 1000으로 이상하게 나올 경우

swift 3 에서 AutoLayout을 적용하였다.  하위 뷰에 코드로 생성하여 프레임 단위로 버튼을 여러개 넣는데 잘 안나온다.  로그를 찍어보니 Button.width = 1000 으로 나온다.  view.width = 375 인데....,  뭐가 잘못되었나?  동적으로 생성되는 많은 버튼도 전부 AutoLayout 방식으로 하자니 그동안 계산으로 만들어 놓은 코드가 아깝다.  단 한줄의 코드로 문제를 해결하였다.  전체적인 아웃라인은 뷰를 이용하여 디자인 타임에 스토리보드에서 작성을 하고 동적 생성은 뷰에 프레임 계산해서 넣으면 된다.  뷰가 로드 된 다음에 다음 줄을 넣어야만 정상적인 값이 나와서 계산이 가능하다. self.view.layoutIfNeeded() 나는 이런 방법으로 문제를 해결하였다.  계산 값 바로 이전에 넣어도 되는데 귀찮아서 viewDidLoad() 에 넣었다.