구글 도메인

 

미국 계정으로 구입하고 추천하는 호스팅 이용했는데 bluehost ...

 

SSL이 월 5천원... whois 는 일년 만원인데...

 

결국 whois 사서 등록하려니 installation error 헐...

 

에러 메세지 보니 구입 여부를 붙는 if 문이 눈에 선하다.

 

문의하려니 전화나 chat 밖에 없고 미국 회사라 불가 ㅡㅡ; 뭐지 이 어싱크 세대에 싱크함은?

 

그래서 공식 페북 테러했다.

 

  • 김구 u've got ssl certificate installation error.

    수정 또는 삭제

  • 김구 Template::Exception:
    [TYPE]=[undef]
    [INFO]=[SSL::installed_hosts() failed: You do not have the feature “sslinstall”.
    ]
    [TEXT]=[]
    at cpanel.pl line 1077.
    cpanel::cpanel::cptt_exectag("/usr/local/cpanel/base/frontend/bluehost/ssl/install.html.tt", 1) called at cpanel.pl line 4409
    cpanel::cpanel::run_standard_mode() called at cpanel.pl line 878
    cpanel::cpanel::script("cpanel::cpanel", "./frontend/bluehost/ssl/install.html.tt") called at cpanel.pl line 321

    수정 또는 삭제

  • 김구 How can I delete your service without any of additional charge? I think the error msg is that you want to make a user use your SSL cert purchasing to keep costly by blocking SSL which is bought other site right?

    수정 또는 삭제

  • 김구 Your chat and call help center is not matched these days, too. There's no way to complain about something this time without here.

보통은 나 자신을 바꾸면 모든게 바뀐다고 하지만,

OLPP를 주장하는 나로서는 조금은 다른 시각이다.

 

다른 사람과의 관계에서 바뀌는 내 포지션 이지만,

다른 사람을 바꾸려고 노력하면 바뀌긴 하는 것 같다.

 

사람 자체를 바꾸는 것이 아니라 만나는 사람을 바꾸는 것.

그것이 내가 나를 변화를 시키는 방법이다.

 

가족과 오랜 친구는 그대로 두고

내가 디지털 노마드를 하는데 필요한 사람

어울리고 싶은 사람

동경하는 사람

.

.

.

으로 바꾸려 한다. 어찌보면 바꾼다는 표현보다 쫓아간다는 표현이 맞겠다.

 

이제 충분히 내가 한 행동에 대해 사람들이 도와주는 것을 경험하고 여럿이 모인 힘으로 우리

사회가 변화는 것을 보았다. 이제 정말 일선에서 싸우는 사람을 열심히 응원하는 자리로 돌아가려고

한다. 그러나 언제나 부조리가 있을 때 다시 목소리를 낼 수 있도록 안테나는 세우고 있으려고 한다.

물론, 기술 외 폭넓게 볼 수는 없다. 볼라고 라는 앱에 의존하는 수 밖에는...

 

디시인사이드, 보배드림, 클리앙, 등... 볼라고 라는 앱에는 많은 커뮤니티가 있다.

그 중에 하나를 꼽으라면 클리앙을 선택하고 싶다. 클리앙 하나 보고. 뉴스 좀 찾아보는 정도로

정치/사회 분야 활동 범위는 좁히고 기술쪽만 넓히려고 한다.

 

그렇게 40~50까지 10년 보내보려고 한다. 40세가 되면 그대로 겠지만 50대가 된 나는 어떤 모습일까?

 

그 모습이 되었을 때 내 주변에는 어떤 사람이 있을까?

 

깊이 있는 공부를 통해 충은 완성할 자신이 있으나, 용서를 통해 최종적으로 인을 이룰 수 있을까?

 

고민이 많은 새벽이다.

 

도덕적으로 문제있는 바람둥이와

최종면접 가니 술처먹고 들어오는 재벌 2세가 먼저

추천한 서적.

 

싸이월드 말아먹어 페이스북 경영자를 추천사에 넣은 물타기를 보면서도 내심 비지니스 북스의 인맥이 참 대단하다는 생각.

 

그러나 삼성전자는 없는 것을 보니 그나마 우리나라에서 제일 많이 두들겨 맞으며 청렴한 조직으로 먼저 가는 회사는 삼성이라는 느낌.

 

비자반의 실오라기 같은 상처

 

 

 

페북에서는 다 지운 글이다.



폐업 전과로 지원 못 받는게 있네. 범죄만 전과가 남는게 아니었구나. ...법인 폐업도 아닌데ㅋ. 폐업자 (과세유형: 부가가치세 간이과세자, 폐업일자:2015-04-03) 입니다.




배달의 민족 5천만원이면 떡을 치겠구만, 경기 지역 화폐를 각 도시별로 쪼개놓고 잘되길 바라나? #이재명바보 카드 수수료만 낮추면 뭐해? 지역 화폐 카드만 되는 배달앱도 무료로 만드삼. 뭐 판교 이해 관계 엮인 이재명 도지사가 무슨 힘이 있겠냐만은.



