반응형

네이버 앱을 통해 코로나 19 잔여 백신을 에약하겠다고 예약 알림만 믿고 있다간 절대 잔여 백신 예약이 불가능하다란 점을 미리 밝혀둔다.

보이는가 이 처절한 화이자 예약실패의 흔적들
모두 알람이 떠서 방문하거나 지도를 이리저리 움직여가며 잔여백신이 뜰때 잽싸게 화이자 예약을 시도했지만 실패의 연속이었다.
(맨 위의 아스트라제네카 예약 취소는 화이자인줄 알고 예약 했다가 번화로 취소쑈까지 ㅜㅜ)

아스트라제네카는 상당히 수월한 반면 화이자나 모더나는 하늘의 별을 따겠다란 신념으로 도전해도 이렇게 매번 실패의 쓴잔을 맛보게 된다.

그렇다고 알림이 불필요한가?
그건 아니다. 반드시 필요하다.

이유는 네이버 잔여백신 예약화면에서 푸시알람이 왔을 때 잽싸게 예약하기를 눌러야만 잔여 백신 접종 예약이 가능하기 때문이다.


이렇게 말이다.

평소 그냥 9월에 맞아야지 싶다가 오늘은 이상하게 화이자 잔여 백신을 예약하고 싶어 유심히 지켜본 성공의 결과였다.

요약해보자
1. 접종 기관 5곳을 등록해둔다.
2. 앱을 켜놓고 지켜보자
3. 우연히 지켜볼 때 잔여백신 알람이 뜨면 예약하자

알람 뜬거 보고 앱 켜고 이러면 절대 잔여 백신 예약 못한다.
화이자는 5개 남아있어도 바로 순삭 된다.
아스트라제네카는 천천히 느긋하게 해도 충분히 가능하다.
하지만 20,30,40대라면 당근 화이자나 모더나를 맞자.


백신 아깝다고 의료계 지침을 쓱 넘기며 잔여백신은 접종하게 만드는 상황일 보며 무슨 생각이 드는가?

일본 후쿠시마 원전 터지고 허용 방사능 수치 올려버리는 일본 정부를 보면 무슨 생각이 드는가?

반응형
Posted by Hippalus
,

반응형

관에서 만든 서비스인지라 이정도 퀄리티면 "그래 수고했다" 말해줘야 하는것인지 싶다가도 얼척없는 구성과 수준낮은 서비스 안정성에 혀가 차지는건 어쩔 수 없다.
그나마 접속이라도 원활했던 나도 이정도의 분개감이 드는데 그 이전 대기 타며 어렵게 예약했던 사람들은 부처인가? 예수인가? 아니면 공자인가?

일단 압권인 예약 가능 병의원 선택부터 지적해보자

분명 코로나 백신 예약이 가능한 병의원이고 예약 가능 의원도 충분한데 막상 최종 예약버튼을 눌러보면 -20001 오류가 뜬다.
어제 저녁 8시 언저리에 예약을 시도해본 결과 이거 뜨면 그 다음 그 지역내 예약은 불가능한것 같다.
실제로 내가 거주하는 동들 리스트업 된 병의원 5곳 모두 -20001을 보여준다.
그러면 누군 또 이럴것이다.
"그 사이 예약이 다 됐나보지"
과연 그럴까?
좀전인 오늘 새벽 5시에 예약을 시도해본 결과 똑같다.

사람이 몰려 그사이 하필 5명/14명(예약가능 인원/예약 중 인원) 이렇게 널럴한 상태에서도 그 지역의 모든 병의원이 순식간에 예약이 되었을까 ㅡㅡ


