서툰 예술 감상기

이루마


모르시는 분들을 위해.

byHAJUNHODec 18. 2015



우선





http://yurajun.tistory.com/988

이루마 아내(부인)손혜임 이중국적자의 올바른 선택

직업이 피아니스트 겸 작곡가인 이루마는 이중 국적자입니다. (우리 나라와 영국의 국적을 동시에 갖고 있죠. 따라서 국적을 포기하면 병역의 의무를 이행하지 않아도 됩니다. 하지만 그

yurajun.tistory.com





이 글을 읽어 보셨으면 합니다.





그리고





http://www.yes24.com/24/goods/5962744?scode=032&OzSrank=1

이루마 - 더 베스트 : 10년의 회상

이루마의 10주년을 돌아보며, 직접고른 베스트 작품과 신곡을 새롭게 녹음하여 수록!!직접 써 내려간 글, 그림 그리고 사진으로 구성된 소장가치 높은 귀한 선물!'Reminiscen

www.yes24.com





음반을 들으셨으면 합니다. 이루마 씨 곡은 유투브나 인터넷에서 쉽게 구할 수 있습니다. 일부러 법적 대응을 안하는 것 같아요. 많이 들으시라고. 그러나 이 음반은 이루마씨의 손편지가 있습니다. 한장 한장 의미가 있지요.








최근 선물용으로 샀는데 아직 한정판이 있어요.








애기 재울 때 항상 들려주는 음악이라 그런지 아기가 차에서 틀면 잠와요 합니다. 애기 있으신 분들은 차량 이동 시애기 재우고 싶으실 때 많으시죠?





^^v





제 favorites 는





Love me, River flows in you, Maybe 입니다.





여러분은 어떤 곡이 좋으신가요?





이상 이루마를 모르시는 분을 위해 적었습니다.





주변에 프로그래머가 많아서 그런지 모르는 분이 정말 있어서요. 컬쳐 쇼크...

'Objective-C, SQLite3' 카테고리의 다른 글

브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10
브런치 이전  (0) 2019.02.10
[이전] 브런치 이전  (0) 2019.02.10









매를 들어야 할 때







그때가 온다







byHAJUNHOJan 09. 2016




아래로




♪ 아이는 역시 사람이다. 사색도 하는.





















♪ 하는 행동들이 모두 귀엽지만, 너무 왈가닥인 아이도 있다. 우리 애가 그랬다.





















♪ 애기들은 다친다.

































♪ 다쳐도 잘 모른다.

































♪ 뛰어다니다가 아랫입술이 앞뒤로 다 찢어져서 아예 갈라졌다. 그 작은 입술에 8 바늘 꿰맸다. 평소 때는 밝다가도 밥 먹을 때마다 아파서 울었다. 피 철철 흘리던 응급실 상황은 굳이 말하고 싶지 않다.













♪ 내 주변의 모든 아빠들이 말한다. 애기 때릴 때는 가슴이 찢어진다고. 때리는 게 습관이 되어버린 사람을 제외하고 제정신으로 애기 때리는 아빠는 아마 아무도 없을 것이다. 나 역시 아이를 때리는 것을 경멸했었다.













♪ 그러던 내가 매를 들게 되었다.

































♪ 와이프도 이해했다. 발바닥 때리는 것이 혈액 순환에 좋다고 하는 근거 없는 낭설을 믿어서 난 무조건 발바닥을 때린다. 발바닥 때리고 나면 아이는 한동안 나한테 오지도 않고, 마음은 두고두고 정말 아주 많이 아프다.













♪ 와이프에게 화도 내 보았다. 항상 같이 있는 사람이 매를 들어야 나중에 아이랑 풀지, 난 자주 보지도 못하는데 매를 들면 아이가 나 싫어할 거 아니냐고. 개발실 다닐 때는 애기 얼굴을 잘 못 봐서 아이가 날 정말 서먹하게 대했었다. 운영팀으로 가서 칼퇴할 때는 아이가 너무도 반겨하고 갈 때는 아쉬운 표정으로 마중 나왔었다. 내 인생에 가장 행복한 순간이었지만, 너무도 짧은 시간이었다. 

































♪ 맞고 나서도 금세 해맑아지는 아이를 보며 항상 내가 왜 때렸나 싶다. 그러나 말을 모를 때는 단어의 뜻 자체를 모르기 때문에 가르치기가 너무 힘들다. 말을 알게 되면 안 때리게 되는데 그 전에 너무 뛰어다녀서 할 수 없이 매를 들게 되었다.













♪ 와이프 보육교사 자격증 있다. 처제는 학원을 운영하는데 내가 발바닥 때리는 걸 보고 인지 능력도 없는 애를 때린다고 뭐라고 하더라. 매를 들 때 나름대로의 원칙이 있다.













♪ 아버지들은 마음이 아프다. 누가 몰라서 그럴까... 일 때문에 바빠서 아이 얼굴도 잘 못 보는데, 볼 때마다 얼마나 좋은데. 세상에서 가장 귀여울 3~5살 때 때리고 싶은 아버지가 누가 있을까? 

































♪ 너무 사랑스럽지만 너무 왈가닥이라 항상 다치는 우리 아이.













♪ 매를 든 아빠를 나중에 기억할지도 모르지만. 비겁한 변명일지도 모르지만.













너무 사랑해서 그랬단다. 그리고 아빠도 마음이 많이 아프단다.



















뛰어노는 것도 좋지만 가끔 다치는 것도 좋지만,



















엄마, 아빠 말 잘 들어서 많이 다치진 않도록 하자.













사랑한다.











































제갈 냥이Jan 09. 2016


때리지 않고도 다독 일 수 있어여..ㅜㅜ 체벌은 좀더 큰다음해도 되죠 





HAJUNHOJan 09. 2016


@제갈 냥이 아... 그럴 수만 있다면 얼마나 좋을까요 ㅠㅠ. 제 생각은 아이마다 다른 것 같아요. 무조건 적으로 때리는 것은 아니고 계속해서 여러번 말합니다. 아무리 말해도 안 듣고, 엄마 말도 안 듣고 계속해서 고집을 피울 때가 있어요. 오래전 보았던 '위기탈출 넘버원'에서는 아이가 너무 울어서 죽는 경우도 있다고 합니다. 우리 아기는 한번 울면 아무리 달래도 울음을 안 그칠 때도 있어요. 이젠 말귀를 알아 들어서 발바닥 때린다고 하면 말을 잘 들어요. 물론, 약빨이 그리 오래 가지는 못합니다. 집에서는 아무리 소란 피우고 다쳐도 아이니까 라며 넘어가는데요. 아래층에 와인도 가져다 드리고... 같이 아이 키우는 집이라 수년간 이해해 주시는데요. 밖에 나가서도 그럴 때가 있습니다. 음식점을 종횡무진으로 뛰어나니는 경우도 있구요. 놀고 싶고, 호기심 많고 해서 조용히 계속해서 데려와도 ... 말 안 듣기에 결국 언성이 높아집니다. 계속되는 소리지름보다는 단기간의 발바닥 회초리가 효율적이라 그리하고 있는데요. 일전에 TV 보니 말 안 듣는 아이는 힘으로 제압해서 잡고 있더라구요. 그 방법도 여러번 써 봤는데 애가 별나서... 초기에 애지중지 키운 외동딸이라 문제가 된 것도 같아요. 클레식 태교에 수년간 클레식만 틀고, 차량 이동중에도 클레식만 틀어도 별 소용 없더라구요. 타고난 천성인지 갑갑한 인큐베이터에 오래 있어서 그런 건지는 저도 잘 모르지만. 딸의 바람과 저 사이 조화를 잘 이루고자 하는데, 발바닥 회초리 만한게 없더라구요. ㅠㅠ 





제갈 냥이Jan 10. 2016


정말 힘든 상황이군요. 제가 일반적인 견해의 말을 하면 안되겠네요.

그래도 전 다시 아이들 어릴때로 다시 돌아간다면 다시 더 좋은 엄마가 되고 아이들의 좋은 친구가 될 꺼예요.




아이의 눈 높이 ^ . ~

그리구 걱정하지 말아요. 점차 나아 질꺼예요. 





HAJUNHOJan 11. 2016


@제갈 냥이 댓글을 보고 주말 내내 생각할 수 있던 시간이었습니다. 우선 감사드립니다. 육아 선배님이시니 분명 저도 나중에 후회할 수도 있다는 생각이 듭니다. 작은 약속으로 1월 한달간은 어떤 경우에도 매를 안 들어볼 생각입니다. 





제갈 냥이Jan 11. 2016


~~^ . ~ 저도 고마워요. 매를 들어야 겠다고 생각 할때마다 안아주기 해요. 





HAJUNHOJan 11. 2016


@제갈 냥이 좋은 방법 입니다!



    'Objective-C, SQLite3' 카테고리의 다른 글

    브런치 이전  (0) 2019.02.10
    브런치 이전  (0) 2019.02.10
    브런치 이전  (0) 2019.02.10
    [이전] 브런치 이전  (0) 2019.02.10
    [이전] 브런치 정리  (0) 2019.02.10



    일단 표지는 구글에서 19금 인증 없이 찾을 수 있는 사진이다. 이미지 검색 '위안부' 치면 나온다. 정부가 어떤 행보를 보일지 모르나 일본 시키는 대로 다 한다면 위안부 사진을 바꿔야 하는데. 차라리 다 인정하고 사죄의 길을 가고 있는 독일 사진을 걸어 두는 게 나중에 사진 교체 때문에 고민해야 하는 불필요한 시간을 없앨 방법이다.






    그리고 관련해서 지인과 이야기를 하다가 떼돈 버는 방법이 나왔다. youtube에 일본이 인정 안하다가 인정한 것을 다큐로 만들어 놓는 것이다. 아마 두고두고 볼 것이다. 그리고 인정 안하다 인정했으니, 우리도 역사에서 지운다고 해놓고 남겨두는 걸로. 소녀상 치워야 하니 소녀상 위에 눈 치우는 걸로. 소녀상 옮기라고 하면 1Cm 전치 배치하는 것으로. 그동안 당당했던 우리 민족 얼에는 위배되지만 일본에서 배울 건 배워야 한다. 말바꾸기


    그 외 좋은 문화는 일본 여행기를 참조해 주세요~






    정치 문제를 다루는 첫 번째 글이다. 이미 다른 매거진의 글에서 밝혔지만 난 박근혜를 싫어하지 않는다. 그 이유부터 적어야 할 것 같다. 내 어머니는 너무도 가부장적인 가정에서 계셨다. 옛날 분들만 이해하는 사실이 있는데 남편한테 맞아도 다음날 북엇국을 대령해야 하는 게 일반적인 통념이었고 나는 그 시대를 살고 있지 않지만 30 후반이 되는 지금 그런 분이 내 어머니셨다. 물론, 유신시절 우리 가족에게 피해를 입혔었다면 아마 박씨 가문 자체가 철천지 원수였겠다. 아마 우리 군인의 총칼아래 죽었던 분이 가족인 집안이 많을텐데 그래서 우리 사회는 복잡할 수 밖에 없다. 박근혜(유명인이라 존칭 생략)가 대통령이 안 되었으면 우리나라에 향 후 우리나라 여자 대통령은 계속 없다는 느낌이 들었다. 인생의 반은 살았는데(가수 김광석보다도 나이가 많으니) 그 느낌이 틀렸을 거라 생각지 않는다.


    투표는 문재인을 뽑았다. 안철수가 양보한 사람이기 때문이다. 안철수를 좋아하는 이유는 그가 좋아서가 아니라 돈도 많이 가져보고 여당에서도 탐낼 사람이기 때문이다. 정치인이 되면 당연히 비리가 생길 테고(인생사는 쉽지 않으니) 그래도 노태우나 이명박만큼 헤쳐먹지는 않을 거란 믿음이 있었기 때문이다. 박근혜도 그렇다. 난 뽑지 않았지만 당선된 그녀가 대통령이 되었다는 것을 깨끗이 인정하고 차라리 여자 인권 신장에 도움이 될 거라 생각한다. 보너스 3000만 원 받고 박근혜 때 세금을 올려서 연말 정산 이후 월급이 싹 다 날아갔다. 그리고 올해도 날아갈 거다. 그래도 박근혜 지지한다. 단지 여자라는 이유 하나 때문에.

    내가 정치를 생각하는 것은 사실 이 정도 수준밖에 안된다는 것을 밝혀두고 글을 쓴다.




    위안부 문제






    http://www.yes24.com/24/Goods/3655703?Acode=101#Div_AwordList






    친일인명사전 세트


    민족문제연구소에서 펴낸 친일인명사전이다. 전 3권으로 구성되어 있다.


    www.yes24.com







    일단 난 이 책을 샀었다. 이 책이 대단한 것은 박정희가 친일을 했다는 증거가 실려 있다는 것이다. 그런데 현 정권은 박근혜 정권이다. 그래서 난 현 정권인 박근혜 때 언론을 탄압한다고 생각지 않는다. 내 입장에서 내 부모가 어떤 짓을 했던지 간에, 우리 국민이 내 부모를 죽이고. 또 그때는 어쩔 수 없었지만 결국 정권을 잡고 나라를 경제적으로 부강하게 만들었는데도 욕을 먹어야 하는 저런 책이 있으면 다 불살라 버렸을 것이다.(그래서 내 그릇은 정치인이 못되기도 하겠지만)






    더 웃긴 건 위안부 관련해서 온갖 발언을 하는 사람들 중에 이 책을 산 사람도 없고. 시사 in을 구독하는 사람도 적다는 것이다.






    위안부 기사 관련해서 정부 운운하고 좌빨이니 극우니 하는 말들을 쓰는 사람들만 많다. 난 사실 난 다 이해가 된다. 위안부 사과하러 간 차관 마음을 모르는 것도 아니다. 개인적으로 볼 때 수천억 있는 것도 아닐 텐데 그 자리에서 시키면 어쩔 수 없이 사과하러 가야 한다. 하버드 나온 재원이고 수많은 민감한 문제를 해결했을 사람이다. 그래도 차관이 가서 좀 그랬지만






    좌빨이니 하는 사람들은 좌에 있는 사람들이 차관 신상 털어서 와이프나 자식 사촌에게 5만 원씩(100억/피해자 20만명) 주고 일본애들에게 돌림빵 당하라는 것도 아니다. 또 그런 사진 합성해서 인터넷에 올릴 것도 아니고. 나중에 사진 올라오면 나 용의자 되는 거? 차관 입장을 이해하기에 개인 욕 못한다. 정부 욕밖에 못한다. 정부 대표인 박근혜 욕 밖에 못한다.






    극우니 하는 사람들은(특히 노무현 까는 사람들) 정부를 욕하니 또 반발해서 욕한다.






    결국 남는 건... 싸움을 위한 싸움.






    우리나라가 좋고 민주주의가 좋은 것이 이런 글들은 보다가 피곤하면 그냥 안 보면 된다. 그런 글을 올리는 애새끼들이 내 친구 일수도 있고, 사촌 일수도 있다. 난 처가댁 가서 이명박 욕은 못한다. 공무원으로 퇴직하시고 또 포장, 포상까지 받으신 분이 계시기 때문에. 4대 강이 실패하긴 했지만 MB도 국밥 먹을 때는 정말 다 같이 잘 살아 보자는 마음이었을 것이다. 세상일이 그렇게 잘 풀리는 거면 아무나 대통령 했겠지. 친한 친구 집 가서 박정희 욕하면 어머니께서 차려주시는 밥상에는 송이버섯 + 진수성찬 대신 라면이 나온다. 난 사실 박정희를 만나본 적도 없고 노무현과 이야기를 해 본 적도 없다. 개뿔 모르는 것이다. 그리고 계속되는 라면은 나를 지치게 한다. 일단 영양을 채워야 생각을 할 수 있다. 비겁하고 비열하지만






    일본이 뻔한 사실을 인정 안 하다가 인정한 것이 대단한 성과라면 그 안에 눈 시퍼렇게 뜨고 계신 피해 할머니들은 왜 배제된 것인지 궁금하다. 하긴... "나한테 떨어지는 게 뭔지" 만 고민하는 국민들을 대상(나 포함)으로 대통령이 가지 않은 것은 잘 계산된 시나리오. 내가 계획을 짰더라도 최선을 방책이었을 것 같다. 






    난 아무것도 할 수 있는 게 없다. 단지 위에 말한 책을 사서 역사를 보존하려는 사람에게 자그마한 힘이라도 실어 주고 싶은 마음이다. 시사인 구독도 좋은 방법이다. 또 정부가 어떻게 할지 모른다. 방법은 좋지 않았지만 국정 교과서 표지를 위안부 역사적 내용으로 도배하고 일본이 인정했다고 적는 여우짓을 한다면 극찬할 일이겠지만. 지금 정부의 흐름으로는 미지수. 야당이 그걸 공약으로 내걸지도 미지수. 








    결론




    협상 과정과 시기가 틀렸다.


    https://brunch.co.kr/@hajunho/27






    모바일 서비스 기획


    기획이란 개인 혹은 집단의 문제의식을 해체 및 결합하여 조직의 과제로 현재화(顯在化)하는 작업이다.나는 전문 기획자가 아니다. 운 좋게 성공하는 제품의 팀에 몸 담았던 사람이다.


    brunch.co.kr/@hajunho/27



    이유는 이 글에서 썼던 아파트 가격 협상 과정을 보면 될 것이다. 시기가 틀렸다는 것은 이런 결과를 내고 또 언론에 공표를 할 거면 할머님들이 다 돌아가고 나신 다음에 해야 한다는 것이다. 내 지론은 앞으로 잘해줄 테니 참으라는 것. 개뿔 지금도 잘 안 해주는데 앞으로 어떻게 잘해줘. 할머니들이 두 번 아프게 하면 안 된다는 것이다. 차라리 타결 안 시키고 겁나 노력하는 모습만 보여주더라도 그 모습을 보며 돌아가신다면 차라리 낫다는 것이다.






    위안부 할머니께는 장관이 가야 한다. 사실 대통령이 가면 진정성을 느껴지겠지만. 대통령이 가면 진짜 이번 협상으로 우리가 깨끗하게 인정하는 꼴이 되기 때문에 일단 공식 인정부터 받아내고 우리도 나중에 말 바꾸려면 다른 사람이 가는 게 맞다. 그래서 차관이 갔나? 그래도 올해만 9분 돌아가셨다는 말을 들었는데 위안부 할머니들 억장이 무너지는데 장관이 가야 하지 않았을까?... 1 차관이긴 하지만... 아니면 내년에 그분을 그냥 장관으로 승격시켜라.










    정치 이야기는 하면 좌니, 우니, 색깔이 없으면 물타기를 하니 무조건 비판만 받는다.






    그러나 30 후반부터는 정치 이야기도 좀 해야겠다는 생각이 들었다. 조금만 더 있으면 내 친구 또래들이 옥 식각 신하고 그것 때문에 수많은 사람들이 죽어나기도 하고, 또 살기도 할 텐데. 조그마한 관심은 슬슬 가져야 하지 않냐는 생각에서이다.






    딸을 가진 부모 입장에서 비속어를 쓴 것은 반성해야겠다. 그러나 생각을 너무 많이 거르고 적으면 이 글을 읽는데 조그만 시간을 투자한 분께 예의가 아닌 것 같다.

    'Objective-C, SQLite3' 카테고리의 다른 글

    브런치 이전  (0) 2019.02.10
    브런치 이전  (0) 2019.02.10
    [이전] 브런치 이전  (0) 2019.02.10
    [이전] 브런치 정리  (0) 2019.02.10
    러프한 요구사항 900만원 프로젝트  (0) 2019.02.07



    '내부자들' 시리즈는 내년까지 쉬기로 했다. 4/7은 내년 초나 총선 이후에 더 써야 할 것 같다. 아무래도 유틸리티에서 쓴 3/7이 나름 여파가 있으므로... 개발자 매거진에 집중하고 정치 매거진에는 다른 이야기들을 적어야겠다. 그리고 시리즈에서 밝히고자 했던 새벽에 글쓰는 것에 대한 이유는 밝혀야 겠다.(내년에 쓰기로 했으니) 새벽에 글 쓰면 알람이 간다. 즉, 새벽에 글쓰을 발행하는 종자들은 독자는 고려하지 않고 자기 할말만 하고 싶다는 뜻의 표출인 것이다. 내 글들 역시 그네들이 주체기 때문에 참고만 했으면 한다.






    인터넷 돌아다니다가 아래 링크를 봤다. 최근 들어 쟁점 사안이다. 참고로 난 이게 통과되던 통과되지 않던 상관없는 사람이다. 개발자는 사실 정직원이던 계약직이던 임시직이던 못하면 못 살아남는다.


    그러나 가족, 친인척들은 타격이 좀 있겠다.






    이런 이야기를 할 때는 사전 조사가 철저해야 하지만 내가 추구하는 정치 매거진 글은 일반적인 국민인데 게 중에서도 별 지식이 없는 사람들에 맞춰져 있기 때문에 내가 그래서... 그런 것 없이도 그냥 적어 본다.






    http://legislation-sign.com/korcham/SignAgree.html






    민생구하기 입법촉구 천만 서명운동





    legislation-sign.com







    내용을 파악하려면 






    http://law.go.kr/main.html






    국가법령정보센터


    신뢰할 수 있는 법제처 국가법령정보센터


    law.go.kr







    http://www.assembly.go.kr/assm/userMain/main.do






    대한민국 국회 홈페이지


    정의화 의장, 인도네시아 이르만 구스만(Irman GUSMAN) ...


    www.assembly.go.kr











    http://likms.assembly.go.kr/bill/jsp/main.jsp






    국회-의안정보시스템





    likms.assembly.go.kr







    등을 봐야 한다. 어떤 법인지 보고 누가 발의했는지 보고 발의한 사람들이 야당인지 여당인지 보고 관련 법도 찾아봐야 한다.






    귀찮다.






    그냥 어느 단체들이 서명했는지 보면 된다. 중소기업중앙회가 들어가 있는 것은 조금 의외지만 그냥 봐도 사장님들이 관련 법을 통과시켜 달라고 했다.






    일전에 말했듯이 나의 레퍼토리 정치는 중용이고 조화다. 그러나 쉽게 이해하고 접근하기 쉽게는 제로섬 게임이다. 중용, 조화와는 달리 흑백논리가 깔리는 것이 문제지만 빠르게 문제를 파악할 때는 좋다.






    사장님들이 원하는 법이니 내용을 보지 않아도 노동자들에게는 분명 좋지 않다.






    이때 여러 가지 생각이 든다.






    노동자들에게 좋지 않으면 노동자들에게 원하는 게 있나 보네? 멘토링 진행해보니 취직을 원하는 멘티들은 다 대기업, 공기업 원하고. 인턴 했던 80여 개 기업 중에 정직원 채용은 2명밖에 안되고, 그중 하나였던 내 케이스도 멘티가 그만둬 버렸고... 담당하던 정부 사람도 공기업 추천하는데 우리의 인식이 바뀌어야 하나?






    멘티들은 아직 어린데... 간단한 해결책은 대중소기업 임금 밴드를 모두 비슷하게 고정시켜 버리면 되지 않나? 기본적으로 1.5배~2배 차이나는 임금 밴드 때문에 중소기업은 필요한 연구인력, 박사 인력도 항상 뺏기고... 대기업은 인건비 때문에 항상 고민하지 않는가? 그걸 왜 노동자들에게 쥐어 짜내려고 하지?(뭔 법안인지는 모르나) 그러면 남은 사람들이 더 나쁘게 경쟁을 하지 않을까?






    변변한 자원하나 나지 않는 대한민국이 세계정세와 비교해 보면 최근 대부분 열세다. 조선, 철강, 반도체, 휴대폰... 그러나 핀란드 사례와 같이 경쟁에서 진 곳, 즉! 무너질 곳이 무너지면 돈은 남아 돌아서 벤처 투자는 자연스레 활성화되고 슈퍼셀 같이 또 새로운 싹들이 자란다. 그리고 조선은 어떻게 살려... 우리가 민족주의로 계속 구입해 줄 수 있는 것도 아니고 중국이 30%나 싼데. 망할 곳은 유망한 유사 업종으로 변화할 수 있도록 도와주는 게 낫지 않을까. 아니면 국가가 배를 많이 사서 다른 사업을 해 보던지.






    사실 정부나 기업의 담당자들은 소수라 뭐든 살리는 게 더 이득이고 액수가 어마어마하기 때문에 개인들에게 수백억 정도 주는 것은 사실 푼돈이다. 뭐... 예전처럼 그런 비리가 있는 것도 아니고 박근혜 대통령 같은 경우 주변 자산이 4조 정도로 추정이 되니 돈 때문에 저러진 않을 거라 확신은 드는데.






    해결책이 좀 애매하다.






    고과 좋은 친구들은 뭐 아무런 말도 없지만 특히 이번 고과나 좋지 않았던 삼성 친구들이 해당 법안에 서명하라는 지시에 많이 불쾌해했다. 사실 따져보면 일은 할 건 했겠지만 추운 겨울 밖에서 일하시는 분들보다는 탱가탱가 논 것이 사실이긴 하다.






    그리고 이것이 쟁점 사안인지는 모르지만 일 년 전에 이런 법률 관련해서 정리를 한 적이 있는데, 그중에 하나만 예를 들면... 1년 계약직 할거 2년 계약직 늘여주면 어째 보면 좋은 것 같다. 그러나 이런 것은 '지입차'와 같은 것이다. '지입차'란 회사가 차량을 사주는 게 아니라 자기 차량으로 일을 해줘야 한다. 회사 사정이 나빠지면 사람들은 그냥 쳐내면 된다. 회사는 유지된다. 핵심 인력들만 유지된다. 삼성으로 치면 '미래전략실'






    온 사장들과 정부들이 다 나서는 이유는 핵심이 무너지면 단체 자체가 무너지지 않을까 하는 우려 때문이다.






    딱 잘라 말한다.






    정부랑 기업이랑은 다르다. 기업은 무너져도 나라는 안 무너진다. 이순신 봐봐...






    정부는 얼마든지 돈 벌 수 있다. 차라리 한전 전기세를 올려라. 맨날 적자 내는 한전 어차피 독점이니 적자 나도 관계없지 전기세 올려서 우리 돈 뽑아가라. 나라 무너진다는데 아껴뒀던 장롱 속 금하나 못 꺼내고 전기세 더 못 낼까? 미친 듯이 망하는 기업에 돈 쏟아 부어봐라... 세상이 그렇게 안 돌아가는데 (우리가 중국처럼 내수가 강한 것도 아니고) 살릴 수 있을까? 그러다 산업은행 너 망한다.






    그럴 바엔 그냥 삼성, LG 제품 쓰고 국산품 만드는 기업에 투자를 하도록 정책 자금을 쓰고.


    777 같이 손톱깎이 잘 만드는 곳은 정부가 나서서 해외 진출을 돕고 777은 이미 잘하고 있으니 그냥 예시.


    해외 나가서 학위 받아봤자 그 나라에 있을 학위랑 다시 자국으로 돌아갈 학위랑 다르고 등록금도 다르다는 것 다 알고 있으니 그냥 우리나라를 위한 문화를 정부에서부터 만들었으면 좋겠다.






    그래야 영국, 미국 신봉하는 나라 안되고, Where are you from부터 물어서 민족 상/하 따지는 나라 안되지 않겠나? 현차는 쿠킹포일이라는 말을 못 드는 이유는 삼성 임원이 음식점을 갈 때 내부 전자 제품들을 다 삼성으로 바꿔놓기 때문이다. 자국민 호구로 보는 우리 기업들... 꼭 살려야 하니... 기업이 중요한 거니 그 안에서 이하는 인재들이 중요한 거니? 도전하는 경영자가 중요한 거니, 돈 놀음하는 경영자가 중요한 거니.






    만약, 예전에 삼성 반도체나 현대 국산차처럼 맨땅에 헤딩해서 새로운 사업을 해. 아니면 삼양라면처럼 자국민 살리기 위해 묘조라면 가서 3번이나 무릎을 꿇어. 그런 기업한테는 우리 돈 다 빼서 특혜 주고 지원해줘도 괜찮다. 어차피 그게 다시 우리에게 돌아올 거니까. 국산차가 외제차보다 저렴하지 않나? 그렇다고 외국에서 밀리는 것도 아니고... 






    그런데 웃긴 건 현차는 강판 두께부터 사람들이 왜 다르다고 할까.


    왜 아마존의 삼성제품이 더 싸고 해외에서 사는 국산 휴대폰이 더 싼 걸까?






    그런데 왜 노동자들한테 서명을 받는 건지 모르겠다. 해외 제품 쓰고 외제차 타고 외국 가서 우리 벌어 논 돈 다 써버리는 사장들한테 서명을 받아야 하는 건 아닌지... 아... 이미 받았구나.






    세부적인 내용을 모르고 쓴 게 면죄부는 아니다.






    마음음 껏 까 주면서 나를 알게 해주면 좋겠다.






    그리고 서명 정도는 해주면 된다. 어차피 나랑 관계없다. 국내 일자리 없으면 해외 가서 일하면 되고, 자기 자리만 지키다가 개판 쳐서 나라 망하면 다른 나라 가서 살면 되지.






    이미 노동자들은 해고 많이 당하고 있다. 조선만 봐라. 얼마나 많은 칼춤을 추었던가? 해고가 안돼서 문제냐...






    그리고 나라 위한다고... 보수라고 생각하는 사장님들 봤으면 한다. 또, 사업에 차별화가 없으면 그 돈 지키면서 출혈 경쟁구도나 만들지 말고 그냥 그 돈으로 혼자 잘 먹고 잘 살고... 또 문을 닫는 것이 노동자들에게 더 존경받는 일이라는 것을 깨닫길 바라며(아님 각자 돈 나눠주던가)






    워킹 US에서 퍼왔다. (맞춤법 검사 돌려서 좀 다를수도 있으니 링크에서 제대로 보자)






    http://www.workingus.com/v3/forums/topic/%EC%A2%8B%EC%9D%80%EA%B8%80%EC%9D%B4%EC%9E%88%EC%96%B4-%ED%8D%B C%EC%99%94%EC%96%B4%EC%9A%94/






    Topic: 좋은글이있어 퍼왔어요 | WorkingUS.com


    Home Talk Free Talk 속이 후련한 글입니다. ===================================================================


    www.workingus.com



    ==============================================================================





    <뉴욕타임스 ‘진실을 밝혀라’ 전면광고에 대해 새누리당이 ‘정치선동세력’이 광고를 게시한 거라 비난하자, 어느 미국 교민이 댓글로 남기신 것을 포스팅합니다. 많은 공유 부탁드립니다>


    “이 광고를 후원한 미국 교민 중 한 사람으로서 한번 냉정하게 따져봅니다. 아니, 미국 교민이 대체 박근혜 하야시켜 무슨 이득을 보겠습니까? 대체 무슨 정치적 이득을요? 대한민국 대통령 바꾸면 뭐 갑자기 미국이 확 살기 좋아진답니까? 솔직히 진짜 미국 교민으로서 색누리당 FTA 날치기 얼마나 유리한지 아세요? 진짜 미국 교민이 정치적 목적을 가지고 있다면 색누리당 지지할 거예요. 그런데, 그럼에도 불구하고 박근혜 하야, 아니면 최소한 박근혜 정부 대오각성이라도 원하는 이유는 우리가 누리는 민주주의를 대한민국도 누리기를 원해서에요! 박근혜 하야 안 해도 지금이라도 정신 차리고 똑바로 하겠다고 다짐하고 지금이라도 모든 공약 실천에 옮긴다면 대체 뭔 이유로 박근혜 하야를 원하겠습니까. 근데 한 달에 가까운 시간이 지났어요. 그동안 무슨 변화가 있었습니까?


    다시 한번 미국 교민으로서 말씀드리는데요 이익을 추구했다면 색누리당 지지했어요. 한국 솔직히 이제 남의 나라 취급하고 소식 끊고 망신을 당하건 말건 미국이 FTA로 단물 빨아먹고 교민 경제 활성화하면 장땡이고요. (솔직히 교민 중 그런 마인드를 가진 사람들도 상당수긴 하고.)


    그래도 가만있을 수 없어요. 내 형제, 내 친척, 내 사촌, 내 일가붙이가 아직도 지금 한국에서 고통받고 있거든요! 세월호의 유족 여러분들께서 자식의 생환을 위해 대체 무엇인들 아끼시겠습니까? 지금 제3자의 눈으로 침몰하는 대한민국호를 보는 교민들도 마찬가지예요! 가만히 있지 마라, 뛰어나와라, 행동해라, 선장 말 믿지 마라! 이 말을 침몰하는 대한민국의 가족들에게 외치고 싶은 마음이랍니다! 오히려 직접적인 피해를 받고 있는데도 가만히 있는 것도 모자라 옆사람에게까지 가만히 있으라고 하는 일부의 한국 국민들이 전 더 이해가 안 가네요!


    국가망신이요? 그놈의 체면, 그것 때문에 박근혜가 저렇게 불통하고 있는 걸 보시면서 국가 체면을 논하세요? 나 아파요, 하고 아픈걸 드러내야 의사가 고쳐주고 간호사가 간호해주는 거예요. 혼자 벙어리 냉가슴처럼 끙끙 앓고 있으면 누가 와서 치료해 줍니까? 치부를 드러내야 치료도 가능한 겁니다! 그리고 이미 많은 외신들에게서 형편없는 위기관리 능력과 정부의 미흡한 대처 그럼에도 모자라 뻔뻔히 책임전가 하는 거 충분히 질타받았는데 이건 국가망신이 아닙니까?

    침몰하는 대한민국호가 아니라 그 침몰을 지켜보고 있는 밖에 있는 가족으로서 부탁드립니다. 자신을 살리고 싶으시면 가만히 있지 마세요! 본인이 정 가만히 있고 싶으시다면 최소한, 가만히 있지 않겠다는 사람들 발목이라도 잡지 마세요!


    그리고 혹시 색누리당 관계자 한놈이라도 볼지 모르겠지만 이 인 두껍만 쓴 아메바 새끼들아, 왜 뉴욕타임스는 니들 권한 밖이라 똥줄이 타냐? 왜 아예 백만 미국 교포들이 다 북한에서 건너갔다고 하지 미친 새끼들아? 난 보수고 미국에서 공화당 찍어 시 벌 놈아. 내가 보수야, 니들이 아니고 이 친일 수구 매국노들아!! 보수 참칭 하는 것들 아주 벽에 발라 보수해버리고 싶은 심정이야!! 니들이 무슨 자격으로 보수를 드럽혀!!! 김정은 개새 끼고 시발 새낀데 그 정치체제 그대로 따라가는 트루 종북이 니들이면서 니들에 반대하면 종북이라고 몰아붙이는 이 트루 빨갱이 새끼들아 어디 나도 한번 잡아가 봐라!!!”


    5월 11일 Sang Kim님

    'Objective-C, SQLite3' 카테고리의 다른 글

    브런치 이전  (0) 2019.02.10
    브런치 이전  (0) 2019.02.10
    [이전] 브런치 정리  (0) 2019.02.10
    러프한 요구사항 900만원 프로젝트  (0) 2019.02.07
    프로그래밍 면접 질문  (0) 2019.02.05

    정치를 한다는 뜻도 좋다.


    <a class="link" target="_blank" href="http://dic.daum.net/word/view.do?wordid=kkw000323836&supid=kku000291970#kku000291970" style="color: rgb(102, 102, 102); text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(102, 102, 102); word-break: break-all;">정치하다</a> (통치자나 정치가가) 사회 구성원들의 다양한 이해관계를 조정하거나 통제하고 국가의 정책과 목적을 실현시키는 일을 하다



    이해관계를 조정하다


    4대 강 사업 때문에 자살했던 사람도 있고, 녹조라테, 큰 빗 이끼벌레 등 그 결과도 좋지 않다. 그러나 4대 강 사업에 참여했던 업체들은 큰 돈을 벌었을 것이다. 건설 쪽은 수주하기가 힘들어서 그렇지 일단 일을 받으면 무조건 남는 장사라고 들었다. 친인척이 하나 운영하시기도 하니까.



    <a class="link" target="_blank" href="http://dic.daum.net/word/view.do?wordid=kkw000229997&supid=kku000292917#kku000292917" style="color: rgb(102, 102, 102); text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(102, 102, 102); word-break: break-all;">제로섬 사회 zerosum社會</a>

    ①[사회] 경제 성장이 멈추어 이용 가능한 자원이나 사회적 부의 총량이 일정해져서 한 가지 문제를 해결하려고 하면 반드시 다른 이해와 충돌되는 일이 일어나는 사회<br />②미국의 경제학자 서로(Thurow, L.C.)의 저서 제목에서 따온 용어이다


    우리가 살고 있는 사회는 '제로섬 사회'다. 그래서 이해 관계가 가장 중요하다.


    정치에서는 인맥이 중요하다. 프로그래머 1편에서 9편까지 '서울대' 용어가 많이 나왔는데. 그들이 똑똑한 것도 그 이유겠지만 더 중요한 것은  '인맥'이라는 것이다.


    이해관계를 조정하는데 혈연, 지연, 학연은 절대 배제할 수 없다.



    혈연은 100% 배제 못한다


    사실 이 글은 나중에 내가 늙어서 천운이 좋아 큰 일을 하게 될 때 내 발목을 잡게 될 것이다. 그래도 쓴다. 딱 잘라 결론만 말해서 혈연은 100% 배제할 수 없다. 혈연의 이유는 자신의 부모님과 자식들을 생각해 보면 될 것이다. 혈연, 지연, 학연은 무조건 배제해야 한다는 가설을 세우고 30년을 살아보니 (인지 능력 없을 때 제외) 내 가설은 틀렸다는 것을 알았다. 재벌가만 봐도 계열사의 가족들이 모두 CEO로 있다. 롯데도 싸우고 CJ와 삼성전자가 재산 때문에 잠깐 싸우기도 했지만 혈연이 아니었으면 더 심했을 것이다. 물론, 사이코패스처럼 특수한 케이스도 있다. 내 친구들 중에 아니라고 하던 친구들도 아기 낳고 나서는 다 변했다. "피는 물보다  진하다"는 말은 자주 듣는 말이다. 어떤 상황이라도, 비록 이해관계가 얽혀있다 할지라도 혈연을 선택하는 경우에서는 사람들의 동의를 얻는다. 이해도가 1%던 100%던 개인차는 있지만 이해될 여지는 있는 것이다.

     이에 반해서 지연, 학연은 혈연과는 완전히 상반된 것이다. 지연, 학연은 오히려 독이 될 수도 있다. 그러나 '기회'를 제공 받음에 혜택이 있는 것은 확실하다. 처음 만난 사람과 이야기를 하다가도 조금 더 친밀함을 느낄 수 있는 관계인 것이다. 내가 삼성전자라는 기업에서 느낀 것은 혈연은 매우 짙었다. 내부에 있지 않아도 외부 사람들도 알 수 있는 것이다. 호구 조사를 일일이 할 수 없기에 입사 후에 기업에서 일하는 가족을 적도록 한다. 인사 비밀이라고는 하나. 임원의 아들이나 딸이면 금세 입에  오르락내리락한다. 물론, 그것이 실력 평가에 크게 반영되지는 않을 것이다. 그러나 구미 검증 파견 기숙사 시절 나는 밖에 자취했지만 모사장 아들이 기숙사 온다고 하여 깨끗한 여자 기숙사를 3층까지 비우고 남자 기숙사로 만들었던 이야기는  그때 그 시절 같이 근무했던 동기들만 아는 이야기가 되었다. 그래도 다들 이해했다. 위에서 시킨 것은 아닐 것이고 아마 잘 보이기 위한 누군가가 했을 것이다. 그게 약이 되었는지 독이 되었는지는 알 수 없다. 아마 내가 높은 위치고 내 딸이 쓴다고 했으면 난 지시를 하고 더 융숭하게 대접하도록 했을 것 같다.



    중도가 필요하다


    챙겨주는 것은 이해한다. 그러나 중도란 게 필요한 세상이고, 그것이 상식이다. 또 우리는 상식이 통하는 세상에 살고 있다. 세상일은 도무지 알 수가 없다. 물론, 한 사람이 세상의 모든 이치를 통달하고 눈에 보이지 않는 원자 단위의 움직임까지 예측할 수 있다면 모든 현상은 예측 가능할 것이다. 그러나 인간의 물리적 능력의 한계 때문에 일단 모른다고 하고, 상식선에서 행동하면 된다. 자식을 챙기는 것도 가족을 위하는 것도 중도를 지켜야 한다는 것이다. 중도에 대한 명확한 기준은 없다. 이것은 각자의 능력에 달려 있다. 



    중도를 지키는 것이 능력이다


    중도를 지키는 것만의 능력이라는 뜻은 아니다. 모두가 반대할 때 적진으로 먼저 뛰어드는 이순신 장군 같은 사람도 있었으니까. 중도를 지키지 않을 때는 결과가 중요하다. 이순신이 전투에서 패배만 했다면 역사에 남지 않았을 것이다. 그리고 만약 이명박의 4대 강 사업이 너무나도 잘 되었다면 모두가 행복했을 것이다.(반대하느라 자살하신 분과 가족, 친인척 및 이와 비슷한 케이스 제외) 그러나 인간의 물리적 한계 때문에 모든 예측이 빗나갔다. 이명박과 그 측근들의 예측이 빗나갔다고 무조건  비난받아야 하는 것은 아니다. 그러나 사람들 생각은 다양하기에  극심하게 비난하는 사람들이 있다. 문제의 강 주변에 사는 사람들일 것이다. 아닌 사람들은 4대 강으로 돈 많이 번 사람들이겠다. 그 돈으로 근처에서 이사 가 버리면 되니까. 극심하게 비난하는 사람들의 입장에 서지는 못하기 때문에 비난한다고 그 사람들을 욕하면  안 된다. '일베'가 그런 존재들이다. 자기네들도 똑같이 한다고 하지만 사이트 들어가보면 가입 없이도 볼 수 있는 온갖 욕설과 살인의 딱 전 단계인 말들이 오고 간다. 중도가 없다. 능력이 없다.



    중도의 단점


    투표 방식에 은행처럼 공인인증 방식을 추가 도입한다면, 얼마나 많은 사람들이 투표에 참여하고 깨끗한 투표가 될까? 세무를 모두  전산화한다면 얼마나 비용이 절약되고 투명한 사회가 될까? 그러나 그렇게 되지 않는 이유는 뭘까? 시간이 조금 지났지만 국방부 장관도 군대를 다녀오지 않은 때가 있었다. 군대의 중요성이 강조될까? 자식들 군대 안 보낸 사람들이 대부분 고위직에 있는데 바뀔 리가 전무하다. 군대 문제가 계속 떠오르는 것은 상식에서 너무 벗어나는 경우도 많았지만 이해관계에 얽혀 싸우는 사람들이 공격용으로 쓰기에 문제 해결이 된다고 한다. 군대에 가야할 자식들이 다 군대로 갔는지. 해외 국적을 취득했는지는 통계를 못봤지만 그쪽에 얽힌 이해관계자가 많은 한 투명할 수는 없을 것이다. 세무 처리의 경우도 비슷한다. 세무사들 우수한 사람들이고 돈을 쥔 사람들인데 모두 전산화해서 30만명이 직장을 잃는다면 어떻게 될까? 투표도 그렇다. 방해하고 조작할 여지를 남겨둬야 할 것이 아닌가? 수많은 사람들이 모바일로 인터넷 뱅킹을 수시로 하는 상황에서. 투표율이 올라가면 피해볼 사람들이 있는데 말이다.

     중도의 단점은 이해관계를 계속해서 고려하기에 진정 발전된 방향으로 가기가 힘든 데에 있다.



    최선의 방법


    최선의 방법은 어마어마한 능력자가 정치를 하는 것이다. 그래서 난 각 분야에서 최고라고 칭송받던 사람들이 정치를 안 하는 것에 매우 분노한다. 물론, 정치판 가서 영혼까지 탈탈 털린 후 노년을 맞이하긴 하지만 투표권이 있는 한명의 시민으로서 단언컨데, 자신의 분야에서 진정 최고가 되려면 마지막엔 정치판에 가야 한다고 생각한다. 이미 능력을 검증받았기에, 중도를 지키는 것은 능력이기에 잘 해 내리라 믿는다. 물론, 정치를 하다가 틀릴 수도 있다. 그렇다고 살해 당하는 나라 아니다. 비록 수없이 욕은 하겠지만 대통령이 안 된 다음에야 

    '유승준' 만큼 욕을 많이 듣진 않을 것이다. 한명 더 거론하고 싶지만 그 분은 과거형이니 하늘이 내려준 능력을 마지막까지 시험해 보았으면 좋겠다. 모든 이해관계자들에게 칭송받을 수는 없다. '이순신'도 국가가 버렸지 않은가? 다만 피라미드의 아랫부분을 보고 최대 다수의 행복을 이끌어 내는 것이 기본 중에 기본. 상식인 것이다.

    그래서 국민을 위하는 정치를 해야 한다고 정치인들이 말하는 것이다. 정치인들이 영혼까지 털리는 이유는 이해관계의 중심에 있기 때문이다. 영화 '매트릭스'에서 아키텍트를 만나는 것과 같다. 국가 기관인 검찰, 경찰과도 연이 닿아있기 때문에 모든 행적들이 공개가 된다. 그러나 두려워하면 안된다. 데모하다가 소위 빨간 줄 끄인 사람들도 국회의원이 되는 이유는 그 때문이다. 매년 새롭게 바뀌는 법 또한 이해관계를 조율하는데 완벽하지는 않기 때문에 중도를 지키고 조화를 만드는 사람이 정치인이 되길 원한다. 최선의 방법은 모두가 원하는 것을 하는 것이다. 친구들과 망년회 때 몸에 좋지도 않은 술을 마시는 이유를 알 수 있다면 훌륭한 정치인이 될 거라 확신한다.



    기준 없는 중도와 조화


    사실 이 부분은 언론들이 만들어 간다고 생각한다. 한번 정부를 까기 시작하면 평생 정부를 까는 매스컴이 되고 한번 옹호하기 시작하면 계속해서 옹호하게 된다. 즉, '관성'이 생긴다. 그러나 아닌 경우도 있다. 일전에 전자신문 사태도 그렇다. 전자신문 주식은 삼성전자 이해 관계자가 60% 이상 들고 있지만 그들은 삼성을 대대적으로 깠다. 어느 순간에는 중도는 없고 그냥 '서로가 서로를 비방할려는 논리만을 찾아서 비방하는' 지경에 까지 이르렀다. 그들이 싸워서 보다 나은 민주주의를 만든다던지, 보다 나은 기업 문화를 만드는 쪽으로 간다면 관계 없겠다. 누구의 잘잘못은 별로 중요하지 않다. 다수가 잘 사는 방법이라면 대체로 맞는 쪽이다. 최종적으로 편집장이 사과문을 올렸지만 신문사 내에서 수긍하지 않은 사람들이 피해를 많이 봤다.

     시사in 출판 비화도 그렇듯이 언론들은 돈이나 권력에  길들여지는 것을 원치 않는다. 그러나 싸우다 보면 서로의 기준이  중요시되어서  아이러니하게도 과거 '삼양라면' 사태가 발생하기도 한다. 삼양라면이 잘못이 없는데도 조중동이 합심해서 기업을 망하게 했지만 국가가 보는 입장에서는 경쟁사가 잘되는 꼴이니 국민들이 굶지만 않으면 중도를 지킨다는 것이다. 물론, 국민들을 안 굶긴다는 그 정신도 '삼양라면'이 처음 가져왔긴 하지만



    그 기준은 '자신', 필요한 것은 자유


    IS가 폭탄테러를 하는 것을 보며, 얼마나 세뇌를 시켜놨길래 스스로 저렇게 자살할 수 있을까 생각해 본다. 그래서 언론을 통제하는 것이 얼마나 위험한 것일까도 생각해 본다. 중도를 지키는 것에 대한 최종 판단은 자신의 몫이고. 그 능력 또한 천차만별이겠으나. 똑같은 사상을 주입시켜서는 안된다는 생각이 든다. 그래서 '자유'라는 단어는 항상 논란의 여지가 있는 단어이지만 인간이 사회를 이루어야 살아간다는 전재하에서는 가장 중요한 단어라고 생각한다.


    난 경찰도 검찰도 법관도 아니다. 공직에 있는 사람이면 깨끗해야 한다고 다들 말한다. 그러나 난 아니다. 공직에 있는 사람들이 장/차관 달기 전까지 받는 돈은 너무도 작다고 생각한다. 국장만 되어서 살림살이 나아지겠지만. 억대 연봉을 줘야 국민들을 위해서 야근도 하고 더 노력하지 않겠나 생각하는 사람이다.

     노태우가 50억 헤쳐먹었으면 그냥 이해하려 했다. 5000억은 중도에 어긋난다. 밝혀진 게 5000억 규모니 아마 5조는 헤쳐먹었을 것이다. 50억이면 남은 여생 편하게 살다가 자식도 건사할 정도인데 5000억이면 그런 사상으로 비읍 시옷 같은 애들 수천 명은 양산시킬 수 있기에 국가 기반 자체가 흔들릴 수도 있다는 말이다.


    정치인들에게 깃털, 솜털처럼 깨끗하라고 하지 않겠다. 그냥 적당히 헤쳐 먹었으면 좋겠다. 나쁘게 살아도 자기 기준에서는 나쁘지 않을 것이고. 하늘 나라로 갈 때 같이 나쁜짓 한 사람들이 곁을 지키기에 끊임없이 자신을 속이겠지만. 뇌세포가 죽어가는 노년에도 뭔가 찜찜하지 않을까?


    전쟁을 겪은 사람들을 실험 대상으로 한 논문에서 전쟁중 적을 죽인 기억들은 대부분 늙어서 잊는다는 조사 결과를 본 적이 있다. 위안부 할머니들를 강간했던, 아직까지 살아있는 수많은 일본인 할배들도 스스로 잊었겠지. 그러나 무섭지 않은가? 나중에 다 기억나면 어떻하냐. 그 마지막 옆을 자신의 소중한 손녀가 지키고 있을 때 그 맑은 눈을 바라보며 편히 갈 수나 있을까 걱정이 된다.


    'Objective-C, SQLite3' 카테고리의 다른 글

    브런치 이전  (0) 2019.02.10
    [이전] 브런치 이전  (0) 2019.02.10
    러프한 요구사항 900만원 프로젝트  (0) 2019.02.07
    프로그래밍 면접 질문  (0) 2019.02.05
    두번째 블로그의 마지막 글 모음  (0) 2019.02.05

    1. 글씨체 및 사이즈 통일, 줄바꿈 체크 등 요망


    2. 후반부에 같은 내용이 반복되는 부분이 있으니 확인하시고 반복부분 삭제요망


    3. ODROID 실습보드에 대한 회로 설명과 주요기능 설명 추가                                   


    4. 보드에 오실로스코프를 사용하여 신호 측정하는 내용 추가


    5. 프로젝트 생성, 디버깅, 릴리즈 등 프로젝트 관리 이론과 프로젝트 관리를 위한 SW솔루션 사용법 추가


    6. 개인별 프로젝트의 요구사항 정의서 작성 과정 추가


    7. 앞서서 상의드렸던 응용 예제 프로젝트 내용 추가


    교재 작성 後


    900 수령 完

    'Objective-C, SQLite3' 카테고리의 다른 글

    [이전] 브런치 이전  (0) 2019.02.10
    [이전] 브런치 정리  (0) 2019.02.10
    프로그래밍 면접 질문  (0) 2019.02.05
    두번째 블로그의 마지막 글 모음  (0) 2019.02.05
    About VCS  (0) 2019.02.05

    SAX/DOM

    프로세스와 스레드

    Activity/Fragment

    사용해본 개발환경이 무엇인지 답하기

    알고리즘의 big O

    O(log n), O(n), O(n * log n), O(n2) 등등을 보기로 주고,

    알고리즘들이 어떤 big O에 속하는지 고르기

    인텐트의 사용 케이스와 명시적/암시적 인텐트 설명하기

    브로드캐스트 리시버란?

    Thread.sleep(), Object.notify(), Object.sleep()에 대해 설명하고 차이점 기술

    데이터베이스의 트랜잭션 설명하기

    SQLite에서 날짜와 시간 저장 방법 설명하기

    클래스를 주고 싱글톤 패턴에 맞게 코드 수정하기

    배열 하나 주고 이들을 조합하여 출력하는 방법을 자바 코드로 작성하기

    ·         TDD 써본  있는가?

    ·         사전테스트에서 프래그먼트(fragment) 화면을 나눌  있다고 답했는데,그것은 뷰로도 가능하지 않나?

    ·         ( 질문에 이어뷰로 화면 나누는 것과 프래그먼트로 나누는 것은 어떻게 다른가?

    ·         프로세스들 사이에 시그널은 어떻게 주고 받나?

    ·         스레드들 사이에 자료는 어떻게 주고 받나?

    ·         프로세스들이스레드들이 메모리로 자료를 공유할 방법은 없나?

    ·         앱을 죽이면그것의 브로드캐스트 리시버는 계속 작동하는가?

    ·         사전테스트에서 작성한 싱글톤 패턴 문제의 답에 빠진 게 있는 것 같다무엇인지 아는가?

    ·         콜렉션들 중 ArrayList, LinkedList, HashMap, SparseArray에 대해 설명하고 차이점을 말하라.

    ·         디자인 패턴 공부했나?

    ·         (위 질문에 이어) Strategy 패턴에 대해 설명하라.

    ·         3G 망과 와이파이 망의 다른 점은?

    ·         LTE 망에서 상태값들에 대해 설명하라.

    ·         스레드 로컬이란?

    자료구조멀티쓰레드. TCP/UDP차이점. Android에서 dp? ios protocol, delegate, datasource 관련암복호화 알고리즘(hex, AES256 )

















    3G 망과 WiFi 망 다른 점

    -       Handoff인 것 같다. 3G cell간의 handoff는 깔끔한데 반해 WiFi는 3G에 끼던 Wifi AP간이던 소켓 통신을 하는 어플이라면 무조건 끊기고 본다.

    LTE 관련

    -       4G는 WiBro, Wireless Broadband, LTE-Advanced, 보통 LTE는 3.9G 115Mb, 이론 1Gb

    -       2G : GSM(Global System for Mobile Communication), CDMA(Code division multiple Access), TDMA(Time division multiple Access)

    -       3G : W-CDMA(Wideband code division multiple access), IMT-2000(International Mobile Telecommunication-2000) 최고속도는 HSDPA(14.4Mb)

    -       LTE status – no signal(RSSI : signal strenth , connected, power save mode…

    • Tables that show the coverage type, RSSI and Ec/Io (for 3G), RSSI and CINR (for 4G WiMAX), and RSRP and RSRQ (for 4G LTE).

      RSSI reflects the signal strength of the network.

      Ec/Io is a dimensionless ratio of the average power of a channel, typically the pilot channel, to the total signal power.

      RSRP stands for Reference Signal Received Power and reflects the LTE signal strength.

      CINR stands for Carrier to Interference-plus-Noise Ratio and is a measurement of signal effectiveness.

      RSRQ stands for Reference Signal Received Quality and reflects the LTE signal quality. RSRQ is the ratio between the RSRP and the Received Signal Strength Indicator (RSSI).

      The first table also shows the type(s) of 3G service you have: 1X, 1xEV-DO, or both. (To determine whether you have EV-DO Rev. 0 or Rev. A service, use the text near the 3G icon; see 
      Mobile Broadband Information and Settings.)


    -       안드로이드에서 LTE 시그널 아이콘을 만들려면 어떻게 해야 할까? Connected(Active) SIGNAL Strenth, Handoff .. 고려

    SAX/DOM, Simple API for XML, document object model

    -       둘다 XML 파서. SAX의 경우 인터프리터 방식으로 처리하고 DOM은 메모리에서 한번에 처리함메모리에 올리니 두번 읽을 때나 전체 구조 수정 때 좋지만 메모리 많이 씀. SAX의 경우 읽기만 할 때노느가 열렸다가 닫힐 때마다 이벤트가 발생함. Apache의 axis는 XMLpullParser라고 하고 이벤트마다 핸들러를 호출하지 않는 형태.

    싱글톤 패턴 -> 싱글톤에 맞게끔 수정하려면 기본 코드 숙지는 필수

           public class Singleton {

           private volatile static Singleton si;

           private void Singleton() {

           }

           public static Singleton getInstance() {

           if (si == null)

           synchronized (Singleton.class) {

           if (si == null) si = new Singleton(); }

           return si; }}


    사용해 본 개발환경

    -       언어는 GW-BASIC, Quick-BASIC, 씨앗, C, C++, JAVA, ASMBLY, 임베디드등의 각종 Crosscompiler, coder warrior, borland사께 좋았는데… 각 언어들의 IDE

    -       최근은 Android Studio, Ecilpse (SUN을 망하게한)


    알고리즘의 Big O

    -       최악의 수행시간이 될 수 있는 가능성 판단

    -       Big-Omega는 그 반대. Big-theta는 빅오랑 빅오메가를 동시 만족하는 애들

    -       버블정렬삽입정렬의 경우 최악은 O(n^2), n^2은 최악의 상황을 말함최선은 O(n)


    브로드캐스트리시버란?

    -       안드로이드 앱은 4가지중 하나를 구현해야 하는데 액티비티서비스브로드캐스트리시버컨텐트 프로바이더다그중에 하나로서 시스템상에 발생하는 브로드케스트성 인텐트를 감지하는 역할을 한다문자 수신을 감지하거나 PUSH service, 첫 부팅 때 서비스를 실행하게 할 때 쓰인다.


    인텐트의 사용케이스

    -       위에서 말한 4가지 케이스 중에서 컨텐트프로바이더를 제외하고 인텐트는 다 쓰인다액티비티가 다른 액티비티를 호출하던지다른 앱을 실행할 수도 있다.


    명시적 인텐트와 암시적 인텐트

    -       액티비티 이름을 지정하고 보내면 명시적 인텐트이며명시하지 않으면 암시적 인텐트로서 각 앱들의 AndroidManifest.xml에서 인텐트 필터에 걸리는 것들. ACTION, CATEGORY, DATA, TYPE, COMPENET, EXTRAS, FLAGS 사용

    -       New Intent(Intent.ACTION_DIAL, Uri.parse(“tel:......”0));

    프로세스 통신

    -       Shared memory, 세마포어, pipe, named pipe, file, socket, messagfe passing, memory mapped file, signal.

    안드로이드 프로세스 통신 메커니즘

    -       바인더 바인더 드라이버를 통해서 커널 공간 메모리를 이용한다.

    -       RPC : remote procedure call, OOP에서는 remote invocation, remote method invocation.

    -      <v:shapetype data-blogger-escaped-coordsize="21600,21600" data-blogger-escaped-filled="f" data-blogger-escaped-o:preferrelative="t" data-blogger-escaped-o:spt="75" data-blogger-escaped-path="m@4@5l@4@11@9@11@9@5xe" data-blogger-escaped-stroked="f" id="_x0000_t75"><v:stroke data-blogger-escaped-joinstyle="miter"><v:formulas><v:f data-blogger-escaped-eqn="if lineDrawn pixelLineWidth 0"><v:f data-blogger-escaped-eqn="sum @0 1 0"><v:f data-blogger-escaped-eqn="sum 0 0 @1"><v:f data-blogger-escaped-eqn="prod @2 1 2"><v:f data-blogger-escaped-eqn="prod @3 21600 pixelWidth"><v:f data-blogger-escaped-eqn="prod @3 21600 pixelHeight"><v:f data-blogger-escaped-eqn="sum @0 0 1"><v:f data-blogger-escaped-eqn="prod @6 1 2"><v:f data-blogger-escaped-eqn="prod @7 21600 pixelWidth"><v:f data-blogger-escaped-eqn="sum @8 21600 0"><v:f data-blogger-escaped-eqn="prod @7 21600 pixelHeight"><v:f data-blogger-escaped-eqn="sum @10 21600 0"></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:f></v:formulas><v:path data-blogger-escaped-gradientshapeok="t" data-blogger-escaped-o:connecttype="rect" data-blogger-escaped-o:extrusionok="f"><o:lock data-blogger-escaped-aspectratio="t" data-blogger-escaped-v:ext="edit"></o:lock></v:path></v:stroke></v:shapetype><v:shape data-blogger-escaped-alt="cd1f09671e309c6fe682fb50fe10307b.png" data-blogger-escaped-o:spid="_x0000_i1027" data-blogger-escaped-style="height: 303pt; mso-wrap-style: square; visibility: visible; width: 422.25pt;" data-blogger-escaped-type="#_x0000_t75" id="그림_x0020_1"><v:imagedata data-blogger-escaped-o:title="cd1f09671e309c6fe682fb50fe10307b" data-blogger-escaped-src="file:///C:\Users\joe\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png"></v:imagedata></v:shape>

    쓰레드 통신

    -       어떤 쓰레드를 말하는 것인지? For문 돌려서 만들어 내는 쓰레드들인지하나의 앱에서 도는 여러 쓰레들인지각자 다른 앱들에서 파생된 Thread 들인지그 Thread가 어떤 일을 하느냐에 따라 달라질 듯

    -       안드로이드라면 File, DB로 교환을 해도 되고 브로드 캐스팅을 이용해도 되고 static 변수를 이용해도 되고 방법은 많이 있을 듯하나의 함수(static volatile변수가 있는)를 같이 씀.

    안드로이드에서 프로세스와 쓰레드

    -       Application component(액티비티서비스, BR, CP)가 시작될 때 리눅스 프로세스가 생성되면서 싱글쓰레드가 돈다그 싱글 쓰레드를 메인 쓰레드 혹은 UI 쓰레드라고 부른다.

    -       프로세스 상태는 전/후면보이는서비스빈 프로세스로 되어 있다.

    -       핸들러, Asynctask,, RunOnUiThread로 관리를 해줘야함.

    액티비티와 Fragment

    -       액티비티는 안드로이드 4대 컴포넌트고 Fragment는 허니콤(타블렛을 위한 안드로이드)에 화면 분할을 위해 나온 개념꼭 Fragment로 구현안하고 Relative Layout으로 적당히 구현해도 됨아이스크림으로 넘어오면서 폰에도 통합되었는데 Scroll이나 viewPager만큼 쓰이진 않는 듯.

    정렬 알고리즘의 Big O

    -       nLogn = 힙정렬퀵정렬병합정렬

    -       n^2 = 선택버블삽입

    -       속도 : n^2 > nLogn > n > logn

    -       Nlogn => n=1일 때 0, 2 = 2, 3 = 4.75, 4 = 8, 5 = 11

    트랜젝션

    -       현대의 웹 보안에 있어서 매우 중요한 역할을 차지하며 DB와 JAVA 언어가 데이터를 주고 받는 과정에 원자성을 부여하는 수단

    -       한줄의 쿼리로 도저히 끝낼 수 없는 상황이 왔을 때쇼핑을 하는데 회원이 잔여금액을 확인하고 선택상품을 구매했을 때 잔여 금액이 감소하는

    -       상품구매에서 Exception 발생해서 상품이 없는데 있다고 되거나 잔여금액이 감소하기 직전 서버 전원이 나갈 때.

    -       쿼리 여러 개를 하나의 트랜젝션으로 묶어서 에러 발생시에 원래대로 돌려놓는 기술

    -       All or nothing. Commit and rollback

    -       트랜젝션 전에는 프로시져가 있었다.

    -      <v:shape data-blogger-escaped-alt="http://pds23.egloos.com/pds/201201/13/59/d0142459_4f0fddd013079.png" data-blogger-escaped-o:spid="_x0000_i1026" data-blogger-escaped-style="height: 393.75pt; mso-wrap-style: square; visibility: visible; width: 468pt;" data-blogger-escaped-type="#_x0000_t75" id="그림_x0020_2"><v:imagedata data-blogger-escaped-o:title="d0142459_4f0fddd013079" data-blogger-escaped-src="file:///C:\Users\joe\AppData\Local\Temp\msohtmlclip1\01\clip_image002.png"></v:imagedata></v:shape>

    -       얘가 프로시져… 걍 요래 생겨먹었다.

    앱이 죽어도 브로드 캐스트 리시버는 살아 있는가?

    -       BOOT COMPLETE 는 앱이 죽어 있어도 받는걸보면 AndroidManifest.xml이 있는 한분명 살아 있다.

    SQL JOIN

    -       INNER JOIN : 두 테이블간의 조인 조건을 만족하는 ROW만 리턴

    -       OUTER JOIN : LEFT, RIGHT, FULL이 있고 LEFT의 경우 왼쪽 다 들고와서 오른쪽이랑 매칭 없으면 NULL 리턴

    -       Select a.id, a.name from tb1 a inner join tb2 where a.id = b.id

    -       Insert into tbl2 (id,car) values (2, ‘MIN’)


    샤딩 몽고DB는 데이터 베이스 자체에서 샤딩기능을 제공수평분할 서현동 주민 테이블정자동 주민 테이블샤딩 서현동은 A DB정자동은 B DB에 물리적으로 나누는 것.

    Lock : Lock I= new ReentrantLock();

    l.lock();

    try {

    }

    Finally {

    l.unlock();

    }

    크리티컬 섹션은 한번에 하나의 쓰레드만 실행시킴. Lock을 얻지 못하면 시스템 호출


    스레드 로컬이란?

    하나의 인스턴스에서 생성되는 쓰레드들이 각각 정보를 저장하려고 할 때 이용.

    뷰로 화면 나누는 것과 프래그먼트로 나누는 것은 어떻게 다른가?

    (위 질문에 이어) Strategy 패턴에 대해 설명하라.

    자료구조

    스레드들 사이에 자료는 어떻게 주고 받나?

    프로세스들이스레드들이 메모리로 자료를 공유할 방법은 없나?

    콜렉션들 중 ArrayList, LinkedList, HashMap, SparseArray에 대해 설명하고 차이점을 말하라.

    HashMap 빼고는 키 없이 저장하는 방식. ArrayList는 일반적으로 쉽게 쓰는 방식, LinkedList는 ArrayList에서 중간 데이터 삽입삭제가 일어나면 이걸로 바꾸어야 함. HashMap은 키값과 같이 저장하고 동기화에는 취약그럴 땐 HashTable 쓰고. SparseArray는 성능 짱 안드로이드용 ArrayList로 알고 있음.

    ArrayList : 데이터를 중간에 끼워넣지 않을 때 싸용



    O(log n), O(n), O(n * log n), O(n2) 등등을 보기로 주고,

    알고리즘들이 어떤 big O에 속하는지 고르기

    Thread.sleep(), Object.notify(), Object.sleep()에 대해 설명하고 차이점 기술

    SQLite에서 날짜와 시간 저장 방법 설명하기

    TimeZone tm = TimeZone.getTiemZone(“Etc/GMT-9”);

    TiemZone.setDefault(tmzone);

    System.currentTiemMills()

    New Java.util.Date()getTime()

    Cusor.getLong(xxx)

    New SimpleDataFormat(“yyyy-mm-dd HH:mm:ss”).format(datetime);


    Db.execuSQL(“update TABLE_NAME set COLUMN_NAME = datetime(‘now’) where …”);



       값을 가져오기 위한 일반적인 방법은
       Cursor row = databaseHelper.query(true, TABLE_NAME, new String[] {COLUMN_INDEX}, ID_COLUMN_INDEX + "=" + towid, null, null, null, null, null);
     
       String dateTime = row.getString(row.getColumnIndexOrTHrow(COLUMN_INDEX));

       // string
    으로 가져오기 위해서는 이 값을 로컬 형식으로 변화 하여야 합니다.
      DateFormat iso8601Format = new SimpleSDateFormat("YYYY-MM-DD HH:MM:SS");
      try {
         date = iso8601Format.parse(dateTime);
      } catch(ParseException e) {
         Log.e(TAG, "Parsing ISO8601 datetiem failed", e);
      }

      long when = date.getTime();
      int flags = 0;

      flags |= android.text.format.DateUtils.FORMAT_SHOW_TIME;
      flags |= android.text.format.DateUtils.FORMAT_SHOW_DATE;
      flags |= android.text.format.DateUtils.FORMAT_ABBREV_MONTH;
      flags |= android.text.format.DateUtils.FORMAT_SHOW_YEAR;

      String finalDateTime = android.text.format.DateUtils.formatDateTime(context,when    
                                                        +TimeZone.getDefault().getOffset(when), flags);

    배열 하나 주고 이들을 조합하여 출력하는 방법을 자바 코드로 작성하기

    System.arraycopy(src, pos, dec, pos, length)


    <v:imagedata data-blogger-escaped-o:title="175466144CC11C27552BBC" data-blogger-escaped-src="file:///C:\Users\joe\AppData\Local\Temp\msohtmlclip1\01\clip_image003.png"></v:imagedata>


    SparseArray<bitmap> _bitmapCache = new SparseArray<bitmap>();

    </bitmap></bitmap>

       private void fillBitmapCache() {

            _bitmapCache.put(R.drawable.icon, BitmapFactory.decodeResource(getResources(), R.drawable.icon));

            _bitmapCache.put(R.drawable.abstrakt, BitmapFactory.decodeResource(getResources(), R.drawable.abstrakt));

            _bitmapCache.put(R.drawable.wallpaper, BitmapFactory.decodeResource(getResources(), R.drawable.wallpaper));

            _bitmapCache.put(R.drawable.scissors, BitmapFactory.decodeResource(getResources(),

        }


    Bitmap bm = _bitmapCache.get(R.drawable.icon);


    int key = 0;

    for(int i = 0; i < sparseArray.size(); i++) {

       key = sparseArray.keyAt(i);

       // get the object by the key.

       Object obj = sparseArray.get(key);

    }


    ORM(Object Relational Mapping)의 정의

    데이터베이스 연계처리를 위하여 기존의 SQL에 의존하는 것이 아니라직접 테이블의 컬럼을 자바

    Class에 매핑하거나 XML형태의 SQL을 실행하여 처리를 수행하는 Persistence Layer를 담당하는

    Framework 개발모델


    Definitions of "strong" or "weak"[edit]<p></p>

    A number of different language design decisions have been referred to as evidence of "strong" or "weak" typing. In fact, many of these are more accurately understood as the presence or absence of type safetymemory safetystatic type-checking, or dynamic type-checking.


    느긋한 계산법 yield return;

    커링 – 함수(function)의 인자를 줄이는 것

    Concurrent

    continuations




    Interface call back


    Class Sum {

    Interface OnMaxNumberDb {

    Void onMaxNumber(int number, int exceed);

    }


    Private onMaxNumberCb myCallback;


    Public void setOnMaxNumberCb(OnMaxNumberCb callback) {

    MyCallack = callback;

    }


    Public int addNumber(int adder) {

    Number = number + adder;

    If(myCallback != null) {

    Ifif(number >= maxNumber) {

    myCallback.onMaxNumber(number, number-maxNumber);

    return number;

    }


    Sum total = new Sum();

    Sum.onMaxNumberCb call back = new Sum.OnMaxNumberCb() {

    Public void onMaxNumber(int number, int exceed) {

    Syso

    }

    }

    Total.setOnMaxNumberCb(callback);

    Hibernate는 객체 모델링(Object Oriented Modeling)과 관계형 데이터 모델링(Relational Data Modeling) 사이의 불일치를 해결해 주는 ORM(Object Relation Mapping) 도구입니다.



    다형성


                   

     객체지향개념에서의 다형성이란 '여러 가지 형태를 가질  있는 능력' 의미하며자바에서는  타입의 참조변수로 여러 타입의    참조할  있도록 함으로써 다형성을 프로그램적으로 구현하였다

    작성중

     

     

    OverLoading & OverLiding


                  

     오버로딩은 기존에 메소드의 인자를 이용하여서 하나의 함수에 여라가지 기능을 만드는  입니다.

     오버라이딩이란 상위 클래스에 있는 메서드와 똑같은 메서드를 하위 클래스에서 다시 만드는 행위를 말합니다 하위 클래스에서 메서드를 재정의하는 것을 말합니다.주로 생성자메소드를 정의할  많이 사용합니다.

     

     

    Stack , Q


                    컴퓨터의 알고리즘에서 가장 흔하게 사용되는 자료 구조가 스택과 큐이다

    .... 작성중

     

     

    JAVA 특징


                  

     Java언어의 특징은 플랫폼에 독립적인 객체지향언어라는 것이 가장 두드러지는 특징입니다.

    플랫폼에 독립적이라는 것은 리눅스,윈도우 등과 같은 개발환경에 제약을 받지 않고 어느 플랫폼에서나 코드의 호환성과 재사용이 자유롭다는 것을 의미합니다.

    JSP, 모바일서버네트워크프로그램소켓프로그램,  . . . . . . 

     

     

     

    가비지콜렉션 garbage collection ベジコレクション

                  

     가비지 컬렉션Garbage Collection이란시스템에서  이상 사용하지 않는 동적 할당된 메모리 블럭 혹은 개체를 찾아 자동적으로 다시 사용 가능한 자원으로 회수하는 것을 말한다시스템에서 가비지 컬렉션을 수행하는 부분을 가비지 컬렉터Garbage Collector라고 하며가비지 컬렉션은 약자로 GC라고 부르기도 한다.

    일반적인 가비지 컬렉터 알고리듬Algorithm 다음과 같이 동작한다.


    1.  이상 프로그램에서 사용하지 않을 개체Object 찾아낸다.

    2. 해당 개체가 사용하는 리소스를 회수한다.

    기술이론폴더 참조

    일본IT용어사전중

    ベジコレクションとは、OSのメモリ管理機能の一つ。プログラムが使用しなくなったメモリ領域や、プログラム間の隙間のメモリ領域を集めて、連続 した利用可能なメモリ領域を増やす技術。これが不完全なOSは次第に利用可能なメモリが減ってゆくため、一定期間ごとに再起動 を強いられることになる。Java言語の実行環境(JVM)は自身がガベジコレクション機能を持っており、Javaプログラマがメモリ管理に気を使わなくてもいいようにしている。

     

    [DB]Statement PreparedStatement 차이

                     정적 SQL 문을 실행해작성된 결과를 돌려주기 위해서(때문에사용되는 객체입니다.

    디폴트에서는,Statement객체 마다 1 개의ResultSet객체만이 동시에 오픈할  있습니다따라서, 1 개의ResultSet객체의 read다른 read 의해 끼어들어지면(), 각각은 다른Statement객체에 의해 생성된 것이 됩니다.Statement인터페이스의 모든 execution 메소드는문장의 현재의ResultSet객체로 오픈되고 있는 것이 존재하면그것을 암묵에 클로즈 합니다.

    관련 항목 : Connection.createStatement(),ResultSet

     

     Class diagram

                  

    클래스 다이어그램은 "클래스"라고 하는 객체지향 설계단위를 이용하여 시스템의 정적인 구조(모델) 표현한 것이다클래스 다이어그램은 분석설계구현  다양한 상황에서  사용목적에 맞게 입도를 조절하여 기술   있다.

    예제 : 스트럿츠의 클래스다이어그램

    クラス図 ( Class Diagram ) yahoo.co.jp검색 출처

    システムの構造及びオブジェクトの枠組みを静的に表現するための表記法。 処理をどのようにクラス分けするか、抽象クラスインタフェイスなどが明確になるため、 詳細設計の初期で使用されることが多い。

     

     Sequence diagram

                  

    작성중

     

     

    웹어플리케이션이 동작하는 방식을 설명해라.

                   


    WebApplication 대해서... 도쿄대 학술지인것같은데.. 야후재팬검색중 찾은것임

     Webアプリケションとは、Webバ上で動作するアプリケションのことを指します。ユザがサバ上のアプリケションからデタを 取り出す、あるいはアプリケションに対してデタを送信するために、Webのフレムワクが利用 されます。すべてのデタ、デタの処理プログラムはサバ上に置かれるため、基本的にはユザが特別なプログラムのインストルを行うことなく、WebブラウザさえあればWebアプリケションは 利用できます。


     現在、インタネットの上で行われている多様なサビスや商品の販売では、Webアプリケションが用いられています。いくつか  をあげてみましょう。GoogleYahoo!といった検索エンジンでは、サバに用意されたホムペジに関する膨大なデタベスから、ユザの入力したキドにマッチするものをプログラムが検索して 取り出し、HTMLに加工してユザに提示します。Amazon.comDellといった企業は、自社の扱う商品のデタベスをサバに置き、サバ側のプログラムがユザの要求に応じて商品情報を提示し、売買の契約を行い、発送処理まで行ないます。

    Webアプリケションを利用したサビスは、1990年代後半 に一般の人の生活に広く普及しました。こうした背景には、時間や場所の制約を受けずに自由にサビスの利用 やショッピングをできること、膨大な商品を揃えられること、個の要求に合わせたきめ細かなカスタマイズが可能であること、キドなどで商品の検索が容易に行えること、といった従来の店舗には

    Webアプリケションない魅力があげられます。

    また、こうしたWebアプリケションのメリットに目をつけたのは、一般の消費者を対象とした企業だけではありません。製造業などでの部品や資材の調達では、必要な仕様を満たす商品を 世界中のサプライヤから低い値段で購入する必要があります。こうしたB2B(Business to Business)の市場でも、Webアプリケションの提供する高率的 な情報共有機能が使われています。近年では、変化の激しい消費者の需要に合わせて、なるべく在庫を持たず必要な分だけ生産し無駄 をなくすことが必要と考えられています。販売店での消費者の購買トレンドの収集から、卸業者、メ、部品メが一体となって情報を交換する情報システムを 利用したSCM(Supply Chain Management)が注目されています。Webアプリケションはこういった場面においても重要な役割を果たしています。近年では、こうしたB2Bにおける企業間のデタ処理のさらなる自動化の枠組みとして、Webビスが注目されています。Webアプリケションのユザが人間であるのに対して、Webビスは計算機プログラムがユザとなります。

     

     

    EJB?

                   

     엔터프라이즈 자바빈즈(Enterprise JavaBeans; EJB) 기업환경의 시스템을 구현하기 위한 서버측 컴포넌트 모델이다, EJB 애플리케이션의 업무 로직을 가지고 있는 서버 애플리케이션이다. EJB 사양은 Java EE 자바 API  하나로주로  시스템에서 JSP 화면 로직을 처리하고, EJB 업무 로직을 처리하는 역할을 한다.

    http://ko.wikipedia.org/wiki/엔터프라이즈_자바빈즈

     

     

    MVC 패턴이란?

                    

     객체지향 설계를 처음 접하기 이전부터 MVC 모델에 대한 개념적인 지식은 한번쯤 접해 보았을 것입니다가장 기본적인 정의를 설명하자면 M( Mode ) Application Business Logic , 객체 또는 데이터의 가공을 책임지는 컴포넌트들의 집합체이고 C ( Control )이란 객체 또는 데이터의 흐름을 책임지는 컴포넌트 , V( View ) 객체 또는 데이터의 생성을 책임지는 컴포넌트로써 일반적으로 Data 입력 부분과 출력 부분을 담당합니다  참고자료링크

     


    MVCとは、ソフトウェアの設計モデルの一つで、処理の中核を担う「Model」、表示出力を司る「View」、入力を受け 取ってその内容に応じてViewModelを制御する「Controller」の3要素の組み合わせでシステムを実装する方式。

    メインの処理はModelに実装し、Modelは画面出力などは行なわない。処理結果はViewに渡され、画面表示などが行なわれる。ユザからの入力はControllerが受け 取り、何らかの処理が必要な場合はModelに依頼し、出力が必要な場合はViewに依頼する。

    このように、明確に機能ごとに分離することで、開発作業の分業が容易になり、また、互いに仕様変更の影響を受けにくくて済むようになる。

    もともと、Smalltalkでのグラフィカルインタフェス設計に用いられた概念で、最近ではJ2EEなど、エンタプライズシステムの開発などに応用される方法論である。

     

     

    어떤 웹어플리케이션 서버를 사용했나?

                  


     

     

    OOP에서 interface abstract class 차이점은?

                   

    16. 인터페이스와 추상 클래스

    [출처기술면접자료1 - JAVA기본기술이론부분|작성자 쪼꼬








    c c++ 차이점

     클래스  => opp언어

     절차지향, OPP(object oriented programming : 객체 지향 언어)

     -> 클래스자료형을 이용해 만드는 program


     -다형성

     객체지향개념에서의 다형성이란 '여러 가지 형태를 가질  있는 능력' 의미하며자바에서는  타입의 참조변수로 여러 타입의     참조할  있도록 함으로써 다형성을 프로그램적으로 구현하였다


    -오버로딩 오버 라이딩

    오버로딩은 기존에 메소드의 인자를 이용하여서 하나의 함수에 여라가지 기능을 만드는것 입니다

    오버라이딩이란 상위 클래스에 있는 메서드와 똑같은 메서드를 하위 클래스에서 다시 만드는 행위를 말합니다 하위 클래스에서 메서드를 재정의하는 것을 말합니다.주로 생성자메소드를 정의할때 많이 사용합니다.


     - 정적 변수지역변수전역변수를 스택과 힙과 관련에서 설명해보세요.

    전역변수는 프로그램에서 전반적으로  사용이 가능 함수 밖에서 정의해 놓으면 다른 함수에서도 사용할  있습니다.

    지역변수는 함수 안에서만 사용이 가능한 변수입니다다른 함수에서는 사용을 못하죠.

    정적변수는 한번 정의 하면  값은 계속적으로 메모리에 남아 있는 것입니다.

    프로그램이 종료할때 메모리에서 지워집니다.함수안에서 사용해도 함수가 끝날때 지워지지 않습니다


    - OSI 7 Layers 대한 질문 

    7계층응용 (application layer)

    6계층표현 (presentation layer)

    5계층세션 계층(session layer)

    4계층전송 계층(transport layer)

    3계층네트워크 계층(network layer)

    2계층데이터링크 계층(data link layer)

    1계층물리 계층(physical layer)


     - 회사나   궁금한 


     - 스터디 ONE 이라고 하셨는데 세미나를 해보신적이 있습니까?


     - 후배들에게 도움을 주고 계십니까?


     - WIPI 이용한 게임을 제작을 하셨는데 어떤 종류의 게임이며 코드 길이는 얼마정도 입니까?


     - 프로그램을 개발하는데 제일 중요한 것이 무엇이라고 생각합니까?

       보기 : 기획 설계 코딩


     - 학교에서 프로그래밍을 하는데 컴파일러를 어떤 것을 쓰십니까?


    - java 특징에 대해 말하세요.

    Java언어의 특징은 플랫폼에 독립적인 객체지향언어라는것이 가장 두드러지는 특징입니다.

    플랫폼에 독립적이라는 것은 리눅스,윈도우 등과 같은 개발환경에 제약을 받지 않고 어느 플랫폼에서나 코드의 호환성과 재사용이 자유롭다는 것을 의미합니다.

    JSP, 모바일서버네트워크프로그램소켓프로그램,


    - stack  Q 설명하세요.

    컴퓨터의 알고리즘에서 가장 흔하게 사용되는 자료 구조가 스택과 큐이다

    스택은 모든 작업이 리스트의 한쪽 끝에서만 수행되는 선형 리스트의  형태로리스트의 한쪽 (TOP)에서 원소를 삽입하거나 제거하는데 사용된다그러므로 리스트에서 스택에 마지막으로 입력된 원소가 제일 먼저 제거의 대상이 된다그래서 스택을 LIFO (Last In First Out) 라고도 한다

    큐에서 삽입은 REAR에서 이루어지고제거는 FRONT에서 이루어진다그러므로 큐에 A,B,C,D,E순으로 원소가 삽입되었다면제일 먼저 제거되는 원소는 A이다.


    - DB 경우 ERD 그려봤는지프로그램은 무엇을 사용하는지어느 정도 수준인지?

    Entity Relationship Diagram 약자로 개체관계도




    다음 용어들은 자바 기반 업종의 면접시 물어보거나 물어볼만한 질문들입니다.

    1.     ERP(Enterprise Resource Planning)
    전사적 자원 관리 시스템

    -기업의 모든 자원을 전체적으로 관리하여 최적화된 기업활동을 통합,관리 시스템에 근거하여 스피트경영과 투명경영의 효과를 꾀하는 

    2.     Framework 프레임워크(제가 생각하는 모범 답안은 Framework Library 비교하여 설명하는 것입니다.)

    특정 형태의 소프트웨어 문제를 해결하기 위해 상호 협력하는 클래스들과 인터페이스의 집합

    장점 - 재사용성단순성역할구분확장성유지보수용이

    프레임웍과 라이브러리 차이

      라이브러리는 어플리케이션에서 호출할  있는 함수와 루틴으로 구성되어 있고

      프레임워크는 어플리케이션에서 특정 기능들을 제공하기 위해 확장할  있는 일반적이고 상호 협력적인 컴포넌  트를 제공

    3.     Struts 스트러츠(Struts외에도 Spring, 하이버네이트  다양한 프레임워크가 존재하나 예로  3가지 정도의 프레임워크에 대한 특징과 MVC 모델에서 커버하는 부분을 키워드로 잡아서 설명하면   같습니다.

    컨트롤러에 강점이 있는 프레임워크의  종류

    단일 진입 서블릿을 사용하여 관리가 용이(커멘드패턴을 생각하면 )

    4.     Model 1 Model 2 차이점
    MVC 
    모델을 기준으로 설명

    5.     EJB
    최근에는 엔티티빈 대신 POJO 활용하는 측면이 강한데 이러한 경향은 객체지향적인 프로그램 기법을 적용하기 위한 방편이라는 것을 염두에 두고 세션 엔티티   메세지 드리븐   특징을 설명

    분산 객체기술에 기반을  컴포넌트 기술

    처리속도가 느림

    재사용성이 뛰어남

    개발 속도가 빠름

    구성

       홈인터페이스(빈의 생성과 소멸관련 작업

       리모트 인터페이스(비지니스 메소드 선언)

        클래스 - SessionBean(무상태 : 검색,계산  상태유지장바구니,회원관리)

                     - EntityBean: 데이터 처리

    o               - MessageDrivenBean : 비동기 메시지 통보

    6.     WAS (Web Application Server)역할과 대표적인 제품들을 나열하고 특징 설명

    7.     SAP솔루션 제품명이면서 기업명. ERP, CRM관련 전문 업체요점 정리.

    8.     String, StringBuffer, StringBuilder 차이점

    String클래스는 문자열을 추가할  내부적으로 StringBuffer클래스로 변환되어 처리됨.

    문자열의 변화가 많은 경우는 StringBuffer클래스가 빠름.

          StringBuffer를 사용하면 입출력 데이터를 읽는 양이 많고 처리시 속도가 빠름.

          StringBuilder StringBuffer 비슷하지만 수정 가능한 문자열을 작성할 때 수 있음.

    9. Java Servlet

     자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램

    10.오라클 인덱스

    인덱스데이터와 검색의 성능을 향상시키기 위해 만들어짐

               )부산의 위치가 어디있는지 모를경우(인덱스가 없을경우다 찾아봐야 되지만 인덱스가 있을 경우

                  부산시의 위치를 정확히 알게 되고 결국은 데이터 접근이 빠르다.

     11. 트랜젝션,롤백,커밋

     - 트랜젝션이란일련의 작업단위

        ACID(원자성,일관성,고립성,영구성)

        필요성 - 여러작업이 한 자원에 동시에 변경,참조가 필요한 경우

                    작업공정이 긴 경우


       - 트랜젝션의 시작

              DML(데이터조작어)구문이 실행될 때

             사용자가 SAVEPOINT를 설정할때

       - 트랜젝션의 종료

             커밋 수행

             롤백 수행

             DDL(데이터정의어),DCL(데이터제어어)이 실행될 때 오라클 내부에서 자동 커밋 수정

             사용자가 sqlplus를 종료할때

             시스템 크래쉬 발생

    커밋과 롤백 전

        롤백으로 데이터 회복가능

        현재 유저는 자신이 바꾼 데이터를 확인할 수 있다

        다른 유저에게는 바뀐 데이터 내용이 반영되지 않는다

        영향을 받은 레코든는 잠금상태

    -커밋 후

        데이터는 영구적으로 변경

        복구 불가능

        모든 유저에게 변경 내용이 반영

        해당 레코드의 잠금 해제다른 유저들이 다룰 수 있다

        세이브 포인트가 삭제

    -롤백 후

         데이터의 변경이 취소

         데이터의 이전 상태가 회복

         데이터에 대한 잠금이 해제

     12 조인문의 종류

        equi

        non-equi

        inner

        outer

        self



    'Objective-C, SQLite3' 카테고리의 다른 글

    [이전] 브런치 정리  (0) 2019.02.10
    러프한 요구사항 900만원 프로젝트  (0) 2019.02.07
    두번째 블로그의 마지막 글 모음  (0) 2019.02.05
    About VCS  (0) 2019.02.05
    github에 gpg 적용 완료  (0) 2019.02.05

    이제 모든 백업이 끝나고 드디어 하나를 삭제할 수 있게 되었다.




    korea blizzard want to control user experience ... is su**

    온라인 게임이나 앱 제공 업체 참 대단하다.


    Quest 라는 앱도 지네들 마음대로 삭제해 버리더니, 환불도 안해주고

    블리자드도 별거 없네. 어줍잖은 시스템 만들어서 입맛대로 계정 정지 ㅡㅡ;

    환불은 왜 안되는거야? 시스템상 건의를 아예 못하게 만들어놨다.



    1년간은


    https://www.facebook.com/pg/BlizzardKR/posts/

    https://www.youtube.com/user/BLIZZARDKOREA/videos/

    https://www.facebook.com/HearthstonekoKR

    https://www.youtube.com/Hearthstone

    https://www.instagram.com/playhearthstone/

    https://playoverwatch.com/ko-kr/

    https://www.facebook.com/OverwatchKR

    https://twitter.com/OverwatchKR

    https://www.youtube.com/OverwatchKR



    https://www.youtube.com/channel/UC-2wa6jvprl7hfCpvw0ULzg


    1년 후


    공정거래위원회

    한국 소비자원


    건의 문구


    미국에서 산 계정 정보에 제대로된 휴대폰 번호가 들어있는데, 인증 완료해도 계속 다시 완료하라는 시스템 오류 때문에 아예 건의를 못하게 되어 있네요.

    leon#15714 결제한 계정 전체 금액 환불 바랍니다. 1년 간 건의하고 다른 채널(공정거래위원회, 한국소비자원)을 통해 지속적으로 다시 건의토록 하겠습니다.


    토론장 건의 문구


    mynameis@hajunho.com 으로 지불된 60만원 전액 환불 바랍니다. 고객 센터는 연결 안됩니다. 지난 5년간 연결된 적 없구요. 미국 계정 관련해서 기술력이 없으면 제대로된 채널을 만들던지, 음성으로 욕한거에 대해서 필터링 안되면 어줍잖은 잣대 들이밀지 말던지 하셨어야죠. 1년간 여러 채널로 건의하고 소비자원, 공정거래위원회 等 환불 받을 수 있는 채널로 오래도록  권리를 주장하겠습니다.


    https://kr.forums.blizzard.com/ko/overwatch/u/leon-15714/activity



    ------------------ 유사 케이스 ------------------






    https://us.battle.net/forums/en/bnet/topic/20752676335






    이게 먼가요??

    어제 컴터 5번인가 6번인가 팅겨서 경쟁전 3시즌이 못하게 되었다고 뜨더군요.

    이것까진 이해했습니다.

    오늘 접속할려고 보니 겜접속이 아예안되네요?경쟁전뿐만 아니라 다른것도

    할수없다는건가요?

    그리고 이계정은 사용이 중지되었습니다. 이말뜻은 영구정지당했다는뜻인가요 먼가요?

    정확한 해답 바랍니다 정확한 해답없으면 환분 요청 하겠습니다.


    jhChart 만들기.


    하던거 잠시 접고.

    ~/Library/Developer/Xcode/DerivedData/mEnglish-forcxdbxmfxnbcdcstszxdakgmvd/Build/Intermediates/mEnglish.build/Debug/mEnglish.build




    아이디어 스케치.


    모든 비율은 0~1000 단위로 백분율이 아닌 만분율(0~10000)로 계산하고 기본 자료형은 CGFloat으로 함

    data는 plist type으로 함

    가장 큰 개념은 하나의 화면 UIScreen.main

    그 화면에서 여러 차트를 포함하는 scene이 있음 panel manager 쯤? 씬 매니저라고 하자.

    scene manager는 다양한 옵션을 줄 수 있도록 계속해서 고려해야 함.

    그래프는 scene manager에 의해 자동 변경 가능하거나, 수동 alignment 가능해야 함(pop-up 등에 재사용 목적)

    scene manager는 각각의 테마가 존재하도록! 배치 방식에 따라 뭔가 바뀔 수 있도록 해야함.(나중일이겠지)

    가장 큰 개념인 alignment manager 의 frame은 sceneframe 이라고 일단 명명, 설계하는데 용어 정의가 안되어 있으니 불편.

    sceneframe 내부의 그래프의 크기는 grapeframe 이라고 명명

    scene에는 graph를 add 할 수 있음.

    각 그래프는 독립적인 width, height를 가지고 width 의 경우 graphframe 중 가장 큰 width가 sceneframe의 width가 됨

    scene에 추가된 graph frame height를 모두 합한 값 + padding 값들이 scene의 height가 됨

    scene에 강제모드가 되면 scene 값이 graph에 따라 설정되지 않고 서버에서 내려주는 값으로 설정됨. 내부에 그려진 graph는 scene의 값에 따라 자동 조정. width의 경우 고정, height 의 경우 비율을 먼저 계산하고 비율값에 따라 자동 조정

    graph는 pixel로 그릴 수 있는 pixel 모드와 scene

    scene의 주요 값은 decodable 프로토콜을 이용하여 JSON serialization 가능토록 해야함

    기타 기능은 만들면서, 오픈소스는 아예 참조하지 말자. 처음부터 보면 비슷하게 갈 수 밖에 없으니까. - 물론, 나중에는 참조해서 더 좋게 만들어야지. 좋게 말하면 벤치마킹, 라스트 무버, 돌려서 까면 카피캣, 나쁘게 말하면 배낌. 실험해보니 swift 도 실수 오차가 있어서 결국엔 최고의 정밀도를 가진 그래프가 되지 않을까 싶다.



    https://github.com/hajunho/iOS_startUpCodes/tree/master/002/com.hajunho.swift-graph



    react 도입할 것인가 말 것인가...

    Android 7년하다 iOS 4년해서 그런지. 둘 다 아우르는 플랫폼을 늘 고민했었다.

    폰갭, HTML5와 그 친구들, apache cordova, ... 그 뒤에는 react에서 vue로 다시

    react로 대세가 넘어가듯 싶었는데 지금은 다시 native로 귀결되는 분위기.




    다음 책을 보았었다. 이 글은 그 후 5개월이 지난 시점이다.


    brew update

    brew upgrade

    brew install node

    brew install watchman

    brew install flow


    그런데 npm 이 안된다.

     # 내 경우 node와 yarn 이 둘 다 설치되어 있던 상태라, 옵션을 더 주었다. yarn 은 reinstall

    brew uninstall --ignore-dependencies --force node

    brew install node --without-npm

    brew reinstall yarn    

    yarn global add react-native-cli


    react-native init FirstProject

    yarn add instruments  #추가


    해당 프로젝트로 가서

    react-native init FirstProject


    이후 Xcode 에서 열고 실행하면 된다. 런타임에 최신 js 파일을 땡겨오고 실행된다.


    ㅡㅡ; 나중에 트러블 슈팅을 제대로 하려면 관련 구조를 다 파악해야 겠구나 하는 생각이 든다.


    환경은 갖춰졌으니 신나게 개발.


    후(1달여)


    느낀점.


    그냥 native  해야 겠다.


    ---- 그리고 5개월 지난 시점.

    간단한 것은 react로 짜서 연결해도 되겠지만 여전히 native가 짱.



    JAVA SCRIPT를 벗어날 순 없구나.

    아무리 iOS native 를 한다지만 WEB를 벗어날 수 없다.(약관 같은 웹뷰 때문이라도...)



    자바 스크립트 시온은 여기.


    해당 사이트의 Standard 탭을 이용하면 각 표준 문서를 만날 수 있다.


    올해 6월까지 따끈한 개정판 9까지 나왔다.



    file 다루기


    fileKit을 이용한다.

    메뉴얼

    iOS 디렉토리 구조


    'Objective-C, SQLite3' 카테고리의 다른 글

    러프한 요구사항 900만원 프로젝트  (0) 2019.02.07
    프로그래밍 면접 질문  (0) 2019.02.05
    About VCS  (0) 2019.02.05
    github에 gpg 적용 완료  (0) 2019.02.05
    github issue format  (0) 2019.02.05

    Version Control System을 CVS 때부터 SVN, GIT까지 10년이 넘게 쓰고 있는데 아직 잘 모르겠다. 이전 직장에서는 SVN을 썼고, 학창 시절에는 CVS를 썼다. 삼성전자 선임 연구원(구미 때, 수원 와서는 종기원 때문에 걍 '선임' ㅋㅋ 웃긴다 너네.) 재직 시절에는 perforce를 쓰다가 아랫단 할 때는 git을 썼다(커널은 다 git으로 하니까... 어쩔 수 없었던 거지)


    git 쓴지도 10년이 되었는데 sourceTree 쓰기 전에 command로 하다가 아틀라이시안이 IPO를 하고 난 뒤로부터는 소프트웨어가 썩어서(지금은 괜찮다.) 온갖 에러가 낫기에 github 제품으로 갈아탔었었다. 아마 그 시절 썼던 엔지니어는 알겠지만 github에서 제공하는 건 더 썩었었음 ㅡㅡ;


    결국 command로 할 수밖에 없었고, https는 제대로 동작하지 않아서 모두 ssh로 했다. sourceTree에서도 여러 브랜치를 따고 합치는 과정에서 꼬임이 많아서 터미널 열고 command를 입력하며 썼다.


    git 책도 잠깐 봤지만 10년이 지나 기억나고 잘 쓰는 것은 결국 

    git init, checkout, add, pull, push 등이 전부.


    머지맨(대기업에서 수천 명이 동시 작업할 때면 각 부서마다 머지맨이 있다) 체리픽이나 오토머지 resolve 등도 꽤 다양하게 썼었던 것 같은데 기억에 별로 남은 게 없다. 그 당시에 책을 써 뒀으면 추억이나 남았을 텐데... 그 당시 VCS가 개인에게는 그리 대중화되진 않았으니 팔리진 않았겠지


    지금은 집에서 혼자 작업할 때도 git을 쓴다. 


    사실 가장 편한 것은 SVN이다. visual SVN 무료 서버가 워낙 강력하고 로컬에 구축할 수 있어서 빠르다. ETRI 강의할 때도 외부 인터넷이 막혀 있으니 visual SVN 서버를 구축하고 그쪽으로 과제를 받거나 자료 공유를 했었다. 공유폴더 보다 안정적이고... 맥에도 smartSVN이 있어서(유료) 토터스SVN 클라이언트 만큼 편리하게 쓸 수 있다. 물론, 토터스가 10배 편하다.


    전 직장에 만 3년 정도 몸 담고 있을 때 GIT으로 바꾸려고 하다가 결국 github.com 에 소스를 줄 수 없다는 결정 아래 SVN과 GIT을 같이 쓸 수밖에 없었다. 뭐, 불편하긴 했지만 git과 svn을 쭉 쓰면서... 분명한 장단점이 있고, SVN도 충분히 괜찮다는 것을 알 수 있다. github.com이 visual SVN Server처럼 로컬용 서버를 배포하면 좋겠지만 구글도 구글 데스트탑 배포 했다가 너무 강력해서 서비스를 접어버리고 Enterprise용만 제공하다가 그마저도 이제 막는 것을 보면, 결국 git은 visualSVN 처럼 원클릭으로 편하게 구축하고 마우스로 상황을 체킹 하지는 못한다. 수동으로 해줘야 할게 많고, 자본주의 사회에서 편하게 되리라는 것은 요원하다.


    그냥 그렇다고.


    간간히 이렇게 썰을 푼다. 난 집에서 visual svn 서버 쓰고, github의 private 저장소도 쓴다. bitbucket을 오래 썼었는데 IPO 하고 난 뒤에 무료 저장 공간은 무지하게 느려져서 못 쓸 수준이었다.


    혹시, SVN 다음에 GIT이 나왔다고 GIT만 쓰시는 분은 집에 SVN 설치하고 그 편안함에 녹아들었으면 한다. bizspark의 도움으로 마소의 VCS도 써봤는데, 그래프로 나와서 좋았고 칸반이나 간트차크도 계속 들어가서 좋았다. 그러나 그 좋은 점도 단점이 되는 게 최근 github에도 trello와 같은 기능이 들어간 것을 보면서, 경쟁 때문에 계속 다른 서비스를 통합하는 것이 과연 편리한 일일까 하며 고민을 해 본다. 물론, 경쟁이 있어 나 역시 3년 쓴 트렐로 골드를 버리고 github 것을 쓰려고 하다가 로컬용 찾게 되었다. 로컬용이 없어서 트렐로의 모든 자료를 구글 드라이브에 올리는데 1달 걸렸다. 구글 드라이브는 완전히 다른 프로젝트 관리 패러다임이지만 워낙 검색 능력이 뛰어나서 사실 규정되지 않는 개발 방식이며, 이론적으로 이름이 없다고 해도 분명 더 편리하다. trello 도 검색 기능이 꽤 뛰어지만 PDF나 파일 내용까지 검색되는 구글과는 사뭇 다르다. 물론, 구글은 내 자료를 가지고 열심히 비즈니스를 만들어 가겠지만 모두의 편리함을 계속 추구하고 도전하니 아직은 괜찮다.


    다시 git으로 돌아와서

    branch 기능은 편리하지만 많은 사람이 같이 작업하는 경우 결국 한명이 소스를 모두 파악하고 "머지맨"이 될 수 밖에 없다. 혼자 작업하고 브랜치 아웃되었다가 합쳐지는 경우 아무런 문제없이 잘된다. 그러나 그 외의 경우 기능을 안다고 해도 수많은 에러와 싸운다. 물론, 이런 경험은 git을 더욱 강력하게 만들겠지만 해당 부분을 매우 중시하는 기업 소속이라면 git 책 하나 사서 매일 연습하는게 맞고, 그게 아니면 .ssh, config, key에 대해서 이해하고 명령어 몇개만 쓰는게 맞는 것 같다.


    이상, git 매거진을 하나 만들까 하다가 접는 이유를 의식의 흐름대로 써 보았다. 나름 뇌는 거친 듯. 아닐수도

    내가 perforce를 계약한 것은 아니지만 1인당 40만원 정도라고 들은 적이 있다. 머지툴도 내장되어 있고 정말 많은 사람들이 동시작업해도 잘 동작하는 것을 수년간 경험했을 때 큰 기업이 된다면 한번 써볼만한 툴인 것 같다. 나 관계자 아님



    'Objective-C, SQLite3' 카테고리의 다른 글

    프로그래밍 면접 질문  (0) 2019.02.05
    두번째 블로그의 마지막 글 모음  (0) 2019.02.05
    github에 gpg 적용 완료  (0) 2019.02.05
    github issue format  (0) 2019.02.05
    인터넷 안되는 곳에서 강의 준비  (0) 2019.02.05

    error: gpg failed to sign the data

    fatal: failed to write commit object


    killall gpg-agent


    and then type the password again.



    메뉴얼은 인터넷에 많으니, 경험을 끄적여 놓아 본다. , 이제 경험주의자에 기록주의자니까.


    gpg 프로그램이 없으면

    brew install gpg


    gpg 키 만들기

    gpg --full-generate-key


    엔터치다가 엔터치고 막판에 O 치면 된다.


       (2) DSA and Elgamal

       (3) DSA (sign only)

       (4) RSA (sign only)

    Your selection? 1

    RSA keys may be between 1024 and 4096 bits long.

    What keysize do you want? (2048)

    Requested keysize is 2048 bits

    Please specify how long the key should be valid.

             0 = key does not expire

          <n>  = key expires in n days

          <n>w = key expires in n weeks

          <n>m = key expires in n months

          <n>y = key expires in n years

    Key is valid for? (0)

    Key does not expire at all

    Is this correct? (y/N) y


    GnuPG needs to construct a user ID to identify your key.


    Real name: Junho

    Email address: mynameis@hajunho.com

    Comment:

    You selected this USER-ID:

        "Junho <mynameis@hajunho.com>"


    Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O



    github에 등록할 키를 뽑아내려면, 등록한 이메일을 이용한다.


    gpg --armor --export mynameis@hajunho.com

    -----BEGIN PGP PUBLIC KEY BLOCK-----


    mQENBFu7KQEBCADneTgQIsWBcbNiazoYekGIJ5yBjyrkMYpKecVmi7Rk949bW6Iy

    2+SQyM6WCPjmOkmViMMYM4/rImDE4p/4nQAXcfkChHuvRxJmhUE3WUR1rQyVo57s

    ...


    -----END PGP PUBLIC KEY BLOCK-----


    이메일 말고 키 아이디를 이용할 수도 있다.

    gpg --list-secret-keys --keyid-format LONG                           

    sec   rsa2048/CD548CDB9E8CD4F1 2018-10-08 [SC]


    처음 등록하고 나니 깃헙에서 unverified 로 나왔다.

    GPG key ID: CD548CDB9E8CD4F1


    이메일을 여러개 쓰고 있었는데 그 중 하나가 github에서 인증을 받지 않아서였다.

    인증받고 나니 녹색 Verified 가 찍힌다. 다만 이미 commit 된 녀석은 바뀌지 않았다.

    새롭게 commit 할 때만 Verified가 되었다.


    그 외 몇가지.

    Xcode에서 gpg 사이닝한 것이 commit이 잘되는데 sourceTree에서 되지 않았다.

    그러나 소스트리에서 여는 터미널에서는 또 된다. 소스트리의 GUI가 gpg 관련 설정을 

    오버라이드 하는 것 같은데, 여전히 내 repository 설정은 grey(disabled) 스택 오버 플로도 별 도움이 안되었다.

    커밋은 항상 Xcode에서 하니 걍 내버려 둠.


    글로벌은 모두 적용하고,

    git config --global commit.gpgsign true

    로컬은

    git config commit.gpgsign false

    적용 안하는 프로젝트가 생긴다. github외 따로 만들어 두는 git 저장소를 이용할 때 지원을 안해서 ㅠ


    얜 뭔지 모르겠다.

    export GPG_TTY=$(tty)


    트러블 슈팅할 때 전혀 도움이 안되었다.

    그에 반해 얜

    GIT_TRACE=1 git commit -m "gpg test"

    디버깅할 때 너무 좋았다.


    git config --global gpg.program gpg

    gpg도 있고 gpg1도 있는데 잘 설정하길.


    요것도 잘 썼다.


    $ git config user.email mynameis@hajunho.com

    $ git commit --amend --reset-author

    git commit --amend updates your last commits


    그리고 trace 할 때 gpg1으로 잘했었는데 결국 gpg로 설정해서 잘되더라.

    trace: run_command: gpg1 --status-fd=2 -bsau 'Junho HA <mynameis@hajunho.com>


    7~8년 전 Email 담당할 때 gpg를 했었는데, 코어는 다 까먹고,

    지금은 걍 깃헙의 Verified를 위해 툴 사용만 하는 수준이다.

    sourceTree가 버전 업이 좀 되면 편리하게 지원하지 싶다.




    'Objective-C, SQLite3' 카테고리의 다른 글

    두번째 블로그의 마지막 글 모음  (0) 2019.02.05
    About VCS  (0) 2019.02.05
    github issue format  (0) 2019.02.05
    인터넷 안되는 곳에서 강의 준비  (0) 2019.02.05
    필카와 디카 차이  (0) 2019.02.04

    ## **Symptoms**

    마그넷 입력 후 파일 전송이 안됨

    ## **Cause**

    분석중

    ## **Resolution**

    찾는중

    ## **For more information**

    특징점 없음

    'Objective-C, SQLite3' 카테고리의 다른 글

    About VCS  (0) 2019.02.05
    github에 gpg 적용 완료  (0) 2019.02.05
    인터넷 안되는 곳에서 강의 준비  (0) 2019.02.05
    필카와 디카 차이  (0) 2019.02.04
    C & JAVA 공통점  (0) 2019.02.04

    우분투에서 시뮬레이터를 이용, ARM 크로스 컴파일러를 공부해야 하는 경우.

    보안과 비용을 고려하는 비슷한 상황(인트라넷only)의 학교에서 도움이 될랑가?


    1. VisualSVN Server를 설치하고 TortoiseSVN Client를 각 컴퓨터에 설치하여, 자료를 주고받는다. GIT의 개념을 가르치기에도 좋고, NetBeui(NetBios, 공유폴더) 방식보다 낫다.


    이후 sudo -s로 진행 

    2. 우분투 설치 패키지 준비

    apt-get install dpkg-repack 

     vim 의 경우 

    dpkg-repack vim 

    으로 deb package를 만들 수 있다. 다른 컴퓨터에서는

    dpkg -i vim_8.0.1453-1ubuntu1_amd64.deb

    로 설치


    deb 패키지 설치는 다음과 같이 진행된다.

    설치 시작 -> unpack(dpkg --unpack) -> configuration(dpkg --configure) -> 설치 완료

    해당 패키지가 제대로 설치되었는지는 dpkg -s <pkg name> 으로 확인 가능

    Status: install ok installed 문구가 있으면 완료


    현재폴더에 .deb의 압축을 풀려면

    dpkg -x <pkg name> ./

    으로 푼다. 

    설정까지 보고 싶다면,

    dpkg-deb -R <pkg name> 블라블라폴더

    pkg로 리빌드 하려면

    dpkg-deb -b 블라블라폴더 <pkg name>


    추가로

    dpkg -I <deb file name> : deb file(패키지)의 정보,  패키지 네임 인자를 더 주면(한 칸 띄워서 찾을 패키지 적으면) grep을 걸지 않고 바로 패키지 이름을 써서 필터링이 가능


    dpkg -L <pkg name> 혹은 dpkg -c <deb file name> : 관련 폴더, 파일

    dpkg -C : 설치 中 중단된 패키지 목록

    dpkg -r 혹은 dpkg --purge : 패키지 삭제

    dpkg -S <search file name> : 설치된 패키지에서 해당 파일 이름이 들어간 폴더/파일 검색


    3. ARM 빌드 준비

    apt-get install emdebian-archive-keyring libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi gcc-arm-linux-gnueabi gcc-arm-linux-gnueabi g++-arm-linux-gnueabi u-boot-tools libncurses5-dev ddd qemu


    빌드 & 실행

    arm-linux-gnueabi-gcc -static a.c

    qemu-arm ./a.out


    4. REPACK!


    dpkg-repack emdebian-archive-keyring libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi gcc-arm-linux-gnueabi gcc-arm-linux-gnueabi g++-arm-linux-gnueabi u-boot-tools libncurses5-dev ddd qemu


    root@ubuntu:~/dpkg# ls

    binutils-arm-linux-gnueabi_2.30-20ubuntu2~18.04_amd64.deb

    ddd_3.3.12-5.1build2_amd64.deb

    emdebian-archive-keyring_2.2_all.deb

    g++-arm-linux-gnueabi_7.3.0-3ubuntu2_amd64.deb

    gcc-arm-linux-gnueabi_7.3.0-3ubuntu2_amd64.deb

    libc6-armel-cross_2.27-3ubuntu1cross1_all.deb

    libc6-dev-armel-cross_2.27-3ubuntu1cross1_all.deb

    libncurses5-dev_6.1-1ubuntu1.18.04_amd64.deb

    qemu_2.11+dfsg-1ubuntu7.4_amd64.deb

    u-boot-tools_2016.03+dfsg1-6ubuntu2_amd64.deb


    결론, (완벽히)안된다. 

    repack 되어도 뭔가 꼬이나 봄. vim 같이 작은 유틸은 잘된다. 결국, 인터넷 테더링으로 잠깐 해결했다.

    이후 문제는 강사컴만 인터넷이 되기에 LAN CARD의 MAC Address 복제가 되는 DLink의 DIR-825 무선공유기를 이용하여 보안 Skip. 무선 동글은 각자 알아서~ 단, SVN 서버는 학생 컴터에 재구축.


    'Objective-C, SQLite3' 카테고리의 다른 글

    github에 gpg 적용 완료  (0) 2019.02.05
    github issue format  (0) 2019.02.05
    필카와 디카 차이  (0) 2019.02.04
    C & JAVA 공통점  (0) 2019.02.04
    홈페이지 개편  (0) 2019.02.04


    아련함.





    필카도 어차피 컴퓨터 모니터를 통해 보는 거라면 3 원색으로 표현 못하는 색감이 표현될 리가 없다. 그러나 다르다. 3 원색으로 표현 못하는 색이 있다. 그러나 모니터에 모든 색상의 주사선을 넣어서 만들 수 없다. 비싸서.


    잘 만들어진 3D 그래픽은 빛줄기 하나하나 따라가면서 처리한다. 그러나 3 원색 표현의 한계가 있다. 아무리 깨끗한 3D 텍스쳐를 보아도 현실과 이질감을 느낄 수밖에 없다. 필카던 디카던 결국 지금 포스팅에서 보는 화면은 3 원색으로 구성한 색감을 보는 것이다.





    그러나 필카는 현실 느낌이 난다.





    구닥같은 앱이 필카의 느낌과 감성을 많이 따라갔었지만, 확연히 다르다. 빛바랜 느낌 나는 필터를 좋아해서 6개월간 썼었는데 뭔가 아쉬운 게 있었다. 아마 꼭 집어서 말할 수는 없지만 필카 사진을 접했던 분들은 분명 다르다고 생각할 것이다. 부모님의 빛바랜 사진이 주는 아련함 역시 표현 못하는 감성이다.





    나 역시 디지털로 모든 것을 구현하는 일을 하고 있지만, 결국 내가 하는 일은 엉뚱한 짓인지도 모르겠다.


    물론, 이 모든 것은 개인 느낌이요, 개인 의견이다.





    필카 사진들...





    ....





    그리고 디카








    'Objective-C, SQLite3' 카테고리의 다른 글

    github issue format  (0) 2019.02.05
    인터넷 안되는 곳에서 강의 준비  (0) 2019.02.05
    C & JAVA 공통점  (0) 2019.02.04
    홈페이지 개편  (0) 2019.02.04
    아마존 오로라 사용기  (0) 2019.02.04

    객체지향 언어라는 공통점을 가지고 있는 씨뿔뿔과 자바의 공통점을 찾기는 어렵지 않습니다. C와 JAVA의 공통점을 하나하나 짚어보면서 다른 프로그래밍 언어의 공통점을 알고 소통하는 프로그래밍을 해 보도록 합시다.


    Null Pointer Exception


    C는 포인터를 가지고 있습니다.


    #include <stdio.h>




    void main() {


                 int *s = NULL;


                 *s = 8;   


    }





    이는 다름과 같이 Null Pointer Exception을 일으킵니다.



    JAVA의 창시자인 James Gosling 의 저서 [The Java Language Specification] Chapter 3. Lexical Structure에 전 세계 언어를 지원하는 UTF-16 이야기가 나옵니다. 이에 한글로 클래스 명을 작성하였습니다. 변수, 메서드 역시 한글 사용이 가능합니다.                    

    package javatest;



    public class 널포인터익셉션 {


               public static void main(String [] args) {


                         Object s = null;


                         System.out.println(s.getClass());


               }


    }


    이 프로그램을 실행시킨 결과는 다음과 같습니다.


    Exception in thread "main"   java.lang.NullPointerException


                 at javatest.널포인터익셉션.main(널포인터익셉션.java:6)



    java.lang.NullPointerException 이라고 되어 있습니다. 포인터가 없는 언어인데 왜 Null Pointer라는 표현을 쓸까요?


    자바 언어의 소스 코드 중 JavaExceptions.c 파일을 보면


    jthrowable


    createThrowableFromJVMTIErrorCode(JNIEnv * jnienv, jvmtiError   errorCode) {


        const char *   throwableClassName = NULL;


        const char *   message            = NULL;


        jstring   messageString           = NULL;




        switch ( errorCode ) {


            case   JVMTI_ERROR_NULL_POINTER:


                      throwableClassName = "java/lang/NullPointerException";


                    break;





    errorCode가 JVMTI_ERROR_NULL_POINTER 일 때 NullPointerException 메시지를 출력합니다. 


    C에서 NULL은 0입니다. JAVA에서는 무엇일까요?


      NULL_CHECK(e,   JVMTI_ERROR_NULL_POINTER);




    NULL_CHECK를 0인지 아닌지로 판별하고 있습니다. 역시 0입니다.


    #define NULL_CHECK0(e) if ((e) == 0) return 0


    #define NULL_CHECK(e) if ((e) == 0) return



    언어적 철학으로는 NULL(C11), null(JAVA), nil(Objective-C), nullptr(Visual C/C++) 등 다양하게 표현하고 있지만 실상은 모두 0입니다. 개념 분리를 위해 각 언어들이 노력하지만 단순히 ‘없다’는 표현이 맞고, 0과 1의 컴퓨터 세계에서는 0으로 이해하는 것이 다양한 프로그래밍 언어를 이해하는 첫걸음입니다.


    'Objective-C, SQLite3' 카테고리의 다른 글

    인터넷 안되는 곳에서 강의 준비  (0) 2019.02.05
    필카와 디카 차이  (0) 2019.02.04
    홈페이지 개편  (0) 2019.02.04
    아마존 오로라 사용기  (0) 2019.02.04
    이전 for organic searching  (0) 2019.02.04




    지난 글 남겨둔다.


     안녕하세요? 하준호입니다.

    저를 설명해 주는 것은 다음과 같습니다.

    ♬ 제 가족은 소라, 소율입니다.

    ♬ 친구는 종우, 종완, 동민, 성환, 재환, 승오, 주영, 유황, 윤호, 형민, ...

    ♬ 존경하는 선배는 영하선배님, was 박상원 선배 for 10y.

    ♬ 후배는 동수, 태권, 한기, ... was 지현, 현동 before Retrica.


    ♬ 관심 분야는 아이폰, 윈도우, 리눅스, FreeRTOS, Assembly, C/C++, JAVA 관련 개발

       그러나 계속 바뀌고 있습니다. 이제 내일모레 40이라 하나 고르려고 해요. 개발자로 남고 싶어서...

    ♬ marlboro, parliament,... 술 먹고 사고 치는 것보다 담배가 낫다고 생각합니다.

    ♬ Overwatch, Clash of Clans, Clash Royale을 사랑합니다.


    ♬ 양자 컴퓨터 이전의 프로그래밍 언어는 다 거기서 거기지만 C/C++이 가장 강력하다고 생각합니다.

    ♬ 그러나 잘하고 싶은 언어는 SWIFT예요. 이유는 다른게 지겨워서...

    ♬ 만들고 싶은 것은 "더럽게 번 돈 필요없고 진정한 자유 있는 자본주의/민주주의 세상"입니다.


    Hello, This is Junho || joe || frank || eddie...

    Those names are not what I am. It's just a pointer to indicate me who is an object in real world.

    I don't know who I am, too.


    The LINK Concept that I've invented in my book named of OLPP is the best way to know what I am.

    My products, Relationship, Family, Hobby, ... are member variables of my Object. 

    Programming is the same as the real world life.


    훗 날 부끄럽겠지만, 기록은 중요하니까.



     주말에 시간이 남아서 홈페이지를 개편했다.

    깨진 링크를 복구하고 블로그를 지금 최신 블로그로 바꾸었다.

    Permanent SEO-safe 301 redirect from HTTP to HTTPS 

    를 적용하여 http로 접속해도 https로 접속하도록 했다.


    도메인도 정리를 했다.


    triplej.info

    swift3d.org

    .

    .

    .


    사업을 했거나 앞으로 사업할 도메인을 모두 없앴다.


    18년 동안 도메인 유지 비용에 쓴 돈을 보니,


    Funds Summary

    Total Receipts:USD 846.84


    100만원 가까이 된다. 물론, 구글 포함 기타 호스팅 비용은 제외한 금액이다.


    앞으로는 hajunho.com 만 유지하고 이 블로그만 할 예정이다. 


    대부분의 글은 바로 쓰고 퇴고를 해야 하는 글은 brunch에 초고를 쓰고, 여기에 옮기는 식이다.


    물론, brunch에서는 일정 기간 후에 삭제한다.


    그 외 사업한다며 도메인 포함 2000만원 정도를 써 본 결과,


    사업의 시작과 끝은 돈 벌어도 변하지 않는 사람과 해야 한다는 결론에 도달했다.


    그런 사람은 가족 포함하여 인생에 몇 번 만날까 말까한 정도기 때문에


    그냥 개인 이름으로 온라인 활동하기로 했다.


    다른 모든 서비스도 마찬가지다. 


    도찐개찐이니 그냥 블로그로 돌아왔고, 2008년부터 썼었던,


    예전 블로그에 3000개의 글은 다시 재정리 해서 올리고 지울 예정이다.




    'Objective-C, SQLite3' 카테고리의 다른 글

    필카와 디카 차이  (0) 2019.02.04
    C & JAVA 공통점  (0) 2019.02.04
    아마존 오로라 사용기  (0) 2019.02.04
    이전 for organic searching  (0) 2019.02.04
    2017년  (0) 2019.02.04



    RDS를 쓰는 회사에서 개발하는 제품에 물리 서버를 이용하지 않는다면 아마존이 최선이 선택일 것이다. 전력량, 온/습도, 하드디스크 수명 관리 등을 안해도 될거라 생각하니 좋았다. NoSQL이던 RDBMS던 CRUD(Create, Read, Update, Delete)가 전부인 DB 세상이고 로드벨런싱과 보안계획/실행, 스케일링은 혼자 하기 힘드니까 계속해서 서버 구축하지 말자는 판단. 서버실 공간도 없고, 추가 전기 공사에 회사 이전 계획까지 겹친 것도 한 몫. 우선 DB 서버 부터... 초창기에는 비용도 저렴한 클라우드로 가자고 생각했다. 다들 따져보면 결국, 선택은 AWS RDS. 애저와 구글 클라우드를 이용해 보았으나, 수년 뒤 2018년에 결국 아마존으로 가게 되어 있다고 생각한다. AWS EC2에 우분투가 아닌 아마존 리눅스 기반에 mysql 설치하고 서비스를 만들고 잘 사용했으나, DB 서버는 분리하는게 당연한 지라 AWS RDS로 갈 수 밖엔.




    우선 RDS로 오로라를 쓰는 이유



    MySQL로 하고 싶지만 아래 AWS RDS 소개글을 보면 Aurora를 쓸 수 밖에 없게 만든다. 물론, 앞으로도 자사 솔루션을 더욱 강화할 것임은 당연지사




    MySQL & Aurora


    MySQL은 전 세계에서 가장 많이 사용되는 오픈 소스 데이터베이스입니다. RDS에서 MySQL은 데이터베이스의 컴퓨팅 리소스 또는 스토리지 용량을 쉽게 확장할 수 있는 유연성을 갖춘 MySQL 커뮤니티 에디션의 풍부한 기능을 제공합니다.


    최대 16TiB 크기의 데이터베이스를 지원




    Amazon Aurora


    Amazon Aurora는 MySQL 및 PostgreSQL 호환 엔터프라이즈급 데이터베이스입니다($1/일 미만부터 시작). MySQL의 최대 5배 처리량, PostgreSQL의 최대 3배 처리량





    자세한 정보는


    https://aws.amazon.com/ko/blogs/korea/databaseintroducing-the-aurora-storage-engine/

    Amazon Aurora Storage 엔진 소개 | Amazon Web Services

    Amazon Aurora는 re:Invent 2014에서 발표한 이후, 2015년 7월에 정식으로 출시 및 2016년 4월 1일 서울 리전에 출시함으로써 국내외 많은 고객들이 RDBMS가 필요한 워크로드에 이미 도입을 하였거나 현재 도입을 고려하고 있습니다. Amazon Aurora는 AWS 역사상 가장 빠른 성장세를 보이고 있는 서비스 입니다. Amazon Aurora의 빠른 성능과 안정성을 지원하는 핵심인 Aurora 스토리지 엔진에 대한 좋은 블로그

    aws.amazon.com





    Aurora에서 개발용으로 MySQL 5.6.10a와 호환 가능 으로 하여 t2.small로 맞추었다. 개발용으로 만든 EC2 t2.large 인스턴스가 한달에 30만원씩 나오는 것을 보면 AWS 계산기가 제대로 동작 안하는 것 같다.


    https://calculator.s3.amazonaws.com/index.html

    Amazon Web Services Simple Monthly Calculator



    calculator.s3.amazonaws.com


    Estimate of your Monthly Bill ($ 45.90)월별 추정 요금


    인데 RDS 생성 메뉴에 나오는 가격은


    DB 인스턴스


    45.99 USD


    합계


    45.99 USD


    이다. 다르다. 0.09라도 다른 것은 다르다. 네트웍 I/O던 내부 I/O 던 관련이 없어 보이는데 말이다.


    게다가


    Storage 를 20->10으로 바꾸면 비용이 줄어야 할 텐데 오히려 는다. Estimate of your Monthly Bill ($ 46.01) 40으로 늘이면 당연히 는다. Estimate of your Monthly Bill ($ 48.30)





    삼성전자 재적시절 유럽시장 SEAndroid 텍스트 로그만 받는데 월 300 만원씩 나간 것을 보면, 추정은 추정일 뿐 일단 사용해 보는 것이 정답임을 이미 알고 있기에 비용 딴지는 그만. 믓튼, 월 5만원에 개발용 서버 사용이 가능하다. 역추척은 서비스는 켜야 한다. $ 4.42 USD/월 추가된다.





    만들고 나서 mysql workbench로 접속해 본다.


    https://dev.mysql.com/downloads/workbench/

    MySQL :: Download MySQL Workbench



    dev.mysql.com


    https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.Aurora.html#CHAP_GettingStarted.Aurora.Connect

    DB 클러스터 생성 후 Amazon Aurora DB 인스턴스의 데이터베이스에 연결하기 - Amazon Relational Database Service



    docs.aws.amazon.com


    카싼드라가 사용자 편의성을 위해 CQL로 추상화 했듯이,


    AWS 오로라 DB도 그냥 mysql 이라고 생각하고 쓰면 되겠다.




    2. 마이그레이션


    기존 데이터를 가져오는 것도 자료가 많아 좋았다.





    https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.External.Repl.html

    Replication with a MySQL or MariaDB Instance Running External to Amazon RDS - Amazon Relational Database Service



    docs.aws.amazon.com





    https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.html

    Restoring a Backup into an Amazon RDS MySQL DB Instance - Amazon Relational Database Service



    docs.aws.amazon.com


    https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.External.Repl.html

    Replication with a MySQL or MariaDB Instance Running External to Amazon RDS - Amazon Relational Database Service



    docs.aws.amazon.com


    물리서버가 아니라 마음이 참 편하다. 결론은 돈이 좋다고 해야 하는 건가.

    'Objective-C, SQLite3' 카테고리의 다른 글

    C & JAVA 공통점  (0) 2019.02.04
    홈페이지 개편  (0) 2019.02.04
    이전 for organic searching  (0) 2019.02.04
    2017년  (0) 2019.02.04
    make mrproper  (0) 2019.02.04

    [ 이전] 레드마인 보다는 깃헙 이슈 관리가 편리함


    레드마인도 괜찮긴한데 깃헙이 더 편리한 이유는 소스 코드로 바로 갈 수 있기 때문.


    그러나 SVN에 비해 느리고,


    대용량은 git lfs를 이용. 그리고 소스트리나 깃헙용 GUI 툴보다의 버그들 때문에

    결국은 command 만 이용하게 된다는 점을 고려했을 때

    가장 편리한 점은 웹base라 어디서든 접속 가능한데 있을 것이다.




    일을 즐기는 자들의 재택 근무의 문화가 어서 열리길 바란다.


    2018년 4월 24일 화요일


    애플 엔터프라이즈 계정에 대해 몇가지.


    이해를 돕기 위해 내가 다른 회사 일하다 혹은, 프리랜싱하다 사용하게 된 계정 스샷으로 올려본다.







    관련해서 법적 책임을 진다는 확인을 해줘야 한다. 대표 직통 번호 - 보통 휴대전화 - 도 제공해야 한다. 아무래도 앱을 스토어에 말고도 올릴 수 있는 권한이니...



    선택하면 지우는게 아니라 남겨두는 것이니 주의!




    개발자 디바이스 리셋은 1년에 한번 밖에 못한다. 100대가 많을 것 같지만... 금방 찬다 ^^;



    다 지우면



    요래 된다.



    등록된 디바이스에서는 바로 실행이 가능하다.


    등록된 디바이스가 아닌데도 설치할 수 있는게 엔터프라이즈 계정!




    기록해 두지 않으면,...


    프로그래밍에서도 기록은 매우 중요하다.


    기록하지 않으면 똑같은 실수를 반복한다.


    역사를 잊은 민족에게 미래를 없다고 했다.


    /****************************************************

    ****************************************************/


    망포역을 지나는 분당선,


    카카오 지하철 업데이트 했는데 급행이 자꾸 사라지더니


    아예 없어지더라. 급행을 타고 늘 만차여서, 세금이 부족하거나


    잘못 운영해서 지하철 운행할 능력이 안되나 싶었다.



    그 다음 한 주는 퇴근길 지하철 문이 안 닫혀서 지하철이 계속 지연되고 그랬다.


    급하게 와서 안 닫히는게 아니라 기다리던 사람도 계속 못타는 듯했다.


    뭐, 퇴근길 위에서 미리 다 타버렸으면 아래쪽은 못 타는게 당연한 이치.



    그리고 재미있는 것은 그 다음 주에 급행이 다시 부활 했다.


    살면서 경험한 바로는 다음 상황이 연출된다.


    1. 급행역 아닌 사람들이 잘 모르고 건의를 했거나

    2. 급행을 만든 핵심 멤버들이 다른 보직으로 변경이 되었거나 의견을 못 냈거나

    3. 우둔한 우두머리가 왔거나

    4. 초심을 잃었거나 등등...


    지하철 안내 방송보면 항상 분노에 차 있는데, 대구 지하철 참사가 나며, 왜 그 피해가


    더 커졌는지, 충분히 알 수 있다.


    자차로 계속 출근하다가 최근 지하철로 다닐 수 있는 직장을 구해서 좋아하고


    복잡한 것도 나름 즐기고 있는데


    문재인 정부에서 철도가 힘을 얻어서인가...


    참 밉상이다.


    내가 살면서 못살던 사람이 돈 벌면 변하는 것을 4번이나 겪었는데 그와 다를게 없는 것 같다.



    if isThere제대로된_철도_노동자 { keepYourJob() } else { 철도.리쿠르트(지원자) }

    .

    .

    .

    func 리크루트(_ x: 지원자) {

       

        guard let x = x, x != (혈연||학연||지연) else {

           

            return

           

        }

       

        x.느낌(현재노동자.방송수준())

       

        x.눈(자주멈추는에스컬레이터)

       

        x.뇌(철도관련진실된뉴스)

       

        철도노동자.append(x)

       

    }



    진실된 마음은 지하철 타는 사람 투표해서 노동자 자르라고 하고 싶지만,

    그래도 고쳐서 가는게 낫지. 그런 앱도 괜찮겠네. 근처 주변 사람들끼리 투표 시스템.


    저기 담배 피는거 어떻게 생각?

    지금 철도 방송 어떻게 생각? 等

    'Objective-C, SQLite3' 카테고리의 다른 글

    홈페이지 개편  (0) 2019.02.04
    아마존 오로라 사용기  (0) 2019.02.04
    2017년  (0) 2019.02.04
    make mrproper  (0) 2019.02.04
    스타벅스 텀블러 한정판  (0) 2019.02.04


    2018년은 바빠서 참석을 못했는데 사진 한 장이 이렇게 후회가 된다. 올해는 수료식에 참석해서 꼭 찍어야 겠다.

    'Objective-C, SQLite3' 카테고리의 다른 글

    아마존 오로라 사용기  (0) 2019.02.04
    이전 for organic searching  (0) 2019.02.04
    make mrproper  (0) 2019.02.04
    스타벅스 텀블러 한정판  (0) 2019.02.04
    mac locate  (0) 2019.02.03



    Make 할 때 모두 지우는 make mrproper는 여기서 유래되었다.





    Mr. Clean - Wikipedia



    en.wikipedia.org


    __Fin__



    'Objective-C, SQLite3' 카테고리의 다른 글

    이전 for organic searching  (0) 2019.02.04
    2017년  (0) 2019.02.04
    스타벅스 텀블러 한정판  (0) 2019.02.04
    mac locate  (0) 2019.02.03
    스위프트 소스 중에 가장 중요한 소스 from swift.org  (0) 2019.02.02



    중에 제일 아름다운.

    'Objective-C, SQLite3' 카테고리의 다른 글

    2017년  (0) 2019.02.04
    make mrproper  (0) 2019.02.04
    mac locate  (0) 2019.02.03
    스위프트 소스 중에 가장 중요한 소스 from swift.org  (0) 2019.02.02
    gcc -static -> Visual studio  (0) 2019.02.02



    리눅서가 맥을 쓰더라도 터미널이 편할 것이다. locate 명령이 듣지 않아 에러 로그를 보면


    sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist


    으로 나온다.



    그럴 땐, 다음 명령어 이후 locate를 하면 잘 된다.


    sudo /usr/libexec/locate.updatedb


    스위프트는 포인터의 언어


    withUnsafePointer(to:_:)


    import UIKit



    var str = "A String"


    withUnsafePointer(to: &str) {

        let c : Int = 4

        print(" str value \(str) has address: \($0)")

        str = "Hello"

    }


    print(str)

    print(c)



    str은 잘 나오고 c는 당연히 나오지 않는다.


    의식의 흐름 따라 만들다... 통째로 떼서 function이나 class 로 분리하면 된다.


    mutable 을 이용하여 메모리 할당, 해제, 제어 등이 가능하다는 것도 알아두자.


    여러 개념과 많은 오픈소스와 여러 라이브러리로 프로그램을


    쌓아올리다보니 결국에 꼬이는 현상이 발생해서 메모리를 직접 제어할 경우가 결국 오고야 만다.


    사실 메모리 직접 제어가 가장 깔끔하다. 리셋이나 무한 루프야 메모리 개념 배제해도 결국 생기는


    오류. 큰 프로젝트 하다보면 사실, 칩이나 컴파일러도 의심이 갈 수 밖에 없다.


    swift standard library 에서 menual memory management 에 다른 API가 많다.


    애플 설명서를 블로그에 붙여넣는 짓은 최대한 지양하려고 한다.

    이전 글에도 밝혔지만, 스위프트에서 포인터 이야기하니 언어는 그 언어 자체로서 말해야 한다는 앵무새를 또 만나,...

    지양하지 못하고 붙여 넣는다.



    Article

    Calling Functions With Pointer Parameters

    Use implicit pointer casting or bridging when calling functions that takes pointers as parameters.


    Framework

    Swift Standard Library

    Overview

    When calling a function that takes a pointer as a parameter, you can use implicit casting to pass a compatible pointer type or implicit bridging to pass a pointer to a variable or the contents of an array.


    Pass a Constant Pointer as a Parameter

    When you call a function that is declared as taking an UnsafePointer<Type> argument, you can pass any of the following:


    An UnsafePointer<Type>, UnsafeMutablePointer<Type>, or AutoreleasingUnsafeMutablePointer<Type> value, which is implicitly cast to UnsafePointer<Type> as necessary.


    A String value, if Type is Int8 or UInt8. The string is automatically converted to UTF8 in a zero-terminated buffer, and a pointer to that buffer is passed to the function.


    An in-out expression that contains a mutable variable, property, or subscript reference of type Type, which is passed as a pointer to the address of the left-hand side identifier.


    A [Type] value, which is passed as a pointer to the start of the array.


    The pointer you pass to the function is guaranteed to be valid only for the duration of the function call. Do not persist the pointer and access it after the function has returned.


    This example shows the different ways that you can call the a function that takes a constant pointer:


    func takesAPointer(_ p: UnsafePointer<Float>) {

        // ...

    }


    var x: Float = 0.0

    takesAPointer(&x)

    takesAPointer([1.0, 2.0, 3.0])

    When you call a function that takes an UnsafeRawPointer argument, you can pass the same operands as UnsafePointer<Type>, but with any type as Type.


    This example shows the different ways that you can call a function that takes a constant raw pointer:


    func takesARawPointer(_ p: UnsafeRawPointer?)  {

        // ...

    }


    var x: Float = 0.0, y: Int = 0

    takesARawPointer(&x)

    takesARawPointer(&y)

    takesARawPointer([1.0, 2.0, 3.0] as [Float])

    let intArray = [1, 2, 3]

    takesARawPointer(intArray)

    takesARawPointer("How are you today?")

    Pass a Mutable Pointer as a Parameter

    When you call a function that is declared as taking an UnsafeMutablePointer<Type> argument, you can pass any of the following:


    An UnsafeMutablePointer<Type> value.


    An in-out expression of type Type that contains a mutable variable, property, or subscript reference, which is passed as a pointer to the address of the mutable value.


    An in-out expression of type [Type] that contains a mutable variable, property, or subscript reference, which is passed as a pointer to the start of the array, and is lifetime-extended for the duration of the call.


    This example shows the different ways that you can call a function that takes a mutable pointer:


    func takesAMutablePointer(_ p: UnsafeMutablePointer<Float>) {

        // ...

    }


    var x: Float = 0.0

    var a: [Float] = [1.0, 2.0, 3.0]

    takesAMutablePointer(&x)

    takesAMutablePointer(&a)

    When you call a function that is declared as taking an UnsafeMutableRawPointer argument, you can pass the same operands as UnsafeMutablePointer<Type>, but for any type as Type.


    This example shows the different ways that you can call a function that takes a mutable raw pointer:


    func takesAMutableRawPointer(_ p: UnsafeMutableRawPointer?)  {

        // ...

    }


    var x: Float = 0.0, y: Int = 0

    var a: [Float] = [1.0, 2.0, 3.0], b: [Int] = [1, 2, 3]

    takesAMutableRawPointer(&x)

    takesAMutableRawPointer(&y)

    takesAMutableRawPointer(&a)

    takesAMutableRawPointer(&b)

    Pass an Autoreleasing Pointer as a Parameter

    When you call a function that is declared as taking an AutoreleasingUnsafeMutablePointer<Type>, you can pass any of the following:


    An AutoreleasingUnsafeMutablePointer<Type> value.


    An in-out expression that contains a mutable variable, property, or subscript reference of type Type. The value of the operand is copied bitwise into a temporary nonowning buffer. The address of that buffer is passed to the callee, and on return, the value in the buffer is loaded, retained, and reassigned into the operand.


    Unlike with other pointer types, you can't use an array as an implicitly bridged parameter.


    Pass a Function Pointer as a Parameter

    When calling a function that takes a C function pointer argument, you can pass a top-level Swift function, a closure literal, a closure declared with the @convention(c) attribute, or nil. You can also pass a closure property of a generic type or a generic method as long as no generic type parameters are referenced in the closure’s argument list or body.


    For example, consider Core Foundation’s CFArrayCreateMutable(_:_:_:) function. The CFArrayCreateMutable(_:_:_:) function takes a CFArrayCallBacks structure, which is initialized with function pointer callbacks:


    func customCopyDescription(_ p: UnsafeRawPointer?) -> Unmanaged<CFString>? {

        // return an Unmanaged<CFString>? value

    }


    var callbacks = CFArrayCallBacks(

        version: 0,

        retain: nil,

        release: nil,

        copyDescription: customCopyDescription,

        equal: { (p1, p2) -> DarwinBoolean in

            // return Bool value

        }

    )

    var mutableArray = CFArrayCreateMutable(nil, 0, &callbacks)

    In this example, the CFArrayCallBacks initializer uses nil values as arguments for the retain and release parameters, the customCopyDescription(_:) function as the argument for the customCopyDescription parameter, and a closure literal as the argument for the equal parameter.


    Note


    Only Swift function types with C function reference calling convention may be used for function pointer arguments. Like a C function pointer, a Swift function type with the @convention(c) attribute does not capture the context of its surrounding scope.



    알아야 하는 사이트와 솔루션


    요즘 감기는 약 안 먹으면 안 낫는다.


    그래서 집에 감기약 많이 사뒀지만


    많이 아파야 약을 먹게 된다.


    결국엔 많이 아플 수 밖에 없다.


    허리도 마찬가지.


    난 손목이나 허리 누가 미리 말을 해줬다면 신경을 썼을텐데


    말 안해주었었다.


    신기한건 내가 아쉬워서 말을 해주면


    안 듣는다.


    결국 아파봐야 그 때 후회하며 알게 되는 것 같다.


    그래서 이제는


    뭔가를 가르쳐 줄 때


    미리 포기하는 습관이 생겼다.


    조금 말해보고 아니다 싶으면 그냥 경험하게 하는게 좋은 것 같다.


    안타깝지만 그것도 자기 능력이라 판단된다.



    사람은 변하지 않더라.


    20년 경험이다. 중학교 때부터 치면, 더 넘었네.


    그래서 이젠 내려놓는다.





    Data Recovery

    Data Sharing

    Explorer Alternatives

    Virtual Machine

    EXE Security



    Beyond Compare, Themida, Browser & Editor , Redhat Cygwin, Kaspersky, Bittorrent  series



    'Objective-C, SQLite3' 카테고리의 다른 글

    make mrproper  (0) 2019.02.04
    스타벅스 텀블러 한정판  (0) 2019.02.04
    스위프트 소스 중에 가장 중요한 소스 from swift.org  (0) 2019.02.02
    gcc -static -> Visual studio  (0) 2019.02.02
    자료형에 대해서  (0) 2019.02.02


    /// A type that can be converted to and from an associated raw value.

    ///

    /// With a `RawRepresentable` type, you can switch back and forth between a

    /// custom type and an associated `RawValue` type without losing the value of

    /// the original `RawRepresentable` type. Using the raw value of a conforming

    /// type streamlines interoperation with Objective-C and legacy APIs and

    /// simplifies conformance to other protocols, such as `Equatable`,

    /// `Comparable`, and `Hashable`.

    ///

    /// The `RawRepresentable` protocol is seen mainly in two categories of types:

    /// enumerations with raw value types and option sets.

    ///

    /// Enumerations with Raw Values

    /// ============================

    ///

    /// For any enumeration with a string, integer, or floating-point raw type, the

    /// Swift compiler automatically adds `RawRepresentable` conformance. When

    /// defining your own custom enumeration, you give it a raw type by specifying

    /// the raw type as the first item in the enumeration's type inheritance list.

    /// You can also use literals to specify values for one or more cases.

    ///

    /// For example, the `Counter` enumeration defined here has an `Int` raw value

    /// type and gives the first case a raw value of `1`:

    ///

    ///     enum Counter: Int {

    ///         case one = 1, two, three, four, five

    ///     }

    ///

    /// You can create a `Counter` instance from an integer value between 1 and 5

    /// by using the `init?(rawValue:)` initializer declared in the

    /// `RawRepresentable` protocol. This initializer is failable because although

    /// every case of the `Counter` type has a corresponding `Int` value, there

    /// are many `Int` values that *don't* correspond to a case of `Counter`.

    ///

    ///     for i in 3...6 {

    ///         print(Counter(rawValue: i))

    ///     }

    ///     // Prints "Optional(Counter.three)"

    ///     // Prints "Optional(Counter.four)"

    ///     // Prints "Optional(Counter.five)"

    ///     // Prints "nil"

    ///

    /// Option Sets

    /// ===========

    ///

    /// Option sets all conform to `RawRepresentable` by inheritance using the

    /// `OptionSet` protocol. Whether using an option set or creating your own,

    /// you use the raw value of an option set instance to store the instance's

    /// bitfield. The raw value must therefore be of a type that conforms to the

    /// `FixedWidthInteger` protocol, such as `UInt8` or `Int`. For example, the

    /// `Direction` type defines an option set for the four directions you can

    /// move in a game.

    ///

    ///     struct Directions: OptionSet {

    ///         let rawValue: UInt8

    ///

    ///         static let up    = Directions(rawValue: 1 << 0)

    ///         static let down  = Directions(rawValue: 1 << 1)

    ///         static let left  = Directions(rawValue: 1 << 2)

    ///         static let right = Directions(rawValue: 1 << 3)

    ///     }

    ///

    /// Unlike enumerations, option sets provide a nonfailable `init(rawValue:)`

    /// initializer to convert from a raw value, because option sets don't have an

    /// enumerated list of all possible cases. Option set values have

    /// a one-to-one correspondence with their associated raw values.

    ///

    /// In the case of the `Directions` option set, an instance can contain zero,

    /// one, or more of the four defined directions. This example declares a

    /// constant with three currently allowed moves. The raw value of the

    /// `allowedMoves` instance is the result of the bitwise OR of its three

    /// members' raw values:

    ///

    ///     let allowedMoves: Directions = [.up, .down, .left]

    ///     print(allowedMoves.rawValue)

    ///     // Prints "7"

    ///

    /// Option sets use bitwise operations on their associated raw values to

    /// implement their mathematical set operations. For example, the `contains()`

    /// method on `allowedMoves` performs a bitwise AND operation to check whether

    /// the option set contains an element.

    ///

    ///     print(allowedMoves.contains(.right))

    ///     // Prints "false"

    ///     print(allowedMoves.rawValue & Directions.right.rawValue)

    ///     // Prints "0"

    public protocol RawRepresentable {


        /// The raw type that can be used to represent all values of the conforming

        /// type.

        ///

        /// Every distinct value of the conforming type has a corresponding unique

        /// value of the `RawValue` type, but there may be values of the `RawValue`

        /// type that don't have a corresponding value of the conforming type.

        associatedtype RawValue


        /// Creates a new instance with the specified raw value.

        ///

        /// If there is no value of the type that corresponds with the specified raw

        /// value, this initializer returns `nil`. For example:

        ///

        ///     enum PaperSize: String {

        ///         case A4, A5, Letter, Legal

        ///     }

        ///

        ///     print(PaperSize(rawValue: "Legal"))

        ///     // Prints "Optional("PaperSize.Legal")"

        ///

        ///     print(PaperSize(rawValue: "Tabloid"))

        ///     // Prints "nil"

        ///

        /// - Parameter rawValue: The raw value to use for the new instance.

        public init?(rawValue: Self.RawValue)


        /// The corresponding value of the raw type.

        ///

        /// A new instance initialized with `rawValue` will be equivalent to this

        /// instance. For example:

        ///

        ///     enum PaperSize: String {

        ///         case A4, A5, Letter, Legal

        ///     }

        ///

        ///     let selectedSize = PaperSize.Letter

        ///     print(selectedSize.rawValue)

        ///     // Prints "Letter"

        ///

        ///     print(selectedSize == PaperSize(rawValue: selectedSize.rawValue)!)

        ///     // Prints "true"

        public var rawValue: Self.RawValue { get }

    }


    extension RawRepresentable where Self.RawValue == Bool {


        /// Encodes this value into the given encoder, when the type's `RawValue`

        /// is `Bool`.

        ///

        /// This function throws an error if any values are invalid for the given

        /// encoder's format.

        ///

        /// - Parameter encoder: The encoder to write data to.

        public func encode(to encoder: Encoderthrows

    }


    extension RawRepresentable where Self.RawValue == Bool {


        /// Creates a new instance by decoding from the given decoder, when the

        /// type's `RawValue` is `Bool`.

        ///

        /// This initializer throws an error if reading from the decoder fails, or

        /// if the data read is corrupted or otherwise invalid.

        ///

        /// - Parameter decoder: The decoder to read data from.

        public convenience init(from decoder: Decoderthrows

    }


    extension RawRepresentable where Self.RawValue == String {


        /// Encodes this value into the given encoder, when the type's `RawValue`

        /// is `String`.

        ///

        /// This function throws an error if any values are invalid for the given

        /// encoder's format.

        ///

        /// - Parameter encoder: The encoder to write data to.

        public func encode(to encoder: Encoderthrows

    }


    extension RawRepresentable where Self.RawValue == String {


        /// Creates a new instance by decoding from the given decoder, when the

        /// type's `RawValue` is `String`.

        ///

        /// This initializer throws an error if reading from the decoder fails, or

        /// if the data read is corrupted or otherwise invalid.

        ///

        /// - Parameter decoder: The decoder to read data from.

        public convenience init(from decoder: Decoderthrows

    }


    extension RawRepresentable where Self.RawValue == Double {


        /// Encodes this value into the given encoder, when the type's `RawValue`

        /// is `Double`.

        ///

        /// This function throws an error if any values are invalid for the given

        /// encoder's format.

        ///

        /// - Parameter encoder: The encoder to write data to.

        public func encode(to encoder: Encoderthrows

    }


    extension RawRepresentable where Self.RawValue == Double {


        /// Creates a new instance by decoding from the given decoder, when the

        /// type's `RawValue` is `Double`.

        ///

        /// This initializer throws an error if reading from the decoder fails, or

        /// if the data read is corrupted or otherwise invalid.

        ///

        /// - Parameter decoder: The decoder to read data from.

        public convenience init(from decoder: Decoderthrows

    }


    extension RawRepresentable where Self.RawValue == Float {


        /// Encodes this value into the given encoder, when the type's `RawValue`

        /// is `Float`.

        ///

        /// This function throws an error if any values are invalid for the given

        /// encoder's format.

        ///

        /// - Parameter encoder: The encoder to write data to.

        public func encode(to encoder: Encoderthrows

    }


    extension RawRepresentable where Self.RawValue == Float {


        /// Creates a new instance by decoding from the given decoder, when the

        /// type's `RawValue` is `Float`.

        ///

        /// This initializer throws an error if reading from the decoder fails, or

        /// if the data read is corrupted or otherwise invalid.

        ///

        /// - Parameter decoder: The decoder to read data from.

        public convenience init(from decoder: Decoderthrows

    }


    extension RawRepresentable where Self.RawValue == Int {


        /// Encodes this value into the given encoder, when the type's `RawValue`

        /// is `Int`.

        ///

        /// This function throws an error if any values are invalid for the given

        /// encoder's format.

        ///

        /// - Parameter encoder: The encoder to write data to.

        public func encode(to encoder: Encoderthrows

    }


    extension RawRepresentable where Self.RawValue == Int {


        /// Creates a new instance by decoding from the given decoder, when the

        /// type's `RawValue` is `Int`.

        ///

        /// This initializer throws an error if reading from the decoder fails, or

        /// if the data read is corrupted or otherwise invalid.

        ///

        /// - Parameter decoder: The decoder to read data from.

        public convenience init(from decoder: Decoderthrows

    }


    extension RawRepresentable where Self.RawValue == Int8 {


        /// Encodes this value into the given encoder, when the type's `RawValue`

        /// is `Int8`.

        ///

        /// This function throws an error if any values are invalid for the given

        /// encoder's format.

        ///

        /// - Parameter encoder: The encoder to write data to.

        public func encode(to encoder: Encoderthrows

    }


    extension RawRepresentable where Self.RawValue == Int8 {


        /// Creates a new instance by decoding from the given decoder, when the

        /// type's `RawValue` is `Int8`.

        ///

        /// This initializer throws an error if reading from the decoder fails, or

        /// if the data read is corrupted or otherwise invalid.

        ///

        /// - Parameter decoder: The decoder to read data from.

        public convenience init(from decoder: Decoderthrows

    }


    extension RawRepresentable where Self.RawValue == Int16 {


        /// Encodes this value into the given encoder, when the type's `RawValue`

        /// is `Int16`.

        ///

        /// This function throws an error if any values are invalid for the given

        /// encoder's format.

        ///

        /// - Parameter encoder: The encoder to write data to.

        public func encode(to encoder: Encoderthrows

    }


    extension RawRepresentable where Self.RawValue == Int16 {


        /// Creates a new instance by decoding from the given decoder, when the

        /// type's `RawValue` is `Int16`.

        ///

        /// This initializer throws an error if reading from the decoder fails, or

        /// if the data read is corrupted or otherwise invalid.

        ///

        /// - Parameter decoder: The decoder to read data from.

        public convenience init(from decoder: Decoderthrows

    }


    extension RawRepresentable where Self.RawValue == Int32 {


        /// Encodes this value into the given encoder, when the type's `RawValue`

        /// is `Int32`.

        ///

        /// This function throws an error if any values are invalid for the given

        /// encoder's format.

        ///

        /// - Parameter encoder: The encoder to write data to.

        public func encode(to encoder: Encoderthrows

    }


    extension RawRepresentable where Self.RawValue == Int32 {


        /// Creates a new instance by decoding from the given decoder, when the

        /// type's `RawValue` is `Int32`.

        ///

        /// This initializer throws an error if reading from the decoder fails, or

        /// if the data read is corrupted or otherwise invalid.

        ///

        /// - Parameter decoder: The decoder to read data from.

        public convenience init(from decoder: Decoderthrows

    }


    extension RawRepresentable where Self.RawValue == Int64 {


        /// Encodes this value into the given encoder, when the type's `RawValue`

        /// is `Int64`.

        ///

        /// This function throws an error if any values are invalid for the given

        /// encoder's format.

        ///

        /// - Parameter encoder: The encoder to write data to.

        public func encode(to encoder: Encoderthrows

    }


    extension RawRepresentable where Self.RawValue == Int64 {


        /// Creates a new instance by decoding from the given decoder, when the

        /// type's `RawValue` is `Int64`.

        ///

        /// This initializer throws an error if reading from the decoder fails, or

        /// if the data read is corrupted or otherwise invalid.

        ///

        /// - Parameter decoder: The decoder to read data from.

        public convenience init(from decoder: Decoderthrows

    }


    extension RawRepresentable where Self.RawValue == UInt {


        /// Encodes this value into the given encoder, when the type's `RawValue`

        /// is `UInt`.

        ///

        /// This function throws an error if any values are invalid for the given

        /// encoder's format.

        ///

        /// - Parameter encoder: The encoder to write data to.

        public func encode(to encoder: Encoderthrows

    }


    extension RawRepresentable where Self.RawValue == UInt {


        /// Creates a new instance by decoding from the given decoder, when the

        /// type's `RawValue` is `UInt`.

        ///

        /// This initializer throws an error if reading from the decoder fails, or

        /// if the data read is corrupted or otherwise invalid.

        ///

        /// - Parameter decoder: The decoder to read data from.

        public convenience init(from decoder: Decoderthrows

    }


    extension RawRepresentable where Self.RawValue == UInt8 {


        /// Encodes this value into the given encoder, when the type's `RawValue`

        /// is `UInt8`.

        ///

        /// This function throws an error if any values are invalid for the given

        /// encoder's format.

        ///

        /// - Parameter encoder: The encoder to write data to.

        public func encode(to encoder: Encoderthrows

    }


    extension RawRepresentable where Self.RawValue == UInt8 {


        /// Creates a new instance by decoding from the given decoder, when the

        /// type's `RawValue` is `UInt8`.

        ///

        /// This initializer throws an error if reading from the decoder fails, or

        /// if the data read is corrupted or otherwise invalid.

        ///

        /// - Parameter decoder: The decoder to read data from.

        public convenience init(from decoder: Decoderthrows

    }


    extension RawRepresentable where Self.RawValue == UInt16 {


        /// Encodes this value into the given encoder, when the type's `RawValue`

        /// is `UInt16`.

        ///

        /// This function throws an error if any values are invalid for the given

        /// encoder's format.

        ///

        /// - Parameter encoder: The encoder to write data to.

        public func encode(to encoder: Encoderthrows

    }


    extension RawRepresentable where Self.RawValue == UInt16 {


        /// Creates a new instance by decoding from the given decoder, when the

        /// type's `RawValue` is `UInt16`.

        ///

        /// This initializer throws an error if reading from the decoder fails, or

        /// if the data read is corrupted or otherwise invalid.

        ///

        /// - Parameter decoder: The decoder to read data from.

        public convenience init(from decoder: Decoderthrows

    }


    extension RawRepresentable where Self.RawValue == UInt32 {


        /// Encodes this value into the given encoder, when the type's `RawValue`

        /// is `UInt32`.

        ///

        /// This function throws an error if any values are invalid for the given

        /// encoder's format.

        ///

        /// - Parameter encoder: The encoder to write data to.

        public func encode(to encoder: Encoderthrows

    }


    extension RawRepresentable where Self.RawValue == UInt32 {


        /// Creates a new instance by decoding from the given decoder, when the

        /// type's `RawValue` is `UInt32`.

        ///

        /// This initializer throws an error if reading from the decoder fails, or

        /// if the data read is corrupted or otherwise invalid.

        ///

        /// - Parameter decoder: The decoder to read data from.

        public convenience init(from decoder: Decoderthrows

    }


    extension RawRepresentable where Self.RawValue == UInt64 {


        /// Encodes this value into the given encoder, when the type's `RawValue`

        /// is `UInt64`.

        ///

        /// This function throws an error if any values are invalid for the given

        /// encoder's format.

        ///

        /// - Parameter encoder: The encoder to write data to.

        public func encode(to encoder: Encoderthrows

    }


    extension RawRepresentable where Self.RawValue == UInt64 {


        /// Creates a new instance by decoding from the given decoder, when the

        /// type's `RawValue` is `UInt64`.

        ///

        /// This initializer throws an error if reading from the decoder fails, or

        /// if the data read is corrupted or otherwise invalid.

        ///

        /// - Parameter decoder: The decoder to read data from.

        public convenience init(from decoder: Decoderthrows

    }


    /// Returns a Boolean value indicating whether the two arguments are equal.

    ///

    /// - Parameters:

    ///   - lhs: A raw-representable instance.

    ///   - rhs: A second raw-representable instance.

    public func == <T>(lhs: T, rhs: T) -> Bool where T : RawRepresentableT.RawValue : Equatable


    /// Returns a Boolean value indicating whether the two arguments are not equal.

    ///

    /// - Parameters:

    ///   - lhs: A raw-representable instance.

    ///   - rhs: A second raw-representable instance.

    public func != <T>(lhs: T, rhs: T) -> Bool where T : RawRepresentableT.RawValue : Equatable


    /// Returns a Boolean value indicating whether the two arguments are not equal.

    ///

    /// - Parameters:

    ///   - lhs: A raw-representable instance.

    ///   - rhs: A second raw-representable instance.

    public func != <T>(lhs: T, rhs: T) -> Bool where T : EquatableT : RawRepresentableT.RawValue : Equatable


    /// A type that provides a collection of all of its values.

    ///

    /// Types that conform to the `CaseIterable` protocol are typically

    /// enumerations without associated values. When using a `CaseIterable` type,

    /// you can access a collection of all of the type's cases by using the type's

    /// `allCases` property.

    ///

    /// For example, the `CompassDirection` enumeration declared in this example

    /// conforms to `CaseIterable`. You access the number of cases and the cases

    /// themselves through `CompassDirection.allCases`.

    ///

    ///     enum CompassDirection: CaseIterable {

    ///         case north, south, east, west

    ///     }

    ///

    ///     print("There are \(CompassDirection.allCases.count) directions.")

    ///     // Prints "There are 4 directions."

    ///     let caseList = CompassDirection.allCases

    ///                                    .map({ "\($0)" })

    ///                                    .joined(separator: ", ")

    ///     // caseList == "north, south, east, west"

    ///

    /// Conforming to the CaseIterable Protocol

    /// =======================================

    ///

    /// The compiler can automatically provide an implementation of the

    /// `CaseIterable` requirements for any enumeration without associated values

    /// or `@available` attributes on its cases. The synthesized `allCases`

    /// collection provides the cases in order of their declaration.

    ///

    /// You can take advantage of this compiler support when defining your own

    /// custom enumeration by declaring conformance to `CaseIterable` in the

    /// enumeration's original declaration. The `CompassDirection` example above

    /// demonstrates this automatic implementation.

    public protocol CaseIterable {


        /// A type that can represent a collection of all values of this type.

        associatedtype AllCases : Collection where Self.AllCases.Element == Self


        /// A collection of all values of this type.

        public static var allCases: Self.AllCases { get }

    }


    /// A type that can be initialized using the nil literal, `nil`.

    ///

    /// `nil` has a specific meaning in Swift---the absence of a value. Only the

    /// `Optional` type conforms to `ExpressibleByNilLiteral`.

    /// `ExpressibleByNilLiteral` conformance for types that use `nil` for other

    /// purposes is discouraged.

    public protocol ExpressibleByNilLiteral {


        /// Creates an instance initialized with `nil`.

        public init(nilLiteral: ())

    }


    /// A type that can be initialized with an integer literal.

    ///

    /// The standard library integer and floating-point types, such as `Int` and

    /// `Double`, conform to the `ExpressibleByIntegerLiteral` protocol. You can

    /// initialize a variable or constant of any of these types by assigning an

    /// integer literal.

    ///

    ///     // Type inferred as 'Int'

    ///     let cookieCount = 12

    ///

    ///     // An array of 'Int'

    ///     let chipsPerCookie = [21, 22, 25, 23, 24, 19]

    ///

    ///     // A floating-point value initialized using an integer literal

    ///     let redPercentage: Double = 1

    ///     // redPercentage == 1.0

    ///

    /// Conforming to ExpressibleByIntegerLiteral

    /// =========================================

    ///

    /// To add `ExpressibleByIntegerLiteral` conformance to your custom type,

    /// implement the required initializer.

    public protocol ExpressibleByIntegerLiteral {


        /// A type that represents an integer literal.

        ///

        /// The standard library integer and floating-point types are all valid types

        /// for `IntegerLiteralType`.

        associatedtype IntegerLiteralType : _ExpressibleByBuiltinIntegerLiteral


        /// Creates an instance initialized to the specified integer value.

        ///

        /// Do not call this initializer directly. Instead, initialize a variable or

        /// constant using an integer literal. For example:

        ///

        ///     let x = 23

        ///

        /// In this example, the assignment to the `x` constant calls this integer

        /// literal initializer behind the scenes.

        ///

        /// - Parameter value: The value to create.

        public init(integerLiteral value: Self.IntegerLiteralType)

    }


    extension ExpressibleByIntegerLiteral {


        public convenience init(integerLiteral value: Self)

    }


    /// A type that can be initialized with a floating-point literal.

    ///

    /// The standard library floating-point types---`Float`, `Double`, and

    /// `Float80` where available---all conform to the `ExpressibleByFloatLiteral`

    /// protocol. You can initialize a variable or constant of any of these types

    /// by assigning a floating-point literal.

    ///

    ///     // Type inferred as 'Double'

    ///     let threshold = 6.0

    ///

    ///     // An array of 'Double'

    ///     let measurements = [2.2, 4.1, 3.65, 4.2, 9.1]

    ///

    /// Conforming to ExpressibleByFloatLiteral

    /// =======================================

    ///

    /// To add `ExpressibleByFloatLiteral` conformance to your custom type,

    /// implement the required initializer.

    public protocol ExpressibleByFloatLiteral {


        /// A type that represents a floating-point literal.

        ///

        /// Valid types for `FloatLiteralType` are `Float`, `Double`, and `Float80`

        /// where available.

        associatedtype FloatLiteralType : _ExpressibleByBuiltinFloatLiteral


        /// Creates an instance initialized to the specified floating-point value.

        ///

        /// Do not call this initializer directly. Instead, initialize a variable or

        /// constant using a floating-point literal. For example:

        ///

        ///     let x = 21.5

        ///

        /// In this example, the assignment to the `x` constant calls this

        /// floating-point literal initializer behind the scenes.

        ///

        /// - Parameter value: The value to create.

        public init(floatLiteral value: Self.FloatLiteralType)

    }


    /// A type that can be initialized with the Boolean literals `true` and

    /// `false`.

    ///

    /// Only three types provided by Swift---`Bool`, `DarwinBoolean`, and

    /// `ObjCBool`---are treated as Boolean values. Expanding this set to include

    /// types that represent more than simple Boolean values is discouraged.

    ///

    /// To add `ExpressibleByBooleanLiteral` conformance to your custom type,

    /// implement the `init(booleanLiteral:)` initializer that creates an instance

    /// of your type with the given Boolean value.

    public protocol ExpressibleByBooleanLiteral {


        /// A type that represents a Boolean literal, such as `Bool`.

        associatedtype BooleanLiteralType : _ExpressibleByBuiltinBooleanLiteral


        /// Creates an instance initialized to the given Boolean value.

        ///

        /// Do not call this initializer directly. Instead, initialize a variable or

        /// constant using one of the Boolean literals `true` and `false`. For

        /// example:

        ///

        ///     let twasBrillig = true

        ///

        /// In this example, the assignment to the `twasBrillig` constant calls this

        /// Boolean literal initializer behind the scenes.

        ///

        /// - Parameter value: The value of the new instance.

        public init(booleanLiteral value: Self.BooleanLiteralType)

    }


    /// A type that can be initialized with a string literal containing a single

    /// Unicode scalar value.

    ///

    /// The `String`, `StaticString`, `Character`, and `Unicode.Scalar` types all

    /// conform to the `ExpressibleByUnicodeScalarLiteral` protocol. You can

    /// initialize a variable of any of these types using a string literal that

    /// holds a single Unicode scalar.

    ///

    ///     let ñ: Unicode.Scalar = "ñ"

    ///     print(ñ)

    ///     // Prints "ñ"

    ///

    /// Conforming to ExpressibleByUnicodeScalarLiteral

    /// ===============================================

    ///

    /// To add `ExpressibleByUnicodeScalarLiteral` conformance to your custom type,

    /// implement the required initializer.

    public protocol ExpressibleByUnicodeScalarLiteral {


        /// A type that represents a Unicode scalar literal.

        ///

        /// Valid types for `UnicodeScalarLiteralType` are `Unicode.Scalar`,

        /// `Character`, `String`, and `StaticString`.

        associatedtype UnicodeScalarLiteralType : _ExpressibleByBuiltinUnicodeScalarLiteral


        /// Creates an instance initialized to the given value.

        ///

        /// - Parameter value: The value of the new instance.

        public init(unicodeScalarLiteral value: Self.UnicodeScalarLiteralType)

    }


    /// A type that can be initialized with a string literal containing a single

    /// extended grapheme cluster.

    ///

    /// An *extended grapheme cluster* is a group of one or more Unicode scalar

    /// values that approximates a single user-perceived character.  Many

    /// individual characters, such as "é", "김", and "🇮🇳", can be made up of

    /// multiple Unicode scalar values. These code points are combined by

    /// Unicode's boundary algorithms into extended grapheme clusters.

    ///

    /// The `String`, `StaticString`, and `Character` types conform to the

    /// `ExpressibleByExtendedGraphemeClusterLiteral` protocol. You can initialize

    /// a variable or constant of any of these types using a string literal that

    /// holds a single character.

    ///

    ///     let snowflake: Character = "❄︎"

    ///     print(snowflake)

    ///     // Prints "❄︎"

    ///

    /// Conforming to ExpressibleByExtendedGraphemeClusterLiteral

    /// =========================================================

    ///

    /// To add `ExpressibleByExtendedGraphemeClusterLiteral` conformance to your

    /// custom type, implement the required initializer.

    public protocol ExpressibleByExtendedGraphemeClusterLiteral : ExpressibleByUnicodeScalarLiteral {


        /// A type that represents an extended grapheme cluster literal.

        ///

        /// Valid types for `ExtendedGraphemeClusterLiteralType` are `Character`,

        /// `String`, and `StaticString`.

        associatedtype ExtendedGraphemeClusterLiteralType : _ExpressibleByBuiltinExtendedGraphemeClusterLiteral


        /// Creates an instance initialized to the given value.

        ///

        /// - Parameter value: The value of the new instance.

        public init(extendedGraphemeClusterLiteral value: Self.ExtendedGraphemeClusterLiteralType)

    }


    extension ExpressibleByExtendedGraphemeClusterLiteral where Self.ExtendedGraphemeClusterLiteralType == Self.UnicodeScalarLiteralType {


        public convenience init(unicodeScalarLiteral value: Self.ExtendedGraphemeClusterLiteralType)

    }


    /// A type that can be initialized with a string literal.

    ///

    /// The `String` and `StaticString` types conform to the

    /// `ExpressibleByStringLiteral` protocol. You can initialize a variable or

    /// constant of either of these types using a string literal of any length.

    ///

    ///     let picnicGuest = "Deserving porcupine"

    ///

    /// Conforming to ExpressibleByStringLiteral

    /// ========================================

    ///

    /// To add `ExpressibleByStringLiteral` conformance to your custom type,

    /// implement the required initializer.

    public protocol ExpressibleByStringLiteral : ExpressibleByExtendedGraphemeClusterLiteral {


        /// A type that represents a string literal.

        ///

        /// Valid types for `StringLiteralType` are `String` and `StaticString`.

        associatedtype StringLiteralType : _ExpressibleByBuiltinStringLiteral


        /// Creates an instance initialized to the given string value.

        ///

        /// - Parameter value: The value of the new instance.

        public init(stringLiteral value: Self.StringLiteralType)

    }


    extension ExpressibleByStringLiteral where Self.ExtendedGraphemeClusterLiteralType == Self.StringLiteralType {


        public convenience init(extendedGraphemeClusterLiteral value: Self.StringLiteralType)

    }


    /// A type that can be initialized using an array literal.

    ///

    /// An array literal is a simple way of expressing a list of values. Simply

    /// surround a comma-separated list of values, instances, or literals with

    /// square brackets to create an array literal. You can use an array literal

    /// anywhere an instance of an `ExpressibleByArrayLiteral` type is expected: as

    /// a value assigned to a variable or constant, as a parameter to a method or

    /// initializer, or even as the subject of a nonmutating operation like

    /// `map(_:)` or `filter(_:)`.

    ///

    /// Arrays, sets, and option sets all conform to `ExpressibleByArrayLiteral`, 

    /// and your own custom types can as well. Here's an example of creating a set 

    /// and an array using array literals:

    ///

    ///     let employeesSet: Set<String> = ["Amir", "Jihye", "Dave", "Alessia", "Dave"]

    ///     print(employeesSet)

    ///     // Prints "["Amir", "Dave", "Jihye", "Alessia"]"

    ///

    ///     let employeesArray: [String] = ["Amir", "Jihye", "Dave", "Alessia", "Dave"]

    ///     print(employeesArray)

    ///     // Prints "["Amir", "Jihye", "Dave", "Alessia", "Dave"]"

    ///

    /// The `Set` and `Array` types each handle array literals in their own way to

    /// create new instances. In this case, the newly created set drops the

    /// duplicate value ("Dave") and doesn't maintain the order of the array

    /// literal's elements. The new array, on the other hand, matches the order

    /// and number of elements provided.

    ///

    /// - Note: An array literal is not the same as an `Array` instance. You can't

    ///   initialize a type that conforms to `ExpressibleByArrayLiteral` simply by

    ///   assigning an existing array.

    ///

    ///       let anotherSet: Set = employeesArray

    ///       // error: cannot convert value of type '[String]' to specified type 'Set'

    ///

    /// Type Inference of Array Literals

    /// ================================

    ///

    /// Whenever possible, Swift's compiler infers the full intended type of your

    /// array literal. Because `Array` is the default type for an array literal,

    /// without writing any other code, you can declare an array with a particular

    /// element type by providing one or more values.

    ///

    /// In this example, the compiler infers the full type of each array literal.

    ///

    ///     let integers = [1, 2, 3]

    ///     // 'integers' has type '[Int]'

    ///

    ///     let strings = ["a", "b", "c"]

    ///     // 'strings' has type '[String]'

    ///

    /// An empty array literal alone doesn't provide enough information for the

    /// compiler to infer the intended type of the `Array` instance. When using an

    /// empty array literal, specify the type of the variable or constant.

    ///

    ///     var emptyArray: [Bool] = []

    ///     // 'emptyArray' has type '[Bool]'

    ///

    /// Because many functions and initializers fully specify the types of their

    /// parameters, you can often use an array literal with or without elements as

    /// a parameter. For example, the `sum(_:)` function shown here takes an `Int`

    /// array as a parameter:

    ///

    ///     func sum(values: [Int]) -> Int {

    ///         return values.reduce(0, +)

    ///     }

    ///

    ///     let sumOfFour = sum([5, 10, 15, 20])

    ///     // 'sumOfFour' == 50

    ///

    ///     let sumOfNone = sum([])

    ///     // 'sumOfNone' == 0

    ///

    /// When you call a function that does not fully specify its parameters' types,

    /// use the type-cast operator (`as`) to specify the type of an array literal.

    /// For example, the `log(name:value:)` function shown here has an

    /// unconstrained generic `value` parameter.

    ///

    ///     func log<T>(name name: String, value: T) {

    ///         print("\(name): \(value)")

    ///     }

    ///

    ///     log(name: "Four integers", value: [5, 10, 15, 20])

    ///     // Prints "Four integers: [5, 10, 15, 20]"

    ///

    ///     log(name: "Zero integers", value: [] as [Int])

    ///     // Prints "Zero integers: []"

    ///

    /// Conforming to ExpressibleByArrayLiteral

    /// =======================================

    ///

    /// Add the capability to be initialized with an array literal to your own

    /// custom types by declaring an `init(arrayLiteral:)` initializer. The

    /// following example shows the array literal initializer for a hypothetical

    /// `OrderedSet` type, which has setlike semantics but maintains the order of

    /// its elements.

    ///

    ///     struct OrderedSet<Element: Hashable>: Collection, SetAlgebra {

    ///         // implementation details

    ///     }

    ///

    ///     extension OrderedSet: ExpressibleByArrayLiteral {

    ///         init(arrayLiteral: Element...) {

    ///             self.init()

    ///             for element in arrayLiteral {

    ///                 self.append(element)

    ///             }

    ///         }

    ///     }

    public protocol ExpressibleByArrayLiteral {


        /// The type of the elements of an array literal.

        associatedtype ArrayLiteralElement


        /// Creates an instance initialized with the given elements.

        public init(arrayLiteral elements: Self.ArrayLiteralElement...)

    }


    /// A type that can be initialized using a dictionary literal.

    ///

    /// A dictionary literal is a simple way of writing a list of key-value pairs.

    /// You write each key-value pair with a colon (`:`) separating the key and

    /// the value. The dictionary literal is made up of one or more key-value

    /// pairs, separated by commas and surrounded with square brackets.

    ///

    /// To declare a dictionary, assign a dictionary literal to a variable or

    /// constant:

    ///

    ///     let countryCodes = ["BR": "Brazil", "GH": "Ghana",

    ///                         "JP": "Japan", "US": "United States"]

    ///     // 'countryCodes' has type [String: String]

    ///

    ///     print(countryCodes["BR"]!)

    ///     // Prints "Brazil"

    ///

    /// When the context provides enough type information, you can use a special

    /// form of the dictionary literal, square brackets surrounding a single

    /// colon, to initialize an empty dictionary.

    ///

    ///     var frequencies: [String: Int] = [:]

    ///     print(frequencies.count)

    ///     // Prints "0"

    ///

    /// - Note: A dictionary literal is *not* the same as an instance of

    ///   `Dictionary` or the similarly named `DictionaryLiteral` type. You can't

    ///   initialize a type that conforms to `ExpressibleByDictionaryLiteral` simply

    ///   by assigning an instance of one of these types.

    ///

    /// Conforming to the ExpressibleByDictionaryLiteral Protocol

    /// =========================================================

    ///

    /// To add the capability to be initialized with a dictionary literal to your

    /// own custom types, declare an `init(dictionaryLiteral:)` initializer. The

    /// following example shows the dictionary literal initializer for a

    /// hypothetical `CountedSet` type, which uses setlike semantics while keeping

    /// track of the count for duplicate elements:

    ///

    ///     struct CountedSet<Element: Hashable>: Collection, SetAlgebra {

    ///         // implementation details

    ///

    ///         /// Updates the count stored in the set for the given element,

    ///         /// adding the element if necessary.

    ///         ///

    ///         /// - Parameter n: The new count for `element`. `n` must be greater

    ///         ///   than or equal to zero.

    ///         /// - Parameter element: The element to set the new count on.

    ///         mutating func updateCount(_ n: Int, for element: Element)

    ///     }

    ///

    ///     extension CountedSet: ExpressibleByDictionaryLiteral {

    ///         init(dictionaryLiteral elements: (Element, Int)...) {

    ///             self.init()

    ///             for (element, count) in elements {

    ///                 self.updateCount(count, for: element)

    ///             }

    ///         }

    ///     }

    public protocol ExpressibleByDictionaryLiteral {


        /// The key type of a dictionary literal.

        associatedtype Key


        /// The value type of a dictionary literal.

        associatedtype Value


        /// Creates an instance initialized with the given key-value pairs.

        public init(dictionaryLiteral elements: (Self.KeySelf.Value)...)

    }


    /// A type that can be initialized by string interpolation with a string

    /// literal that includes expressions.

    ///

    /// Use string interpolation to include one or more expressions in a string

    /// literal, wrapped in a set of parentheses and prefixed by a backslash. For

    /// example:

    ///

    ///     let price = 2

    ///     let number = 3

    ///     let message = "One cookie: $\(price), \(number) cookies: $\(price * number)."

    ///     print(message)

    ///     // Prints "One cookie: $2, 3 cookies: $6."

    ///

    /// Conforming to the ExpressibleByStringInterpolation Protocol

    /// ===========================================================

    ///

    /// The `ExpressibleByStringInterpolation` protocol is deprecated. Do not add

    /// new conformances to the protocol.

    @available(*, deprecated, message: "it will be replaced or redesigned in Swift 4.0.  Instead of conforming to 'ExpressibleByStringInterpolation', consider adding an 'init(_:String)'")

    public typealias ExpressibleByStringInterpolation


    @available(*, deprecated, renamed: "ExpressibleByNilLiteral")

    public typealias NilLiteralConvertible = ExpressibleByNilLiteral


    @available(*, deprecated, renamed: "ExpressibleByIntegerLiteral")

    public typealias IntegerLiteralConvertible = ExpressibleByIntegerLiteral


    @available(*, deprecated, renamed: "ExpressibleByFloatLiteral")

    public typealias FloatLiteralConvertible = ExpressibleByFloatLiteral


    @available(*, deprecated, renamed: "ExpressibleByBooleanLiteral")

    public typealias BooleanLiteralConvertible = ExpressibleByBooleanLiteral


    @available(*, deprecated, renamed: "ExpressibleByUnicodeScalarLiteral")

    public typealias UnicodeScalarLiteralConvertible = ExpressibleByUnicodeScalarLiteral


    @available(*, deprecated, renamed: "ExpressibleByExtendedGraphemeClusterLiteral")

    public typealias ExtendedGraphemeClusterLiteralConvertible = ExpressibleByExtendedGraphemeClusterLiteral


    @available(*, deprecated, renamed: "ExpressibleByStringLiteral")

    public typealias StringLiteralConvertible = ExpressibleByStringLiteral


    @available(*, deprecated, renamed: "ExpressibleByArrayLiteral")

    public typealias ArrayLiteralConvertible = ExpressibleByArrayLiteral


    @available(*, deprecated, renamed: "ExpressibleByDictionaryLiteral")

    public typealias DictionaryLiteralConvertible = ExpressibleByDictionaryLiteral


    @available(*, deprecated, message: "it will be replaced or redesigned in Swift 4.0.  Instead of conforming to 'StringInterpolationConvertible', consider adding an 'init(_:String)'")

    public typealias StringInterpolationConvertible


    'Objective-C, SQLite3' 카테고리의 다른 글

    스타벅스 텀블러 한정판  (0) 2019.02.04
    mac locate  (0) 2019.02.03
    gcc -static -> Visual studio  (0) 2019.02.02
    자료형에 대해서  (0) 2019.02.02
    mac bluetooth service on and off  (0) 2019.02.02




    'Objective-C, SQLite3' 카테고리의 다른 글

    mac locate  (0) 2019.02.03
    스위프트 소스 중에 가장 중요한 소스 from swift.org  (0) 2019.02.02
    자료형에 대해서  (0) 2019.02.02
    mac bluetooth service on and off  (0) 2019.02.02
    working on graph  (0) 2019.02.02


    개발하다보면, 수많은 자료형을 접하고 만들게 된다.


    상용 프로그램을 만들 때


    단, 하나의 솔루션으로 풀 수 있는 것은 없다.


    그렇다고 매우 어려운 것은 아니다.


    보통 하나의 프로토콜은


    복합적인 자료형의 집합인 하나의 클래스로 해결된다.


    사람이 많아지고 히스토리 관리가 안되면 해당 클래스는 비대하고 비효율적이지만


    하드웨어가 워낙 빨라 큰 문제가 되지 않는다.


    그러나 사용자 수가 늘어나고 보이지 않는 비용이 늘어날 수록 비효율적이 되므로


    늘 리팩토링을 하고 최적화를 항상 고민해야 한다.



    그리고 아토믹한 자료형을 항상 살펴봐야 한다.


    해당 솔루션에 인덱스가 필요한지, 동기화를 계속 해야할지, 정렬이 중요한지, 등


    동기화 때문에 만들어진 솔루션을 사용할 일은 많이 없다.


    그래서 어떻게 만들어져 있는지 구현 방법을 알아야 하고 그 모든 것의 기본은


    malloc을 이해하는 것과 linked list를 구현 하는데서 출발한다.








    자바에서 파라미터 넘길 때 스택도 좋다.


    오버로딩도 되지만... 파라미터 바꾸면, 연계된 너무 많은 것들이 바뀌어서 ^^;;


    Stack<double> s = new Stack<double>();

    s.Push(10.5);

    s.Push(3.54);

    s.Push(4.22);


    double val = s.Pop();


    C++, C# 등... 여러가지 하니 헷갈린다.


    Queue


    Queue<int> q = new Queue<int>();

    q.Enqueue(120);

    q.Enqueue(130);

    q.Enqueue(150);


    int next = q.Dequeue();

    next = q.Dequeue();


    Array


    int sum = 0;

    int[] numbs = new int[10];


    Random rand = new Random();

    for( int i=0; i < nums.Length; i++)

    {

    nums[i] = rand.Next() % 100;

    }


    for (int i=0; i<nums.Length; i++)

    {

    sum += nums[i];

    }

    Console.WriteLine(sum);



    LinkedList




    LinkedList<string> list = new LinkedList<string>();

    list.AddLast(“Apple”);

    list.AddLast(“Banana”);

    list.AddLast(“Lemon”);


    LinkedListNode<string> node = list.Find(“Banana”);

    LinkedListNode<string> newNode = new LinkedListNode<string>(“Grape”);


    list.AddAfter(node, newNode);


    list.ToList().forEach(p=> Console.WriteLine(p));


    foreach(var m in list)

    {

    Console.WriteLine(m);

    }


    Dynamic Array


    ArrayList


    ArrayList myList = new ArrayList();

    myList.Add(90);

    myList.Add(88);

    myList.Add(75);


    int val = (int) myList[1];


    List<T> Class


    List<int> myList = new List<int>();

    myList.Add(90);

    myList.Add(88);

    myList.Add(75);

    int val = myList[1];



    SortedList<TKey, TValue> Class


    SortedList<int, string> list = new SortedList<int, string>();

    list.Add(1001, “Tim”);

    list.Add(1020, “Ted”);

    list.Add(1010, “Kim”);


    string name = list[1001];


    foreach(KeyValuePair<int, string> kv in list)

    {

    Console.WriteLine(“{0}:{1}”, kv.Key, kv.Value);

    }




    이제 진짜 iOS만 해야지.




    'Objective-C, SQLite3' 카테고리의 다른 글

    스위프트 소스 중에 가장 중요한 소스 from swift.org  (0) 2019.02.02
    gcc -static -> Visual studio  (0) 2019.02.02
    mac bluetooth service on and off  (0) 2019.02.02
    working on graph  (0) 2019.02.02
    JAVA C/C++ Objective-C Swift  (0) 2019.02.02


    Bluetooth


    sudo launchctl stop com.apple.blued

    sudo launchctl start com.apple.blued



    [이전] 배달의 민족 개선했으면 하는 사안...


    주문하고 한시간 뒤에 보니 주문 취소가 되어 있었다.


    취소 시각이 나오지 않아 전화해서 물어보니 3분 쯤 뒤였다.


    앱이 켜져 있어서 그랬던 걸까?


    알람도 오지 않았다.


    주문 취소는 해당 업체에서 1시간 30분 이상 걸릴 것 같은 경우 취소를 한다고 한다.


    취소 시각을 해당 업체에 물어봤을 때 취소했을 경우


    아예 내역이 나오지 않는다고 했다.


    아이와 함께 먹을 것을 기다리던 차라 짜증나서 수수료 때문에 일부러 취소했냐고


    물어보니 예전에는 비쌌는데 요즘엔 카드 결제 수수료 정도라서 그렇지 않다고 답했다.


    그만큼 내가 짜증나서 꼬치꼬치 캐물었다.




    카드 결제 수수료 사실 작지 않다.


    배달의 민족으로 유명해진 집은 이제 주문을 거르는 것 같네.


    똑같은 시각에 똑같이 카드 결제를 해 버린 경우 그냥 주문을 받던데 말이다.


    그럼 결론은 뭐냐?


    그냥... 지금처럼 잘 해 달라고.


    사람들이 평점을 즐겨 본다. 그래서 좋은 곳은 더 잘되게 해 준거니...


    easy talk 이제 끝...


    주문 취소가 잦은 업체의 경우 횟수를 알 수 있게 해주면 좋겠다.

    혹은, 제대로된 알림을 주면 좋겠다(이건 아이폰 특성상 힘들것 같으니 전화 걸기로...)


    'Objective-C, SQLite3' 카테고리의 다른 글

    gcc -static -> Visual studio  (0) 2019.02.02
    자료형에 대해서  (0) 2019.02.02
    working on graph  (0) 2019.02.02
    JAVA C/C++ Objective-C Swift  (0) 2019.02.02
    기억나는 고마운 분s  (0) 2019.01.30



    import UIKit


    class jhType4graph_willBeDeleted<T> : jhPanel<T> {

        

        var panelID: Int = 0

        

        var pointCloud = Array<CGPoint>()

        

        override func drawDatas() {

    //        //        worldEllipse(context: mContext, 100, 100, 100, 100, 2, UIColor.blue.cgColor)

    //        

    //        var fx, fy : CGFloat

    //        

    //        var x : Int = 0

    //        for y in (jhDataCenter.mDatas[panelID]?.d)! {

    //            //ref:drawLine(CGFloat(x)*axisDistance + mMargin, mMargin, CGFloat(x) * axisDistance + mMargin, 10000-mMargin)

    //            x += 1

    //            fx = CGFloat(x)*xDistance

    //            fy = CGFloat(y.y)*mVerticalRatioToDraw_view + mMargin

    //            //            drawEllipse(fx, fy, 2, 2, thickness: 2, UIColor.blue.cgColor)

    //

    //            pointCloud.append(CGPoint.init(x: getX(fx+mMargin)!, y: getY(fy)!))

    //            

    //            drawmyRect(fx, fy, 2, 2, thickness: 2, UIColor.blue.cgColor)

    //            

    //        }

        }

        

        fileprivate func roundRect(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat)

        {

            let rectBgColor:     UIColor = UIColor.yellow

            let rectBorderColor: UIColor = UIColor.yellow

            let rectBorderWidth: CGFloat = 2

            let rectCornerRadius:CGFloat = 5

            

            let ctx: CGContext = UIGraphicsGetCurrentContext()!

            ctx.saveGState()

            

            ctx.setLineWidth(rectBorderWidth)

            ctx.setStrokeColor(rectBorderColor.cgColor)

            

            let rect = CGRect(x: x, y: y, width: width, height: height)

            let clipPath: CGPath = UIBezierPath(roundedRect: rect, cornerRadius: rectCornerRadius).cgPath

            let linePath: CGPath = UIBezierPath(roundedRect: rect, cornerRadius: rectCornerRadius).cgPath

            

            ctx.addPath(clipPath)

            ctx.setFillColor(rectBgColor.cgColor)

            ctx.closePath()

            ctx.fillPath()

            

            ctx.addPath(linePath)

            ctx.strokePath()

            

            ctx.restoreGState()

        }

        

        

        fileprivate func drawmyRect(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat, thickness: CGFloat, _ color: CGColor) {

            jhDraw.worldEllipse(context: mContext, getX(x+mMargin)!, getY(y)!, width, height, thickness, UIColor.red.cgColor)

    //        if GS.shared.current_myGraphType == .general {

    //            for x in pointCloud {

    //                mContext?.setFillColor(jhDraw.jhColor(r: 184, g: 70, b: 201, a: 0.1))

    //                mContext?.setStrokeColor(jhDraw.jhColor(r: 184, g: 70, b: 201, a: 0.1))

    //                mContext?.setLineWidth(1)

    //

    //                let rectangle = CGRect(x: x.x-5, y: x.y-20, width: 10, height: 40) //TODO: 좌표 계산 부분  곳으로 몰기.

    //                mContext?.addRect(rectangle)

    //                mContext?.drawPath(using: .fillStroke)

    //            }

    //        } else if GS.shared.current_myGraphType == .first {

                for x in pointCloud {

                    roundRect(x: x.x-5, y: x.y-20, width: 10, height: 40)

                }

    //        }

        }

    }


    'Objective-C, SQLite3' 카테고리의 다른 글

    자료형에 대해서  (0) 2019.02.02
    mac bluetooth service on and off  (0) 2019.02.02
    JAVA C/C++ Objective-C Swift  (0) 2019.02.02
    기억나는 고마운 분s  (0) 2019.01.30
    토막 고민, 커리어에 대한  (0) 2019.01.30



    • java

    MyClass c;

    c = new MyClass();

    c.member = 1;

    c.method();


    • Objective-C

    MyClass *c;

    c = [[MyClass alloc] init];

    c.member = 1;

    [c method];


    • C

    void myFunction(int);


    void myFunction(int a) {

    printf(“ HelloWorld \n”);

    }


    • Objective-C

    @interface MyClass: NSObject


    -(void) myFunction: (int) a;


    @end


    @implementation MyClass

    -(void) myFunction: (int) a

    {

    NSLog(@“HelloWorld \n”);

    }

    @end


    • Java

    class XXX {

    int a;

    int b;

    public static void main(String args[]) {}

    }

    • Obj-C

    @implementation XXX

    {

    int a;

    int b;

    }

    @end

    int main(int argh, char *argv[]) { return 0; }


    • Java

    public int getNumer() { return number; }


    • Obj-C

    -(int) getNumber { return number; }



    'Objective-C, SQLite3' 카테고리의 다른 글

    mac bluetooth service on and off  (0) 2019.02.02
    working on graph  (0) 2019.02.02
    기억나는 고마운 분s  (0) 2019.01.30
    토막 고민, 커리어에 대한  (0) 2019.01.30
    게임 회사가 망해도 돈 버는 사람은 많다.  (0) 2019.01.30

    생각대로되는세상_ 고마운 분s.


    온라인 상으로도 고마운 분이 많다. 그 중 몇 분 기록한다.


    이*비 <******e@naver.com>

    김*래 <****8@naver.com>

    h**** jung <h****y2***@gmail.com>


    이*비 <******e@naver.com>

    0:24 (2시간 전)


    mynameis에게 종이책 후원했습니다.  텀블벅 아이디와 연동된 계정은 이 계정이고 E-book발송을 위한 계정은 ######7@gmail.com입니다. 어디서 보내야 할지 모르겠어서 이쪽으로 보냅니다. 항상 올려주시는 보고글 잘 읽고 있습니다. 다름이 아니라 초고를 받아보고 싶어서 연락드립니다.


    집필 힘내시고 좋은책 만드느라 수고 많으십니다


    김*래 <****8@naver.com>


    mynameis에게  올려주시는 글은 언제나 잘 보고있습니다.

    수능이 끝나고 마침 공부를 시작해볼까 하고 생각하던 차에 초고를 보내주신다고 하셔서 보내봅니다. 날씨가 꽤나 추워졌는데, 감기 조심하시고 건강하시길 바랍니다.


    h**** jung <h****y2***@gmail.com>

    mynameis에게

    최초의 두가지 프로그래밍 언어책출간


    종이책을 후원 했습니다^^ 매번 업데이트 받을때마다 두근두근하네요!

    괜찮으시면 초고 받고 싶습니다. 저는 컴퓨터공학 전공이 아니지만 기계공학 전공의 대학생으로 C언어를 학교에서 수업을 듣고 프로그래밍에 흥미를 가지게 되었습니다. 이후 간간히 코딩을 해보는데 기본기가 부족하다는 생각이 종종 듭니다. 이책이 제게 큰 도움을 줄것이란 생각이 듭니다. 개발자 비화책또한 기대 많이 하고 싶습니다. 부디 견공자제분 DB 가 무사 진행되길 바랍니다. 감사합니다.


    사족이지만, 견공 DB는 뉴스타파가 더 잘 해주는 관계로 공개 사이트는 접기로 하였다.




    젊은 개발자가 많은 지금 내가 고민하는 커리어가 별 공감은 못 얻을 것 같다. 그러나 써 본다.


    이제 내일모레 40이다.

    대기업 나오던 시점에 학교로 다시 돌아갔으면 40에 석/박사를 땄을 텐데, 믓튼 그 길이 아닌 길을 선택할 수 있었던 것은 내가 걸어온 길 위에 학교가 더 뛰어난 적은 없었기 때문이다. 그러나 나와 같이 뛰어난 기술을 보유했던 친구/동기들은 석사를 따고 많은 사람들이 박사 과정 위에 있다.


    석사 따고 삼성 들어오신 분께 들은 몇몇 이야기로 내 생각이 크게 변화하는 계기가 있었는데, 사실 내 생각과는 별개지만 무척이나 객관적이라는 생각이 들었다. 몇몇 이야기로 생각을 풀어본다.


    1. 선배가 말했었다. 회사에서 석사를 따는 것은 야매(가짜) 석사라는 것. 그래서 서울대는 학사라도 충분하다는 것. -> 실제로 삼성의 넘버원인 미래전략실장님도 서울대 학사만 하셨다. 배움의 즐거움을 따르는 사람에게는 정말 수준 낮은말이지만 내가 현실을 뼈저리게 느낄 수 있게 했던 말이었고, 8년 전에 들은 이야기인데 지금도 중간에 석사 따신 분들이 기업에서 일하는 것보다 백그라운드는 학력과 연봉에 크게 연연하는 모습을 본다. 그러나 그들의 연봉에 큰 변화가 없는 것을 보며 깊이 느낀다. 회사에서 연봉의 변화가 있을 때는 실제 성과를 내었을 때뿐이다. 다만, 가방 끈 긴 사람은 능력 있을 “확률”은 높고 연봉 협상에 유리해서 가방끈을 길게 하는 것은 추천한다. 다른 사람 생각과 달리 삼성은 정말 다양한 학교가 모여 있는데,  그것이 조화를 이루는 것이 정말 큰 경쟁력이 되는 것 같다. 물론, 아이비리그 출신 회사원도 많지만 같이 일하면 다른 회사와 달리 연봉 외엔 차별점이 없다.(물론, 파벌은 학교 순이지만 연봉은 학교 순이 아니다.) 몇몇 회사는 서울대, 카이스트만 선호한다는 것을 학생도 다 알고 있다. 심심찮게 나오는 교수진의 성추행이나 비리, 세계 순위에서 멀리 밀려있는 국내 학교 순위를 볼 때, 학력은 특히나 프로그래밍 분야에서는 괜찮은 개발자가 나올 만한 확률이 조금 높을 뿐이라고 생각해야 한다. 물론, 그 확률이 난 중요하다 생각한다.


    2. 학교,... 그 외의 길로 멘사 공부를 해서 멘사를 따거나 다른 자격증, 특허, 특이한 경력을 쌓는 경우가 많더라. 이건 나의 경우에 일부 해당하는 것 같은데 사실 나는 재미로 했지만 최근 학생을 가르치면서 많이 느낀다. 동일 선상의 경쟁 구도에 있었는데 경쟁에 패배한 것에 대한 보상 심리라고 하는 것이 옳겠다. 아예 그것이 재미있어서 경쟁 자체를 하지 않고 자기 길을 파는 친구가 있으면 좋겠지만, 나도 나 같은 케이스는 한 명밖에 보지 못했고 그 친구는 데브피아 시삽 하다가 혼자만의 영역을 구축했는데 지금은 나와 같이 시대에 뒤쳐진 것 같다. 가진 것을 나누지 않았다면 아마 달랐겠지만, 리처드 스톨만의 FSF가 제창한 GPL이 만든 "OPEN" 문화의 큰 물결로 늦게 시작한 사람이 차라리 "정수"를 빨리 배우는 효과를 가졌다. 그리고 코딩보다는 그런 주워들은 말을 많이 아는 고학력자가 이미 자리를 꿰차서 국내에서 괜찮은 서비스로 세계와 경쟁할 수 있는 경쟁력을 잃었다. 국내 사람들은 비판하면서 정작 자기 세계는 없고, 그들의 말을 번역/인용하기 바쁜 사람들이 만든 유리 천창 안에서 무슨 경쟁력에 대한 패기가 있을까? 그나마 삼성이 괜찮은데 그런 사람들의 특징이 삼성 까기(그러다가 다시 빨아주고 삼성으로 들어가는 경우도 보니...) 맞는 부분도 있고 아닌 부분도 있다는 것을 이제 인정해야 할 것 같다.


    3. 이런 일 저런 일 다 떠나서 재미있으면 그만이다. 그런데 최근 느낀 것이 LOW LEVEL이 아닌 상위단으로 갈수록, 그쪽에서 일하는 프로그래머를 만날수록 더욱 오픈해서 이야기하는 문화가 짙어서 좋았다. 내가 나이를 많이 먹어서 그럴 수도 있을 테고, 그들이 이제 오픈을 해도 딱히 자기 연봉에 별 상관이 없기 때문일 수도 있겠다. 그리고 최상위 단부터 시작해서, 임베디드 단까지 디버깅이 되고 프레임워크도 만들 수 있을 때는 딱히 무리 지어서 일하는 것보다 혼자 일하는 것이 더 맞다는 것을 알게 되었다. 조인해서 일하는 것보다 혼자 설계하고 그것을 할 수 있는 사람에게 일을 맡기는 것이 더 편리하는 것도 알게 되었고. 거기에 걸맞을 사람을 뽑는 것은 정말 힘든 일인 것도 알게 되었다.


    4. 큰 곳은 큰 곳에서 해 볼 수 있는 일이 있고, 작은 곳에서는 거기에 걸맞은 일이 있다. 연봉은 급성장하는 작은 곳에서 오픈소스를 쓸 때 많이 받는다는 생각이다. 또한 오픈된 모듈이 잘 만들어진 프로그래밍 언어를 다양하게 구사하는 것이 개발 속도가 빠르다는 것은 당연한 이치이다. 시스템, 아키텍처, 모듈을 끊고 붙일 수 있는 개념을 알고 그것을 잊는 프로토콜을 사용하거나 설계할 줄 알고 만들 줄 알며 더 나은 방향이 있을 때 바꿀 수 있는 유연성 있는 설계를 할 수 있다면 참 좋다. 그러나 최근 자체 구축하던 서버를 아마존으로 다 바꾸는 짓을 했는데 비용은 늘어도 몇몇 말하기 좋아하는 사람이 알고 있는 어중이 개발자가 회사로 오게 만드는 판을 깔려고 했다. 테스트 개발이 끝나면 EC2로 모든 서비스를 있고 RDS에 데이터 저장하고, DynamoDB에 가공할만한 데이터 저장하고 node로 데이터 부르게 백앤드 짜고, React로 프런트 짜고, Android/iOS 네이티브 앱으로 반응성 최고의 앱을 만드는 것(이미 80% 이상은 그렇게 했고). 물론, 그 연결 구조는 복잡해서 조언하는 프로그래머들이 웬만하면 회사로 오지 않을 테고 왔을 때 성과 못 내게 개 삽질하고 내 후임들이 프레젠테이션도 더 잘하고 더 힘을 쓸 수 있도록 판을 짜 두었다. 내가 가르쳤던 학생들이라 ㅡㅡ; 나야 어디 가든 상관없다. 다만 3개월의 조사를 해 보니, IT도 의료 쪽 보다는 금융 쪽이 확실히 돈이 된다는 것을 알게 되었다.


    5. 평생 돈을 좇아본 적이 없었다. 지금은 180도 바뀌었지만, 삼성전자 재직 7년 동안 월급 명세서 단 한 번도 보지 않았었다. 버는 만큼 썼고, 기부도 많이 했다. 가난할 때도 다른 사람이 그 길이 맞다고 할 때도 내가 생각한 길을 갔었다. 학점 낮아도 프로그래밍으로 전액 장학금 받고 그 외에 다른 일도 많이 했었다. 내가 느낀 결론은 "재미"를 쫓으면 모든 것이 따라온다는 것이다. 다만 공부할 기회를 2번 놓치고(고려대/아주대) 결국 선택에 대한 책임은 고스란히 나에게 다시 돌아온다는 것을 알게 되었다. 조금만 더 부유했더라면 조금만 더 나를 희생하지 않았더라면 하는 고민이 있고 내가 아는 형이나 선배들의 이야기를 들어봐도 나는 이상할 정도로 희한한 선택들을 한 것 같다. 그래서 얻게 된 것은 지금 내가 가진 모든 것을 잃더라도 선택할 "용기"를 얻게 되었다. 그것이 "객기"던 "미친놈"이던... 과거에는 40을 목전에 둔 사람이 이런 생각을 가지고 있을 거라고 상상도 하지 못했다.


    6. 난 패러렐 하게 모든 것을 배치하지만 실제로는 정말 싫어한다. 가령 친구가 업무 보러 가던 길에 근처에 들러 커피 마시고 가는. 것을 정말 싫어한다. 순수하게 나를 보러 와줬으면 한다. 내 스케줄을 그런 사람 안 만나는데 쓰면 손수 회사 근처로 와서 고기와 커피 사주고 가는 사람을 만날 수 있다. 물론, 받은 그대로 혹은 이상으로 돌려주는 것이 내 어머니께 배운 철칙이다. 또한, 사람을 고르지 말라고 하셨지만 이제 골라야 할 것 같다. 그래서 블러핑 해서 뭘 하자고 하고 하루 4시간 이상 개발에 시간을 쏟을 때 정작 자신들은 10분도 쓰지 않고 간간히 전화 통화로 안부를 묻는 척하는 관계를 모두 끊었다. 블로그도 폐쇄했다. 솔직하고 진솔한 정보를 굳이 나눌 필요가 있을까? 책 쓰고, 내가 배우기도 바빠 죽겠는데.


    7. 인터넷에 보면 실무를 조금 해보고 이론을 세워 쓰는 글이 참 많다. 예전에는 책과 함께 그런 글도 비판했었지만 지금은 딱히 비판하고 싶지 않다. 너무도 많은 Noise가 있는 것도 사실이지만 무시 혹은 필터링, 발췌, 속독 기술을 순수하게 쓰거나 응용하면 모든 데이터는 정보가 되기 때문이다.


    그 외의 생각도 많지만, 각자의 경험은 다르고 또 "다름"은 매우 소중한 것. 커리어에 대한 고민에 마침표를 찍으면,


    8. 이제는 재미와 더불어 "돈"도 매우 중요하게 생각하게 되었다.

    돈을 좇으면 사람이 신비롭게 된다. 드러낼 수 있는 개인정보나 철학과 같은 생각을 말할 수 없게 되기 때문이다. 그래서 일하는 분야를 바꾸었다. 7~8월 에트리 강의가 끝나면 내 연봉이 40% 업되는 곳으로 이직을 하게 된다. 지금 생각해보면 왜 진작 그런 노력을 하지 않았을까?라는 생각도 든다. 자본주의 사회에서 다들 바보라고 하는데 말이다.


    한편으로는 어린 시절의 내가 지금의 나를 보면 매우 부끄러워할 것 같다. 그나마 그 속에서 또 다른 "재미"를 찾아봐야겠다.


    --------------------------


    몇 달 전 썼었던...


    내 인생에서 역대 최고의 연봉을 받고 가기로 했었던 회사는 대표가 구속되면서 끝났었다.


    http://www.polarisfunding.co.kr/


    되게 신기한 것은 면접 보고, 대표와 회식하고 와서 주변 사람들에게 사짜 냄새 난다고 했었다.

    사짜 냄새가 너무 나지만 금융권 가보겠다고... 했는데 헐... 세상 참.


    믓튼 그렇게 난 의료업에 계속 남게 되었다. 삼성전자에서 모바일 7년, 의료업 4년...


    기술 스택은 모바일 분야만 10년이다.


    주변을 둘러보면, 같이 시작했던 이들 중에 10%만 개발자로 남는 것 같다.


    왜 그런지는 뼈저리게 느끼고 있다.


    결국 다시 재미라는 마약을 먹어 본다.



    결국 젬 보상 못 받았다.


    데빌리언이라는 모바일 게임에 40만원 썼다. 돈 버는 놈은 따로 있다.


    리니지M팀에 지인이 있는데 출시한지 얼마 안되어 보너스 8천 받았다고 좋아하더라.(물론, 직급마다 달라서 누군지 유추도 가능하기에 정확한 액수를 적은 것은 아님 +- 있음)


    돈보다 중요한게 많지만 돈 버는 놈들 때문에 그 중요한 것들이 모두 사라진다.


    어떤 스타트업은 하루의 80% 이상은 돈 이야기 밖에 안하던데


    그런 이야기도 건전함과 아닌 것이 있듯이...


    차라리 수개월 동안 공지를 했던 이런 게임은 좀 낫다.


    ㅡㅡ;



    안녕하세요. 데빌리언입니다.


    먼저, 지난 8월 31일 경 안내 드렸던 서비스 종료에 대해 상세 일정을 안내해 드립니다.


    데빌리언을 아껴주신 모든 분들께 어려운 결정의 소식을 전달해 드리게 되어
    너무나 죄송스러운 마음입니다.


    2016년 11월부터 함께 한 데빌리언은, 2017년 11월 30일 자로 서비스 종료라는
    어렵고도 아쉬운 결정을 내리게 되었습니다.


    지속적인 서비스를 제공해 드리지 못하게 된 점, 다시 한 번 사과의 말씀 드리며
    앞으로 더 좋은 게임으로 여러분을 찾아뵐 수 있도록 최선을 다하겠습니다.


    서비스 종료 및 커뮤니티 폐쇄와 관련된 내용은 아래를 참고해 주시기 바랍니다.


    [ 서비스 종료 안내 ]
    ■ 서비스 종료일: 2017년 11월 30일(목)


    [ 서비스 종료로 인한 환불 안내 ]
    ■ 환불 조건
    1) 서비스 종료일을 기준으로 보유하고 계신 젬에 대해서만 환불이 가능합니다.
    2) 보유하고 계신 젬 중 순수 결제를 통해 획득하신 부분만 환불 대상에 포함됩니다.
        ※이벤트 및 게임 내 시스템을 통해 무료로 획득하신 젬은 환불 대상에서 제외됩니다.
    ■ 환불 신청 기간
    : 2017년 11월 30일(목) ~ 2017년 12월 30일(토)
    ■ 환불 신청 방법
    : 보유 중인 젬 스크린 샷, 결제 내역 스크린 샷, 개인정보 (CS 코드, HIVE ID, 캐릭터 닉네임, 서버 등)을 포함하여

     HIVE 고객센터로 환불 신청 ☞ HIVE 고객센터 바로가기


    [ 커뮤니티 폐쇄 안내 ]
    ■ 커뮤니티 폐쇄일: 2018년 2월 28일(수)
    ■ 커뮤니티 폐쇄 관련 상세 안내
    1) 서비스 종료일 (2017.11.30) 기준으로 신규 가입은 불가합니다.
    2) 커뮤니티 폐쇄 이후에는 자료 복구가 불가합니다.
    3) 저장하실 자료가 있으신 경우, 커뮤니티 폐쇄일 전에 개인적으로 저장을 부탁드립니다.


    안내 드린 내용을 포함하여 궁금하신 부분이 있으시다면
    HIVE 고객센터(http://www.withhive.com/help/inquire)로 문의 부탁드립니다.


    그동안 데빌리언에 아낌없는 애정과 관심을 보내주신 부분에 다시 한 번 감사의 인사 드립니다.


    감사합니다.




    [출처] [안내] 데빌리언 서비스 종료 및 커뮤니티 폐쇄 안내 (비공개 카페)


    + Recent posts