http://www.fss.or.kr/fss/kr/acro/request/policy_info.jsp 금감원 Q/A 신청하기 누르면 페이지를 찾을 수 없다고 한다. #문재인바보 제발... 5G 광고해 주지 말고 국가 기반 IT 인프라나 제대로 정비를... 추신: 4G 나온지가 언젠데 가끔 끊긴다. 속도보다 대역폭!

이미지: 텍스트
좋아요


쿠팡을 이길 수 있는 건 물류센터가 있는 회사 밖에 없다. 삼성은 이미 쇼핑몰이 있으니 로지텍과 삼성폰을 끼고 국내 시장을 먹으면 된다. 웰스토리몰 오픈하고 SSG 와 함께 번들앱으로 넣어라. 11번가 지마켓 쿠팡은 SEAndroid로 막으면 된다. 불법아냐... 삼성 밖은 다들 그렇게 플레이 한다. #이재용바보 쇼핑앱을 먹으면 광고 시장도 같이 먹는다. 투입 비용 대비 10배 이상의 가치가 있다.



가장 친했던 동료 워즈니악을 이용하고 돈을 사기치고, 마음대로 직원을 해고했어도 스티브 잡스를 좋아하는 이유는 간단하다. 애플 기술력 없었다. 해커 데니스 리치와 리처드 스톨만이 만든 커널, GCC를 이용한 LLVM 을 써서 하다가 구글이 GO언어를 내니 SWIFT 만든다고 난리. 아직도 3D지원은 제대로 되지 않는다. 그러나 애플을 좋아하고 SWIFT를 할 수 밖에 없다. 글로벌하게 싸울 수 있는 삼성이 아니면 그냥 힘 있는 놈 밑에 들어가서 마련해 주신 작은 일을 할 수 밖에 없기 때문이다. 그래도 결과론은 정말 중요하다. 조나단 아이브나 워즈니악을 알아볼 눈이 있었기에 정말 세계적으로 대성할 수 있었던 스티브잡스. 상황적으로 애플을 좋아할 수 밖에 없고, 결과론적으로 잡스를 존경한다. 멀티터치는 애플이 아이폰 내기전 수년전에 훨씬 더 대단한 기술이었다. 그걸 조금 밖에 못 넣은 아이폰이 잡스의 PPT 능력과 백그라운드의 수많은 노예들로 잘 마무리 되어 성공할 수 있었다. 아마 이것도 오랜 시간이 지나면 원래 좋아했다고 미화되겠지.

사진 설명이 없습니다.



텀블벅 프로젝트 등록이 안된다고 한다. 현행법 운운하길래 법령을 물었더니 사과 메일이 왔다. 물론, 총리실과 일했던 증거를 보냈다. 그냥 좀 답답하다. 사람은 클래스가 있는 것을 정말 인정할 수 밖에 없네... 홀로서기 하기 싫어져서 그 동안 공개 안했단 돈 많은 ㅈㅣ인과 함께 그냥 찍어 누르기 하고 싶어졌다. 스타트업 깔 수 있었던 것도 소규모 투자자 집단 돈 다 합해도 그 분들 한텐 안되서 그랬는데. 그 지인들이 삼촌은 아니지만 친척 이야기 해 보면 외삼촌이 해운대 빌딩 몇 채 있어도 출가외인이라고 식당일 했던 엄마다. 알콜 중독으로 일을 계속 옮기시다보니 우연찮게 삼촌 빌딩에서 세 들어서 사는 사장 밑에서 일하게 되었다. 비밀로 몇 개월 일하는데 내가 늘 모시러 가고 그랬지. 그런데 엄마를 너무 하대하는거다. 식당에서 담배피는 애들한테 뭐라고 했다고 손님한테 뭐라고 했냐는 등 뭐 꼴에 어쩌구 저쩌구 ... 엄마의 알콜중독은 그렇게 오래갈 수 밖에 없었다. 나중에 엄마가 술먹고 그 사장한테 이 건물 우리 오빠꺼고 부산 로터리 클럽 대표격인 바른생활운동본부 회장을 오래도록 한 사실을 말했을 때 사장은 당장은 인정 안했지만 나중에 사과했다. 그런데 엄마는 더 괴로워했다. 본인이 늘 출가외인이라고 했던 사람이기 때문이다. 사람하나 잘못 선택해서 개고생길을 갔던 엄마를 보며 난 똑같이 행동하는 스타트업 쓰레기들이 지금 정부에 못 비비도록 하려고 하는 것. 사업하는 사촌형도 이 글 보고 있을텐데 엄마가 술로 우리 많이 괴롭혔지만 그래도 삼촌에게 피해 안가게 하려고 수십년간 폭행 당하고 다른 사람들에게 하대 당해도 조용히 살려고 노력했다는 것을 말하고 싶다. 각자 자리에서 최선을 다하는 우리 모두가 영웅이라 사람을 클라스로 나누고 싶지 않았던 건데... 학벌에 눌려살랴, 미국 유티콘에 눌러살랴, 최선을 다하지도 않았으면서 남들이 시키는 인생, 안되는 인생을 산 사람이 뭘 알리... 뭐 이런 것도 이제 잘 포장해서 찍어 눌러야 하나 그런 생각이다. 가족이 있어 어차피 늙으막에 복수하려고 하는데 그 때까지도 한킴은 살아있겠지? 죽으면 어쩔 수 없고. 지 꼴리는대로 해고는 살인이다. 한킴아. 미국물 처먹고 와서 사람 마음대로 내보내라는 개소리 하지 말길.