좋다.
그럼 중복로그인 차단 서비스를 보자
앞서 말한 -20001 예약 오류가 뜨면 새로 시작하는 수 밖에 없는데 이러면 중복로그인이라며 10분동안 재인증이 불가능하여 하염없이 대기타야 한다.
그런데 여기서 또 웃기는게 10분뒤에 접속해보면 정확히 내가 시도했던 그 주는 전부 예약 불가 처리되어 있고 그 다음 주만 예약이 가능한 상태로 보여진다란 사실이다.
예약 개시시간대이던 그 다음날 널럴한 새벽 시간대이던 마찬가지다.
-20001 오류 때문에 어제 2번 오늘 새벽 3번 해보았는데 모두 동일한 결과였다.
대충 의심이 드는 알고리즘이 있긴 한데 그냥 뭐스럽다 이야기만 하고 지나가련다.

이제 대망의 팁
위 오류는 누구나 겪을 수 있는 기초적인 서비스 오류이다.
오류가 발생하면 재접속해 개인정보를 또 반복 입력해야 하는데 그나마 불필요한 개인정보를 계속 입력하지 않기 위해선 코로나 백신 사전 예약시 아이폰 앱스토어나 구글 플레이스토어에 접속하여 질병관리청에서 만든 COOV란 앱을 다운받아 미리 준비해두면 입력해둔 개인정보가 불러와지므로 중국 코로나 백신 예약하기에 수월하다.
사실 이 앱도 처음 앱 켜고 사용 언어 선택하자마자 튕기고 본인 인증시 인증 오류를 나타내는 등 불안 불안한건 마찬가지다.
(도대체 관에서 만드는 온라인 서비스들은 왜 하나같이 이모양인가? 검수 똑바로 안하나?)

그래도 그나마 코로나 사전 예약 서비스보단 낫다.


기타 정보
코로나 사전 예약 시스템 예약 주소 : https://ncvr2.kdca.go.kr/

접종대상자
18~49세(주민등록상 ‘72.1.1. ~’03.12.31. 출생)

10부제에 따른 예약 시간
생일끝자리가 7이면 8월 17일 오후 8시 부터 다음날 오후 6시까지, 8이면 8월 18일 오후 8시 부터 다음날 오후 6시까지,
접종 대상자 중 예약을 못했던 자들은 19, 20, 21일 이용
"중국 코로나가 창궐한지 2년이 되어가고 있다.
뻔뻔한 중국의 태도에 어처구니가 없지만 일반인들이 할 수 있는 일은 버티는 일 말고는 없는것 같다."

반응형
Posted by Hippalus
,

반응형

개발하다보면 datetime이 NULL인 경우가 종종 있다.
(NULL도 엄연히 자료이고 무서워해선 안된다.)

SELECT expiredate AS expiredate FROM MEMBER_TBL
실행시 expiredate가 null이라면 출력 결과를 사용할 때 안전하게 또는 예쁜 결과를 얻기 위해 isnull(expiredate, '')과 convert함수를 동원하여 쿼리를 돌려보면 예상과 다르게 1900-01-01 이 짜잔하고 나타난다.

이땐 COALESCE 함수를 사용하면 원하는 결과인 공백을 얻어낼 수 있다.
SELECT COALESCE(CONVERT(CHAR(10), expiredate), '') AS expiredate FROM MEMBER_TBL

stackoverflow.com에도 잘 설명되어 있다.
https://stackoverflow.com/questions/26282007/convert-null-datetime-to-blank/52191530

반응형
Posted by Hippalus
,

MSSQL OUTER APPLY

모바일 & 앱 2021. 7. 23. 10:06

반응형

SELECT
*
FROM
TABLE1 AS TBL1
OUTER APPLY (
  SELECT
     *
  FROM
     JOINTABLE AS TBL2
  WHERE
      TBL1.KEY = TBL2.KEY ) AS RESULT

 

자꾸 까먹어서 써놓음

반응형
Posted by Hippalus
,

반응형

왁싱 한지도 좀 되어서 네이버로 검색질 하던 중 미아사거리에 왁싱 및 태닝을 전문으로 하는 신규 전문점이 발견되었다.
사전 예약제였는데 밤에 예약하고 다음날 바로 왁싱을 받을 수 있었다.

