달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

살다보면 이런 저런 일이 많다. 쿼리도 짜다보면 이런저런 일이 많다.

이런저런일 하다가 group_concat 으로 묶은 문자열 중에, 특정 문자열이 몇 번인지 확인이 필요 했다.

디비에서는 주로 학급을 예로 많이 들던데 ㅋㅋㅋㅋ

예를 들어서 특정 학생이 100점을 몇번 받았는가를 확인하는 그런거!!를 짜보자.


테이블 셋팅은

idx - 학번

name - 이름

subject - 과목

score - 점수

testdate - 시험친 날


간단하게 이렇게만 하자!

간단하게 학생의 평균 점수는

SELECT AVG(score) FROM STUDENT GROUP BY idx

하면 된다.

자, 그런데 100점을 2번 받은 학생들만 뽑아보도록 해보자. 으트케? 이르케!


SELECT * FROM STUDENT t1 JOIN 
        (SELECT idx, GROUP_CONCAT(score) AS scores FROM STUDENT GROUP BY idx) t2 
        WHERE 
            ROUND ( ( CHAR_LENGTH( t2.scores ) - CHAR_LENGTH( REPLACE( t2.scores , '100', '' ) )
             / CHAR_LENGTH( '100' ) ) ) = 2


자 겁나 쉽지 않은가? 

겁나 간단한걸 stackoverflow에서 찾았다!! 갓플로우


다들 소스보시면 아하! 하겠지만, 모르는 사람을 위해 원문 링크는 아래에!!


https://stackoverflow.com/questions/12344795/count-the-number-of-occurrences-of-a-string-in-a-varchar-field

Posted by
|

MacBook WiFi 문제..

기타 2017. 12. 14. 17:55

음..어... 회사에서 아이폰 개발 하라고 맥북프로를 사줬따.

음... 그런데, 이게 너무 화면도 작고 키보드도 손가락 나갈거같이 키감이 거지같고 해서 집에 해킨토시를 설치했다. 2개월 정도 걸렸다....ㅎ 회사에서는 맥북으로 집에서는 집컴터로 그렇게 개발을 하는데,

집에서 해킨토시 설정 잡는데, 집에서 인터넷 선 좀 지저분해 보여서 usb 와이파이 모듈 사서 쓰는데, 와이파이가 검색이 안됨, 우리집꺼만. 옆집 뒷집 앞집 윗집 아래집꺼 다 뜨는데 우리집 꺼만 안뜸. window에서는 잘 쓰던건데... 설정 문제면 다 안떠야 하는데 우리집만 안뜸.. 알고보니까 채널 문제......

여러분 2.4G WiFi 는 1~9 채널까지만 사용이 가능합니다.... 근데 아이폰은 채널 상관없이되는 듯...???

그리고, 회사에 와이파이 기기를 바꿨다. 고장나거나 그래서도 아니고, 왜 바꾼 건진 모르겠다. 기기도 동일하다. 근데 맥북프로로 와이파이가 안잡힌다. 뭐지.... 하고 핫스팟을 켜봐도 연결이 안된다.. 갑자기....

그렇게 몇주 쌩쑈를 하고 서비스센터까지 갔다 오고, 초기화도 해보고 다 해봤는데, 140번대 채널을 150번대 채널로 변경을 한 번 해봤거든?? 잘돼...

여러분 혹시 애플에서 권장하는 5G WiFi가 안되면, 150번대 채널을 사용하세요.

아무리 검색으로 찾아봐도 서비스센터에가서 물어봐도 상담사한테 물어봐도 채널에 관한 말은 없었는데, 집에서 2.4G 와이파이가 10채널 이상을 찾지를 못하는 것이 생각나서 혹시나 해서 채널 바꿔봤는데.. 잘된다....

연결이 안될거 같으면 와이파이 목록에 뜨질 말든가 겁나 짱나네 진짜 시X 애플. 아오 빢쳐

어딜 검색해도 안뜬다. 다른 윈도우 노트북들은 다 잘 잡힌다. 핸드폰도 다 잘잡힌다. 아이폰도 다 잘 잡힌다. 근데 맥북만 안된다. 하면 WiFi 채널을 바꿔보자. X발.....

Posted by
|

일단, 나는 UIWebView 를 써보지 않았다. WKWebVIew만 써봤다. Android에 WebView랑 비슷한 듯.