아무리 입력해도 안된다. 카카오뱅크나 토스는 잘 되는데다 사진 찍으면 그만인데... IT는 이재명 지사도 어쩔수 없다. 수천억이 들어간... 좋은 의도... 이래서 송파구 세모녀가 자살했었나보다. 작은 차이를 모르는 쓰레기 더미, #경기지역화폐

이미지: 텍스트



서울대 수의학과 교수랑 친했어야 아이가 안 죽도록 할 수 있구나... 빨간당 생각.

CLIEN.NET
옥시레킷벤키저(옥시)에서 가습기 살균제 흡입 독성 실험을 의뢰받아 수행한 조모 서울대 수의학과 교수(59)가 연구자료를 조작하고, 연구데이터를…



처음엔 실패할테지만 두 번째는 성공할 듯. 큰 커뮤니티에 근거가 올라오고 있다.

토스 dart 보다보니 토스대부 지분율 100% ... 인터넷 뒤져보니 자료가 있다(2년도 된 자료인데 이제 알았네. 햐... 그래도 말 안 나오는건 임직원들에게 스톡을 1000원에 계속 줬다. 아니 이게 가능한건가? 회사 투자 받는 단계가 있어서 주식을 1000원에 못줄텐데? 시장가나 액면가 중 높은 가격으로 주거나 주식 줄 때 양도세를 내야 하게 하는거 아닌가? #금감원바보

BLOG.NAVER.COM
토스어플은 대부업체- 과연 계속써도 될까요? 최근 토스 자동이체 어플을 사용하시는 분들 많죠? 저도 그 ...
댓글
댓글을 입력하세요...

  • 김구 10분 찾아도 이정도인데 주말에 공개된 자료로만 파 보고 문제 있으면 금융위나 금감원에 신고하고 아니면 칭찬해야 겠다. 금융을 바꾼 선두주자인줄로만 알고 있기에 확인해보고 여전히 괜찮으면 칭찬해야지.


는 의사와 창업해서 성공한 의사에 대한 사회적 명예를 어떻게 생각하는지를 통계청에 물어봤으면 한다고. 개인적인 생각은 아직 국민은 진료 의사를 더 존중한 것 같다고. 안철수와 토스 사장님을 예로 들며 똑똑한 의사분들이라고 유순하게 말했지만 사실, 국가에서 나서서 병원과 의사의 명예가 돈에 좌우되는 현실을 바꾸어 주었으면 하는 바램이었다. 돈을 벌면 명예를 찾는다는 말도 아직 30대 그룹에 속해있다는 베이스를 깔고 말해보았다. 그리고 다빈치와 IBM 왓슨에 대해서도 물었다. 다빈치는 수술 의사의 의료 기록을 자동화된 수술로 만들기 위해 데이터를 수집하고 있고, IBM은 구글의 알파고가 이세돌을 이겼을 때 자기네들은 이미 쇼는 딥블루의 체스 챔피언, 왓슨의 퀴즈 대회 우승으로 해서 의료 상용화에 힘썼다고 말하며(기업 관계자한테 들은 이야기라 혹시나 모르실까봐) 이에 대한 대책에 대해 물었다. 물론, 답변을 바라고 물은 것은 아니다. 마이크로소프트나 아마존이 아닌 국가가 많은 병원을 연계해서 국가 산업을 발전시켜줬으면 하는 바램의 우회 질문이었다. 그런데 답변은 내가 모르던 내용이 왔다. 왓슨은 내 생각만큼 뛰어나지 않아서 오히려 해당 팀을 축소하는 분위기라고 했다. 물론, 영상진료 부분은 뛰어나다고 했다. 내가 기업 관계자한테 들은 내용도 CT나 MRI 결과를 볼 때 의사의 진찰보다 정확해서 의사들이 많은 도움을 받는다는 것이었기에 충분히 신뢰가 가는 말이었다. 다빈치의 대항마의 경우 국가에서 이미 생각은 하고 있는 듯은 늬앙스였다. 이 모든 질문이 5분이었고 같이 가신 분이 시간을 말해주셨는데 20~30분 발언하신 분이 질문이 길다고 하셨다. 명확히 1번, 2번으로 나누어 말했고 관련해서 명확한 답변을 들은 나로서는 다들 중요한 문제에 몰입하셔서 시간이 어떻게 가는지도 모르고 이야기를 하셨구나라는 인상이었다. 아이가 아플 때 도움 받은게 많아 한창 유명 가수 죽음으로 시끄러울 때 병원에 대해 좋은 포스팅을 하고 좋은 반응을 얻었었는데, 사실 반응보다는 의사 자체는 존경 받아 마땅하다. 수많은 진료 의사들이 만들어 놓은 명예의 반석위에서 사업하는 똑똑한 사람을 어떻게 막으리요. 그렇게 페라리 타고 마천루에 살며 또 미디어를 통해 행복한 하루하루를 방송하면 정말 돈 때문이 아니라 사람을 위해 진료를 해왔던 수많은 의사들의 마음은 잊혀져 버릴 것은 아닌지 많이 걱정되는 시간이었다. 물론, 잊혀지지 않겠지만 우리 아이들이 잘못 배우지나 않을런지 걱정되는 하루였다.


'{BE} JAVA 21 corretto' 카테고리의 다른 글

콘솔이지만 예뻐.  (0) 2019.03.18
다들 똑같은 생각 - 잡플래닛 소개  (0) 2019.03.14
카카오 바이크 후기  (0) 2019.03.14
광고에 대처하는 자세  (0) 2019.03.13
소율이 - 비즈 공예 작품 소개  (0) 2019.03.09

- NSAttributedString.Key.underlineStyle : []] 