남자가 브라질리언을 받는다란게 일반인(?)의 시각에선 다소 이해가 안가는 사람들이 있겠지만 한 번 받으면 왜 받아야 하는지 몸소 깨우치게 된다.

미아사거리 왁싱 전문점인 탠블리를 찾아가는 길부터 설명하자면 위치는 미아사거리역 1번 출구에서 나오면 롯데백화점 후문 건너편의 메가커피와 세븐일레븐 골목으로 100미터 정도 들어가면 요런 간판의 탠블리가 똿 하고 나타난다.

비오는 날 탠블리

지도상으로 보면 요러함

예약전화 : 0507-1462-5026
서울특별시 강북구 도봉로10라길 20-13
https://tanvely.modoo.at/

이벤트 중이라 브라질리언 왁싱이 남성은 100,000원인데 50% DC가인 50,000원에 가능하였고, 시술 이후 6주 이내 재방문시 정상가의 50%, 8주 이내 재방문시 20% DC를 해주는 시스템으로 운영되고 있었다.
보통 다른 왁싱점들은 첫 방문만 10% 정도 DC를 해주는 반면 꾸준한 관리를 유도하기 위한 시스템으로 보임

탠블리 가격표

가격표는 대략 이러한데 겨드랑이가 30,000원이므로 이역시 DC가인 15,000원이므로 브라질리언과 겨드랑이를 같이 한다면 65,000원에 가능하다.
매번 장비 수염처럼 삐져나와주는 겨X이 은근 짜증이 났었고 가격도 저렴해서 이날 처음으로 겨드랑이까지 같이 해버림

탠블리 내부

내부는 상담과 대기할 수 있는 공간과 제품 판매 뒷편으로 왁싱공간 그리고 별도의 룸에 위치한 태닝실로 구성되어 있다.
(잘 몰랐는데 왁싱 받는 동안 태닝 손님만 세 분이 다녀가시던데 다들 태닝 은근 많이 하나봄)

브라질리언 왁싱을 받아본 사람들은 매번 거치는 과정이라 잘 알겠지만 혹여 처음 받는 사람을 위해 과정을 잠시 적자면

1. 사전조사 및 왁싱 방법 선택
간단한 인적사항과 피부질환 등의 설문지를 작성하면 왁싱 종류를 선택해야 한다.
하드왁싱과 슈가링 왁싱이 있는데 슈가링 왁싱은 당일 운동도 가능하고, 피부 침색면에서나 슈가링을 강추하셨지만 나는 통증을 크게 느끼지 못하는 쌍남좌라서 하드왁싱으로 고고
(탠블리 선생님의 이야기론 슈가링 왁싱은 시술자의 능력에 크게 좌우 되는데 시술자가 초보라면 오히려 통증이 더 클 수 있으므로 반드시 경력을 보유한 전문샵에서 해야 한다란 의견이셨음)

슈가링 왁싱에 대한 소개는 요걸로 대체

2. 소독
왁싱 방법도 정했으면 이제 치마로 갈아입고 소독을 해야 하는데 후끈 거림에 처음엔 깜놀했지만 정말 소독이 잘 되는 기부니가 듦

3. 털뽑
소독하고 근 30~40분 동안 털뽑 털뽑 반복
다른 샵은 딱 Y존만 하고 그 옆은 나몰라라 하는 곳도 있어 시술 후 집에와서 자괴감이 들지만 탠블리는 깔끔하게 사각 수영복 라인 언저리까지 깔끔하게 정리해주셔서 꽤나 만족도가 높았음
사실 다른곳에선 하드 왁싱 시술시 지옥존이란곳이 있어 그곳 만큼은 나도 헉 소리가 났었지만 탠블리에선 왁싱 지옥의 입구도 가보지 못했을 정도로 통증이 없었다
(끝나고 잠시 이야기 나누게 되었는데 다른 사람들은 아무리 잘 참아도 움찔거림이 있기 마련인데 나같은 사람은 처음보셨다 하심 ㅋㅋ)
4. 진정
팩으로 진정시키는데 요건 서비스라 하셨음
이렇게 4단계로 진행된다.
그리고 처음 해본 겨드랑이는 피부가 연한 부위라 그런지 왁스를 떼어낼 때 다른 부위와는 다른 얇고 잔잔한 짼짼한 야리야리한 느낌이라 표현하면 적당한 그런 느낌?
여튼 그런 통증이 될랑말랑 할 때 손으로 진정해주면 그 묘한 충격이 싹 사라지는데 신긔신긔함.
왁싱 시술 받은지 오늘로 이틀이 되었는데 재방문하고 싶은 별점은 ★★★★★ 이었다.
왁싱은 보통 6주~8주정도 재방문을 추천하지만 가격 부담 때문에 3~4개월마다 다니는 편이었는데 이정도 퀄리티에 가격이라면 제때 맞춰 다녀볼만 하지 싶다.