하이브리드 앱에 홈페이지 로그인 할 때 자동 로그인 체크하고, 로그인을 하게 되면 앱이 종료되면 쿠키 삭제ㅋ 됨ㅋ 자동 로그인 안됌ㅋ 뭐지... 하고 이런저런 테스트를 해봤는데, WKWebView에는 php에 setcookie가 안 먹히드라. 결국 자동로그인 쿠키가 생성이 안됨ㅋ

안되면 되게 하라... 스크립트로 처리를 함.

AppDelegate에서


func applicationWillResignActive(_ application: UIApplication) {
    web.evaluateJavaScript("document.cookie", completionHandler: {(object, error) in
        if let string: String = object as? String {
            UserDefaults.standard.set(string, forKey: "cookie")
        }
    })
}

이렇게 앱이 foreground에서 벗어나게 되면 쿠키를 수시로 저장시키자. 아, 근데 php setcookie로 생성된 쿠키는 저기에서 확인이 안된다.ㅋ

 일단 WKWebView에 WKUserContentController() 를 통해서 자바스크립트 인터페이스(안드로이드에서는 이렇게 부른다 swift에서는 콘텐츠컨트롤러라고하는건가...?)를 등록하고, 로그인 처리하는 페이지에서 스크립트로 실행 한 후에 UserDefault에다가 자동로그인 체크를 했다는 정보를 넘겨주어서 앱에서 자동으로 쿠키를 생성시켜서 처리를 했다.



let contentController = WKUserContentController();
let config = WKWebViewConfiguration();
contentController.add(self, name: "javascriptInterfaceName"); // name 에다가 원하는 자바스크립트인터페이스 이름을 입력하면 되시겠다.
config.userContentController = contentController;
let webview = WKWebView(frame: uiController.view.frame, configuration: configurate!)

그리고 웹페이지에서 어떻게 실행을 시키는 고하면

webkit.messageHandlers.javascriptInterfaceName.postMessage( { key1 : value1, key2 : value2, key3 : [ value3_1, value3_2 ] } );

위 소스를 실행시키면 된다.


위 소스를 실행시키게 되면, 

@available(iOS 8.0, *)
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
// message.name 이녀석이 javascriptInterfaceName 이랑 매칭이 된다. 요녀석으로 용도별로 처리하면된다.
// 보안 문제가 발생 할 경우가 있으니까 꼭 if message.name != "javascriptInterfaceName" {return} 이런 식으로 지정한  스크립트가 아니라면 막길 권한다.

    guard let mbody = message.body as? Dictionary<String,Any> else {return} // json 형식으로 파라미터 값을 넘겼으니까 Dictionary로 변환 가능하다.
    let value1 = mbody["key1"] as? Any
    let value2 = mbody["key2"] as? Any
    let value3 = mbody["key3"] as? Array<Any> // 마지막은 리스트형식이니까,
}

WKWebView 내의 이런 소스에서 실행이 된다. 참고로 iOS8 부터 사용 가능하다.

이렇게 아무튼 저기서 자동로그인 체크를 했다는 것을 앱으로 전달해서 UserDefault에 다가 저장했다가 앱 실행시마다 자동로그인 쿠키값을 생성해주면 되겠다. 어떻게?? 아래처럼 참고하자.


아래 setCookie에 해당하는 메소드는 구글링을 통해서 찾았으나, 출처를 따로 안적어놨네..........죄송합니다..

webview.evaluateJavaScript("document.setCookie = function (name, value, expiredays) {var cookie = name + \"=\" + escape(value) + \"; 
path=/;\"; if (typeof expiredays != 'undefined') {var todayDate = new Date(); todayDate.setDate(todayDate.getDate() + expiredays); cookie += \"expires=\" +todayDate.toGMTString() + \";\"; } 
document.cookie = cookie;}",completionHandler: nil)

WKWebView에다가 저렇게 하고

webview.evaluateJavaScript("document.setCookie('\(key)','\(value)', '\(expiredays)')", completionHandler: {
    (o,e) in web.reload()
})

이렇게 key(쿠키 명), value(쿠키 값), expiredays(저장 기간) 값을 넣어서 쿠키를 생성시키고, 페이지 새로고침을 해줘야 제대로 인식을 한다.

마지막으로 저기 document에 체이닝 되어진 setCookie 메소드를 제거해주자.

webview.evaluateJavaScript("delete document.setCookie", completionHandler: nil)


이렇게 하면 깔끔하게 처리가 된다.

'모바일 개발 > iOS-Swift' 카테고리의 다른 글

초기화에 대해서..  (0) 2017.10.25
Posted by
|