+ NSAttributedString.Key.underlineStyle : 0]

 

로 해결.

 

아래는 로그

 

"[tendency period tab is clicked.]"

"Period bar has been refreshed"

🍭pwd_getStatePeriod()

TendencyPeriodBar refresh()

jhPanel draw()

drawPanel()

ctime in jhType3graphPanel<T> =  Optional(2019-04-08 01:25:44 +0000)

jhPanel draw()

drawPanel()

ctime in jhType2graphPanel<T> =  Optional(2019-04-08 01:25:44 +0000)

jhPanel draw()

drawPanel()

ctime in jhType4graphPanel<T> =  Optional(2019-04-08 01:25:44 +0000)

2019-04-08 10:25:44.930816+0900 Bridge2[21969:1272559] -[Swift.__EmptyArrayStorage intValue]: unrecognized selector sent to instance 0x1c1cab360

2019-04-08 10:25:44.932463+0900 Bridge2[21969:1272559] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Swift.__EmptyArrayStorage intValue]: unrecognized selector sent to instance 0x1c1cab360'

*** First throw call stack:

(0x18817c518 0x1873579f8 0x188099278 0x188181d60 0x1881839fc 0x1927d600c 0x192763b6c 0x1b4aee160 0x1b4aeca5c 0x102b315a8 0x102b316b8 0x1b4b7b4e4 0x18c609d94 0x18c4ee974 0x18c6108a0 0x18c609658 0x18c572160 0x18c5a0108 0x1b46ed710 0x1b47d61f4 0x1b47cf11c 0x18810e2bc 0x18810e23c 0x18810db24 0x188108a60 0x188108354 0x18a30879c 0x1b46f3b68 0x102bc69b4 0x187bce8e0)

libc++abi.dylib: terminating with uncaught exception of type NSException

 

 

 

'진행 프로젝트 > [진행] My tools.' 카테고리의 다른 글

두 번째 글  (0) 2021.01.24
네 번 째 정의구현. 시초는 바로 이 글  (0) 2021.01.24
:-1: Segmentation fault: 11  (0) 2019.04.03
딥러닝 환경 구축 중  (0) 2019.02.07
StackView bug  (0) 2019.02.06

카테고리를 정리 하였다.

글을 새로 쓰기도 하지만 예전 블로그에서 글을 옮기는 과정에서 많은 카테고리가 생겨났다. 너무도 많은 카테고리가 생겨서 블로그 항해 일지 아래로 모두 넣었다. 이제 서칭 유입이 더 많기 때문에 유입된 유저가 해당 글의 카테고리를 클릭하면, 유사 글을 보기는 쉬우므로 복잡한 카테고리를 하위로 옮기면서 정리하였다. 이에, 카테고리로 복잡했던 메뉴바가 깔끔해졌다. 퇴사하고 사업을 시작하기에 이제 많은 것을 정리해야 할 것 같아서 블로그도 정리를 한다. 물론, 삭제는 아니고 오히려 정리를 더 많이 하게될 수도 있을 것 같다.

 

퇴사. 처음할 때도 사실 마음적으로는 힘들진 않았는데 삼성전자에서는 면담을 너무 많이 해야 해서 힘들었다. 물론, 7년차로 고생하고 이제 막 피어나기 시작할 때라 다들 말렸었지. 그 뒤로는 퇴사한다고 붙잡는 경우는 한군데 밖에 없었다. 퇴사에는 한 가지로 설명하기 힘든 복잡함이 있다. 언젠가 풀어서 설명할 날이 오리라 생각한다.

 

다들 잘되면 좋겠다.

Command CompileSwift failed with a nonzero exit code


업그레이드 한 것이 실수 였다.




Segmentation fault: 1 1

Command CompileSwift failed with a nonzero exit code



 1. pod deintegrated 설치 실행 이후 pod 다시 설치 -> 안됨

  1. ulimit -u 수정이 안되는 확인, /etc/security/limits.conf 수정


* soft nofile 65535

* hard nofile 65535


sudo launchctl limit maxfiles 1024 1024


개뿔 reboot 해야 한다.


https://docs.riak.com/riak/kv/2.2.3/using/performance/open-files-limit/


https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c



안된다.


https://bugs.swift.org/browse/SR-10182 를 보니 아이폰과 엑스코드를 업그레이드 한 것이 재앙이었다.