정말 끝으로 본인은 준법정신이 남달라 뒷광고 따윈 하지 않으며 법을 어길 생각도 없기에 아직 아무런 지원을 받지 않은 상태이고 나중에 방문했을 때 윗 사진처럼 SNS EVENT를 통해 무료로 포인트 왁싱 2곳을 지원 받을 예정인데 무료로 지원받을 예정으로 작성된 글이라고 써야하낰ㅋㅋㅋㅋ

잠시 정색하며 남김
"이 포스팅은 해당업체로부터 (포인트 왁싱 2곳) 서비스를 무료로 지원받을 예정으로 작성된 글입니다."

반응형
Posted by Hippalus
,

반응형

미아사거리 왁싱전문점인 탠블리에서 왁싱을 받아본지 5주가 지났다.
리터칭을 받아볼겸 이번엔 처음으로 다리털가지 도전해 보았다.
이날의 결과물은 다음과 같다.
성인 남성의 다리샷은 나름 혐짤이므로 보고 싶은 분들만 보게끔 숨겨두었다.
보시고 싶다면 눌러 보시라~ 하지만 추천은 못하겠다.

보셨다 치고
다리 제모 시술을 받은지 아직 24시간도 지나지 않아 모공에 약간 붉은끼가 돈다.
좀 있으면 다 사라질듯함.

가격은 50% 이벤트 DC를 받아 \60,000이었다.
가격표 상으론 이처럼 \100,000이지만 가격상승이 되었다 하셔서 \60,000임.
다리털이 비교적 중간치에 속하는 나이지만 시술시간이 40분 이상 걸린것 같다.
왜 브라질리언과 다리털 제모가격이 동일한지 이해가 되더란.

사실 다리털은 그동안 {카이 레그트리머} 요녀석을 이용해 적당히 밀지 않고 중간모를 컷팅 해주는 방식으로 관리하고 있었지만 왁싱에 빠지다보니 다리까지 왁싱을 하게 되었다.

올 여름 코로나 덕분에 활기차게 돌아다니진 못하겠지만 그래도 계곡으로 바다로 놀러가실 분들 많을테니 제모를 통해 타인의 안구에 편안함을 선물함이 어떨까 싶다.

끝으로 탠블리 정보를 포함하자면 아래와 같다.

예약전화 : 0507-1462-5026
서울특별시 강북구 도봉로10라길 20-13
1인샵으로 운영됨
https://tanvely.modoo.at/

[탠블리 - 홈]

미아사거리 왁싱/태닝 전문 탠블리입니다.

tanvely.modoo.at


단 1원도 협찬 받지 않고 작성한 후기임

반응형
Posted by Hippalus
,

반응형

    Function ARRAYMERGE( arr1, arr2 )

        dim arr1_size, arr2_size, total_size, i, counter

        

        if not isArray( arr1 ) then 

            arr1 = Array( arr1 )

        end if

        

        if not isArray( arr2 ) then 

            arr2 = Array( arr2 )

        end if

        

        arr1_size = ubound( arr1 ) : arr2_size = ubound( arr2 )

        total_size = arr1_size + arr2_size + 1

        counter = arr1_size + 1

        

        Redim Preserve arr1( total_size )

        For i = lbound( arr2 ) to arr2_size

            If isobject( arr2( i ) )then

                set arr1( counter ) = arr2( i )

            Else

                arr1( counter ) = arr2( i )

            End if

            counter = counter + 1

        Next

        ARRAYMERGE = arr1

    End Function