뜨아아아아

'진행 프로젝트 > [진행] My tools.' 카테고리의 다른 글

네 번 째 정의구현. 시초는 바로 이 글  (0) 2021.01.24
swift 4.0 -> 4.2 가며 만난 에러님.  (0) 2019.04.08
딥러닝 환경 구축 중  (0) 2019.02.07
StackView bug  (0) 2019.02.06
gitlab clone error  (0) 2019.02.05



13인치 프로랑 하판 에어류 각 빼곤 완전 똑같다.

헐... 물론, 조금 더 가볍긴 하지만 에어 사실 분은

그냥 프로13인치 사시길...



헐 정품은 두꺼운 맛이었는데


구려졌엉!

'{BE} Python 3.1x' 카테고리의 다른 글

python 자연어 처리  (0) 2020.04.08
신형 맥북 에어 맥북 프로  (0) 2019.04.02
core graphics는 snapkit이 먹지 않는다.  (0) 2019.03.20
계산 잘 못하는 애플 코리아  (0) 2019.03.18
스냅킷 & 배열  (0) 2019.03.18

그 동안 링크를 따라가보면 아셨겠지만, 


https://www.iosnoops.com/iphone-ipad-apps-gone-free/


가 원본 출처입니다.


우리나라 사람이 위의 출처에서 자신이 만든 것처럼 하여 올리는 것을 계속 보고 있다가


귀찮은지 특정앱을 빼버리는 행태를 보고 해당 카테고리의 글을 쓰기 시작했고,


이제 어느 정도 검색이 활성화 될 것이기에 더 이상 쓰지 않아도 될 것 같습니다.


위의 사이트에서 받으시기 바랍니다.


^^v

'Swift & Python 실무' 카테고리의 다른 글

iOS 13 버전 대응 Push 라이브러리 패치 내용  (5) 2020.08.24
Floating Menu  (0) 2020.06.22
앱스토어 무료 앱 31일  (0) 2019.03.31
앱스토어 무료 앱 30일  (0) 2019.03.31
오늘만 무료 앱 3월 29일  (0) 2019.03.29

설명이 부족한 공식 문서 때문에 실무 개발자가 궁금해할. 내가 궁금하니 

내용 중 하나.

https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_value-binding-pattern

공식문서의 내용에서 쓰는 let point는 튜블 패턴이다.


그런데 튜플은 튜플대로 사용하면 되는데 굳이 switch 문에 다시 바인딩을 시키는 것이 의아하다. 왜냐면 switch 문은 다양한 case에 따라 if 문의 개수를 줄이는데 유용하고 C언어에서 어셈블리로 변화했을 때 switch case문이 다중 if문에 비해 속도가 빠르듯이 더 나은 성능을 위해 switch를 쓰는데 하나의 case문이라면 의미가 없기 때문이다.


인자 개수에 따라 처리가 가능하다면 유용할 텐데 그러지 않다. switch 문의 인자 개수는 동일해야 한다. 만약,


let point = (3, 2, 4)


switch point {

// Bind x and y to the elements of point.

case let (x, y):

    print("The point is at (\(x), \(y)).")

case let (x, y, z):

    print("The point is at (\(x), \(y), \(z)).")

}


이런 예제라면 에러 난다. 그러면 상수값과 섞어 쓸 때 의미가 있게 된다.


        let point = (3, 2)


        switch point {

        // Bind x and y to the elements of point.

        case (3, let y):

            print("The point is at  \(y).")

        case (let x, 2):

            print("The point is at \(x).")

        default:

            print("default")

        }


혹은, 

        let point = (3, 2)

        let point 2 = (3, 8)

        let points = (point, point 2)


        switch points {

        // Bind x and y to the elements of point.

        case ((3, 2), let y):

            print("The point is at  \(y).")

        case (let x, (0, 0)):

            print("The point is at \(x).")

        default:

            print("default")

        }

이런 식이다.  swift는 break문이 필요하지 않아 상위 case에서 참이 되어 버리면 하위 case는 쓸모가 없게 되긴 하지만 튜플 패턴에서 일정 값만 거르고 해당 값을 binding 해서 쓸 때는(굳이 binding 안 하고 써도 되겠지만) 써도 된다는 뜻.


여기서 let을 var로 바꾸었을 때 바딩 된 값이 ref 값인지 copied 값인지 궁금해진다. 


        let point = (3, 2)

        var point 2 = (3, 8)

        let points = (point, point 2)


        switch points {

        // Bind x and y to the elements of point.

        case ((3, 2), var y):

            print("The point is at  \(y).")

            y = (4, 4)

            print("The point is at  \(y).")

        case (let x, (0, 0)):

            print("The point is at \(x).")

        default:

            print("default")

        }


        print("point 2 = ", point 2)


The point is at  (3, 8).

The point is at  (4, 4).

point 2 =  (3, 8)


복사본이 전달된다. call by reference로 볼 수 있는데 call by assignment 방식 때문에 객체의 경우도 따로 조사를 해봐야 한다. swift에서 class init 후 전달되는 모든 값은 참조형으로 작동하기 때문에라도 한번 더 봐야 한다. 이 말은 3년간 Objective-C 할 때는 함수 포인터보다는 NSNotificationCenter를 통하여 각기 다른 객체(여기서는 파일이라고 생각하면 되겠다)에 메시지를 전달하여 해당 함수를 동작시켰다. 파라미터 전달 방식은 프로그램이 커지고 빌더 패턴이 하나라도 끼인 상태라면 전달이 상당히 복잡해져서 요구사항이 바뀐 경우 그냥 노티피케이션센터에 메시지 하나 더 정의해서 전달했다는 뜻이다. 물론, 안드로이드로 치면 해당 액티비티가 가진 멤버 자료들이 resume 되는 시점에 제대로 복구되는지 상관 않고 기능 구현만 했다는 뜻이다. 대부분 블랙박스 검증이니까 얼추 잘되면 그냥 오케이다. 그러나 의료 앱을 만드는 지금은 웬만한 자료는 가지고 있지 않는다. 함수형 프로그램의 철학대로 데이터의 흐름에만 집중을 한다. 가끔 저렇게 요구사항은 바뀌고 급하게 검증을 돌려야 하는 상황이면, Call by Reference를 십 분 활용하여


var pDashboard : DashboardScrollView? = nil


이렇게 꼭 필요한 자료가 있는 싱글톤에 정의하고, 


GS.s.pDashboard = self


만든 객체를 넣고


GS.s.pDashboard?. topScroll()


어디서든 호출할 수 있게 한다. 참고로  swift에서 싱글톤은

private init()

static let s

으로 만든다. 사실, 나의 실무 프로그래밍 책에 쓴 것럼 동시성을 체크해야 하지만 네트워크 상황에서도 DispatchQueue 를 전혀 쓰지 않고 있기 때문에 문제는 없어 보인다. closure를 이용하면 된다. (더블클로저를 이용한 프로그래스바 참조) 물론, 운영체제 혹은 프로세서의 멀티 프로세싱에서 앱이 따로 thread를 만들지 않으면 앱 실행 순서는 리니어 하다는 것을 가정해야 하는 위험이 있긴 하지만 다른 안정 장치로 의료용 앱을 보호해야 한다.


자 다시, call by assignment 로 돌아가자. 튜플은 값을 주고, 튜플도 객체니 그냥 call by reference로 믿어도 되겠지만 결국 책임은 실무 프로그래머에게 있으니 의심해 볼 수 밖에 없다.


class dummy {

    var A : Int = 3

}


더미 class를 만들자.


        var a = dummy()


        switch a {

        case var b :

            print("a.A = \(a.A)")

            print("b.A = \(b.A)")

            b.A = 2

            print("a.A = \(a.A)")

            print("b.A = \(b.A)")

        default:

            print("defult")

        }


        print("a.A = \(a.A)")


a.A = 3

b.A = 3

a.A = 2

b.A = 2

a.A = 2


바뀐다. 그럼 이 경우는?


        var a = dummy()


        switch a.A {

        case var b :

            print("a.A = \(a.A)")

            print("b = \(b)")

            b = 2

            print("a.A = \(a.A)")

            print("b = \(b)")

        default:

            print("defult")

        }


        print("a.A = \(a.A)")


a.A = 3

b = 3

a.A = 3

b = 2

a.A = 3


안바뀐다.


결국, 파이썬처럼 call-by-assignment 로 동작하는 것을 볼 수 있다.


이제 switch 바인딩의 의미가 값 결정에 있지 않고 단순 커넥션이며, 객체에 따라 다르게 assignment로 동작한다는 것을 알 수 있다. swift는 직관적 리딩을 위해 파라미터 까지도 생략하려면 _(under score)를 써야 하게 해놨는데 복잡하게 프로그래밍 하는 것보다는 직관적으로 알 수 있게 하는게 나을 것이다.


그러나, 난 어렵게 프로그래밍 하는 것을 추천한다. 거대한 switch 문을 만들길 바란다. 대한민국은 프로그래머보다 경영자가 우대받는 사회니까. 우리팀이 이기길 바라는 것은 팀원으로 당연한거니까.


띄워쓰기가 맘에 안들수도 있겠다. 귀차니즘에 의해 Xcode의 ^I 정렬 방식을 따르고 브런치의 맞춤법 검사를 필터링 없이 돌린다.(소스에도 걸리는 것을 보니 ...)


혹 구독자를 위해 요약하면,


Swift의 value-binding pattern은 call by assignment 로 동작한다는 것. 물론, siwft 4.2 기준이며 5가 되었을 때도 공식문서에 별다른 말이 없으면 다시 확인해야 한다. product랑 가까운 개발자 일수록 이런 말 못할 고민은 늘어간다. 비트 하나 차이로 사람이 죽을수도 있으니... 늘 낮은 자세로 탐구하고 고민하고 책임져야 한다. ㅠㅠ

막 쓰지만... 누군가에겐 도움이 되겠지 하고 또 일정 기간 동안 올려본다.(구독자들은 알겠지만 그냥 지울 때도 있고 블로그로 올릴 때도 있다. 순수하게 떠들고 싶은 마음으로 쓰는 경우라...)