반응형
Posted by Hippalus
,

반응형

DIV태그 안에 컨텐츠를 넣고 프린트시 자칫 짤림 현상이 나타날 수 있음
이때 style로 media print에 클래스로 아래와 같이 지정해주고 div에 해당 클래스명을 지정해주면 프린트 할 때 알아서 다음 페이지로 잘 넘어가진다.

<style type="text/css">
        @media print {
            .page-break { page-break-inside:avoid; page-break-after:auto }
        }
</style>

<div class="page-break">
    <div><br>TEST</div>
</div>
<div class="page-break">
    <div><br>TEST</div>
</div>
.
.
.
<div class="page-break">
    <div><br>TEST</div>
</div>

$("#BTNE").click(function(e) {
    e.preventDefault();

   
window.print();
});

 

반응형
Posted by Hippalus
,

반응형

보통 Xcode에서 빌드시 연결 오류가 나면 연결잭을 분리 후 다시 연결하면 대부분 해결 되는데 이번엔 해결 되지 않고 이런 오류를 내뱉는다.

이럴 땐 아이폰을 재시작하면

해결된다.


잘 동작한다.

항상 느끼지만 윈도우 개발보다 모바일 앱 개발은 디바이스부터 개발 언어의 잦은 변경질까지 다양한 요소들까지 신경써줘야 한다.

반응형
Posted by Hippalus
,

반응형

iOS 앱을 만들다 보면 가장 처음 접하게 되는 문제가 이 키보드 가림 문제이다.
보통 책이나 웹상에 떠도는 소스들을 보다보면 매우 간단하게 UITextFiled 하나만 배치하여 키보드가 나타나면 뷰를 올려주고 키보드가 내려가면 다시 뷰를 내려주는 단순한 상황만 언급할 뿐 실제 현업에서 발생 가능한 UITextField가 여러개일 때
즉 상단에 위치한 UITextField컨트롤은 키보드가 보여줘도 그대로 놔둬야 하고 하단에 위치한 UITextField 컨트롤은 키보드만큼 올려줘야 하는 상황에 대해 제대로 해결책을 제시하는 글은 찾기 힘들다.
오늘 소개할 이 방법 말고도 여러 방법들이 있겠지만 초보자도 쉽게 따라할 수 있는 방법을 택하여 소개하고자 한다.

대략 순서는 이러하다.
1. viewDidLoad에서 UITextField Delegate  연결 
2. viewDidLoad에서 NotificationCenter를 이용하여 Observer 등록 : 키보드 Show, Hide 이벤트 확인
3. UITextField가 키보드에 가려졌는지 확인을 위한 해당 컨트롤의 위치좌표(Y) 확인
4. 가려졌다면 뷰 이동 O, 안가려졌다면 뷰 이동 X
5. 모든 작업 종료 후 viewWillDisappear에서 2번에서 등록했던 Observer 제거

입력 전 화면
첫번째 컨트롤에 포커스 된 화면(키보드가 가려지지 않으므로 뷰 이동 X)
두번째 컨트롤에 포커스 된 화면(키보드가 가려졌으므로 뷰 이동 O)
세번째 컨트롤에 포커스 된 화면(키보드가 내려간 상태였다면 뷰 이동이 되어야 하지만 이미 키보드가 올라온 상태이므로 뷰 이동 X)

1. TextField의 처리를 위해 UITextFieldDelegate 프로토콜 추가
(이후 TextField 컨트롤은 편의상 컨트롤이라 칭함)
class
MyViewController: UIViewController, UITextFieldDelegate {
}