리액티브, Redux, 패턴 이야기를 해 볼까 한다. 내용은 구리다. 나는 바쁘니까.

그래도 정말 삽질하지 말라고 하고 싶다. 이미 제품을 만든 다른 사람이 이야기를 좀 해줬으면 좋겠다. 네가 한 말이 틀렸다고. 너무 제품에만 집중해서 시간을 보내다 보니(정치/사회도 관심이 많아서) 정말 맥북 모니터만 뚫어져라 보는 것 같다. 최근 하이와 여행 때도 밤에는 늘 노트북만 쳐다보고, 행사 있을 때마다 맥북을 들고 다녔다. ㅠ 너무 바쁘면 시야가 좁아진다. 그래서 누가 틀렸다고 이야기해줬으면 좋겠다는 말이다. 브런치의 자동 수정 기능을 믿고 그냥 클릭만 할 거기에 이상한 게 있어도 지적 바란다.


프로젝트를 3개 진행 중이다. 모두 돈을 받는 일이다.


1. 우선, react 하지 마라. 망한다. 간단한 앱 만드는 것은 괜찮은데 IoT 들어가거나 코어 그래픽 들어가면 쓰지 마라. 왠지 설계자가 개발자 출신이 아니라면 그냥 처음부터 쓰지 마라.


2. 리액티브 처음에는 괜찮은데 프로젝트 커지면 오히려 디버깅이 안된다. 적당한 프로젝트에 쓰길 바란다.


3. Reswift는 좋다. 마음껏 써라. 프로젝트 하나는 그걸 쓴다. 그런데 패턴으로도 구현 가능하다. 내가 썼던 글...(더블 클로저)로 구현해도 되는데 프로젝트 커지면 가독성 떨어지는 게 사실이다. 그럴 때 GS.swift, BR.swift를 만든다. 


브로드 캐스트를 담당하는 BR.swift 는 이런 형태다. 뭐, 이미 다 말했지만... 정말 개발 해보니 이거면 되서 ... 다시 쓴다.


import UIKit


//MARK: protocols titled by weird name to find related modules easily. -hjh-

protocol gamcho {

    func updateText()

}


protocol trendpopup {

    func updateText()

}


protocol snowboard {

    func updateGraph()

}


class BR {


    static let s = BR()


    var BRtendency3 dots = [gamcho]()

    var BRtrendpopup = [trendpopup]()

    var BRsnowBoard = [snowboard]()


    private init() {

    }


    func attachBRtendency3 dots(observer : gamcho) {

        BRtendency3 dots.append(observer)

    }


    func attachBRtrendpopup(observer : trendpopup) {

        BRtrendpopup.append(observer)

    }


    func attachBRdashboard(observer : snowboard)  {

        BRsnowBoard.append(observer)

    }




    //MARK: notify to update    BR_ prefix

    func BR_snowBoard(andThis : ()->()) {

        if(GS.s.bSemaphore) {

            GS.s.bSemaphore = false

            for woman in self.BRsnowBoard {

                woman.updateGraph()

            }

            GS.s.bSemaphore = true

        } else {

            print("Busy")

        }

        andThis()

    }


    func BR_tendency3 dots() {

        for homme in self.BRtendency3 dots {

            homme.updateText()

        }

    }


    func BR_trendpopup() {

        for woman in self.BRtrendpopup {

            woman.updateText()

        }

    }

}


글로벌 세팅인 GS.swift는 이런 형태

class GS {


    static let s = GS()


    var bSemaphore : Bool = true