2. 컨트롤 변수와 컨트롤을 연결(너무 기초라 패스)
위에서부터 순서대로 txtTmp, txtId, txtPw
    @IBOutlet weak var txtTmp: UITextField!
    @IBOutlet weak var txtId: UITextField!
    @IBOutlet weak var txtPw: UITextField!

3. viewDidLoad()에서 컨트롤 변수의 delegate 연결 및 키보드를 내리기 위해 완료 버튼(done)을 추가해준다.
        txtTmp.delegate = self
        txtId.delegate = self
        txtPw.delegate = self

        txtTmp.returnKeyType = .done
        txtId.returnKeyType = .done
        txtPw.returnKeyType = .done

4. 키보드가 올라왔나 내려갔나 확인을 위해 NotificationCenter로 Observer 등록        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
이렇게 구현하면 keyboardWillShow, Hide가 없다고 에러가 뜰텐데 원칙상 선 구현 후 정의를 내려야 하지만 편의상 그냥 구현한다.

5. 키보드가 올라왔을 때 컨트롤이 키보드에 가려졌을 때 뷰를 그만큼 올려주는 처리와 내려갔을 때 뷰의 위치를 다시 되돌려 놓는 처리 그리고 지금 컨트롤이 키보드에 가려졌는지 안가려졌는지 확인을 위한 처리 구현

먼저 키보드가 컨트롤을 가렸는지 확인을 위해 변수 하나를 실수형으로 선언한다.
    var
fCurTextfieldBottom: CGFloat = 0.0

현재 포커싱된 컨트롤의 좌표를 구하기 위해 textFieldDidBeginEditing에서 현재 컨트롤의 y좌표와 해당 컨트롤의 높이를 더하면 나중에 키보드에 의해 가려졌는지 확인이 가능하므로 계산 후 일단 보관해둔다.
    func textFieldDidBeginEditing(_ textField: UITextField) {        
        fCurTextfieldBottom = textField.frame.origin.y + textField.frame.height    
    }

이제 4번에서 등록한 selector함수인 키보드가 나타났을 때와 내려갔을 때 함수를 구현한다.
키보드의 사이즈(구조체)를 keyboardSize에 보관 후 현재뷰의 높이에서 빼주면 키보드가 잡아먹는 정확한 위치를 알 수 있다.
이를 앞서 계산해 보관해둔 fCurTextfieldBottom와 비교하여 fCurTextfieldBottom가 작거나 같으면 가려지지 않았으니 무시하고 크다면 1px이라도 가려졌으므로 현재 뷰를 키보드가 잡아먹는 높이만큼 올려주면 된다.
    @objc func keyboardWillShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            if fCurTextfieldBottom <= self.view.frame.height - keyboardSize.height {
                return
            }
            if self.view.frame.origin.y == 0 {
                self.view.frame.origin.y -= keyboardSize.height
            }
        }
    }

키보드가 사라졌을 땐 간단하다.
그냥 뷰가 이동됐으면 다시 원상복구해주고 아니면 아무런 처리를 하지 않는다.
    @objc func keyboardWillHide(notification: NSNotification) {
        if self.view.frame.origin.y != 0 {
            self.view.frame.origin.y = 0
        }
    }

앞서 추가했던 done의 처리도 해주어 키보드가 내려가게끔 구현해준다.
    func textFieldShouldReturn(_ textField: UITextField) -> Bool
         textField.resignFirstResponder()
         return true
     }

이렇게만 해두면 기본적인 처리는 다 되었고 만약 완료버튼(done) 대신 뷰의 아무곳이나 터치했을 때 키보드가 내려가길 원한다면
viewDidLoad에 제스쳐를 등록 후 
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(endEditing)))

관련 함수를 구현해주면 깔끔하게 처리가 가능하겠다.
   
@objc func endEditing() {
        txtTmp.resignFirstResponder()
        txtId.resignFirstResponder()
        txtPw.resignFirstResponder()
    }

 

반응형
Posted by Hippalus
,