    let queue = DispatchQueue(label: 


.

.

  var lp1 : InsidePanel? = nil

    var rp1 : InsidePanel? = nil

    var lp2 : InsidePanel? = nil

    var rp2 : InsidePanel? = nil

.

.

    func elapsedTime() -> TimeInterval {

        return abs(self.startTime.timeIntervalSinceNow)

    }

.

.

   private init() {

                logLevel =. all


.

.

.


특이한 것은 내가 안드로이드 할 때도 항상 싱글톤은 하나 놔두고 status를 저장하고 썼었다. 삼성에서 안드로이드 프레임웍 만들 때 큐와 BR 구조를 짜다 보니 객체를 등록하고 for 문을 돌면서 메시지를 보내는 BR 구조(옵서버 패턴+ for 문)에 대해 알게 되고 그 이후로는 무조건 썼는데. 나중에 리액티브라는 것을 접하니 큐와 구독(옵저BR구조)에 스케쥴러까지 결합한 형태라는 것을 알게 되었다. 이게 본인이 직접 안 짜고 라이브러리의 힘을 빌면 다양한 디바이스와 커뮤니케이션에서 디버깅이 제대로 될까 했는데... 아니나 다를까 개고생을 해야 했다. 라이브러리는 정말 기본적으로 도와주는 것만 써야 한다고 생각했다. 깃 헙을 보면 reacrokit 보다 snapkit에 star에 10배가 많은 것도 그 이유겠다. 물론, 만든 분을 좋아하긴 하지만... 오래도록 RTOS 프로젝트와 커널을 했던 나로서는 앱 단에서 구현된 스케쥴러가 그리 반갑지는 않다. 프로세스 자체도 운영체제 때문에 오차가 생기는데 그 위에 도는 스레드는 또 어떻고 그 스레드 위에서 도는 앱이 구현하는 스케쥴러도 어쩌리... 펌웨어 하다 보면 라즈베리 파이임에도 불구하고  POSIX 타임 틱도 구려서 커널 time 함수도 그때그때 다시 만드는 상황에... 말이다.(저번 에트리 강의 때 시그널 제작했었는데 time 함수 다시 짰다 [내가 강사임...])


믓튼, iOS 기준으로 일전에는 노티피게이션센터를 썼는데 클러저 덕분에 REST API 동기화는 쉬웠고, 프로그램 전역에는 BR.swift 하나면 충분했다. MVP, MVVM, MVC에 싱글톤과 BR 가능한 옵서버 패턴을 붙이면 두려울 게 없었다. 다만... ReSwift의 경우 데이터 흐름을 고려했다는 점에서 새롭게 도입해서 프로젝트를 잘 마무리하게 되었다.


BadgeSwift, SnapKit, JTAppleCalendar, SwiftNotification, SwiftMessages, lottie-ios  등 UI 라이브러리를 마음대로 써도 된다. View에만 영향을 미치니까. REST는 Alamofire 가 최고다. Pitaya 쓰면 분산되는데 알라모퐈여 쓰면 클해스 하나에 REST를 몰아넣을 수 있다. 막일 방지해주는 SwiftDate, FileKit, SQLiteSwift3, SwiftKeychainWrapper, SwiftyJSON 등 좋다. Firebase 같이 무조건 쓸 수밖에 없는 라이브러리를 제외하고는 SwiftLint, ReSwift 추천한다. 그래프 라이브러리 성능 보니 믿음이 안 가서(프로젝트에서 원하는 성능으로 커스터마이징 하려고) 만들었더니 프로젝트의 1/4을 차지한다. 거대해졌지만 이렇게 커도 GS, BR로 충분하다. 물론, 하나에 다 때려 넣으면 너무 커져서 GV(Global Variable), VD(Volatile Datas) 등으로 이원화해서 쓰기도 했다. 

 하드웨어 제어하는 IoT 기능(BLE, WiFi, socket.io) 코어 그래픽 라이브러리와 위에 언급한 라이브러리 등을 다 넣어도 데이터 꼬임 없는 산출물이 나왔다.


그냥... 카톡만큼 크진 않지만  3개 돈 받는 거 말고 전자 지갑도 만들어 보고(블로그에도 올림) 텔레그램도 하고 있으니 카톡만큼 키우는 게 어렵진 않을 것 같다.


따로 하는 게임이 잘돼서 빠른 시일 내에 법인이 만들어지면 좋겠다.



추가... 내가 쓰는 옵셔널 코드조각



self.vDashboard?.center = tempt

---

static func worldLine(context : CGContext?, _ x1 : CGFloat, 


---

class jhGraphBuilder<T> {

    private var superScene : T?


---

print("ctime in jhType22graphPanel<T> = ", (self.superScene as? jhSceneTimeLine)?.currentTime)


---

class jhPanel<T> : jhDraw, observer_p {

    

    internal var superScene: T?


---

    internal var mAllofCountOfDatas : Int {

        get {

            return eoDataCenter.eoDatasDashboard[jhPanelID]?.d.count ?? 0

        }

    }



---

class jhGuideLine : CALayer {

    

    var layer_size : CGSize = CGSize.init(width: 0, height: 0)

    var lineX : CGFloat

    var lineY : CGFloat

    var lineWidth : CGFloat

    

    init?(x: CGFloat, y: CGFloat, lineWidth: CGFloat, layer:Any) {

        if GS.s.logLevel.contains(.graph2) { print("jhGuideLine_init") }



---

        for woman in 0..<4 {

            for man in 0..<(jhDatas[woman]?.d.count ?? 0) {


---

            ctime = (self.superScene as? jhSceneTimeLine)?.currentTime ?? Date()

            etime = (self.superScene as? jhSceneTimeLine)?.endTime ?? Date()


---

        guard var jhDatas : [Int : hjh] = eoDataCenter.eoDatasDashboard else {

            print("currentPoint.x", currentPoint.x)

            fatalError("guard var jhDatas : hjh = eoDataCenter.mDatas[0] else {")

        }


---

        scene!.createPanels(s: scene!, withHeightRatios: ratioNtype(ratio: 5.10, type: graphType.TYPE1), ratioNtype(ratio: 2.93, type: graphType.TYPE2), ratioNtype(ratio: 1.96, type: graphType.TYPE3))



---


    override func createPanels(s : jhScene, withHeightRatios: ratioNtype...) {

        

        var panel : jhPanel<jhSceneTimeLine>? = nil



---

   panel = jhGraphBuilder<jhSceneTimeLine>()

                .type(rnt.type)

                .frame(0, GS.s.jhSceneHeight!, jhSceneFrameWidth*4, vHeight)

                .scene(self)

                .build()



보너스 삼항연산자


            let xOffset = contentSize.width < bounds.width ? 0 : (contentSize.width - bounds.width)/2


+ Recent posts