'2018/03'에 해당되는 글 10건

  1. 2018.03.21 Dart2 훑어보기 - 1
  2. 2018.03.21 APK 크기 비교
  3. 2018.03.21 事必歸正
  4. 2018.03.21 HakerRank
  5. 2018.03.21 머신러닝 단기 집중 과정
  6. 2018.03.21 Flutter
  7. 2018.03.21 노래 두 곡
  8. 2018.03.21 음식물 쓰레기

Dart2 훑어보기 - 1

개발 2018. 3. 21. 08:11

2018.03.17


* Dart2를 A Tour of the Dart Language 문서를 바탕으로 간단히 정리해 본다. 


공식 안내 문서의 첫 번째 예제 샘플을 살짝 수정하여 테스트해 봤다. 


Hello Dart2 :)



결과




코드를 통해 알 수 있는 특징들.

  • Indent block은 2칸. 
    • 강요 사항은 아니겠지만 로마에선 로마법을 따르는 것이... (Effective Dart: Style 참조)
  • 코드 내의 Comment는 //로 사용하면 된다.
  • main()이 시작점이다.
  • 변수 선언은 var로 한다. var로 변수를 선언할 경우 타입은 알아서 판단한다.
    • (당연하지만) 명시적으로 타입을 지정하여(String) 변수를 선언할 수도 있다.
  • 함수 선언 시 리턴 값이 없는 경우(void) 생략이 가능하다.
    • 그렇다면 리턴 값은 var가 될 수 있을까?

안된다.

  • console 출력은 print. 변수를 출력하고 싶을 때는 $[변수명] 또는 ${[변수명]}
    • 코드의 끝에는 ';' 붙여야 한다. (대부분의 언어에서 당연한 건데 요새 주 개발 언어가 swift / python이다 보니 새삼스레 눈에 들어온다.)



코드를 통해서는 보이지 않지만 안내서에 나와있는 알아두어야 할 기본적인 사항들

  • Dart의 모든 것은 Object 클래스에서 파생된 object이다.( Everything you can place in a variable is an object, and every object is an instance of a class. Even numbers, functions, and null are objects. All objects inherit from the Object class.)
  • var 말고 num 같이 지정된 정적 타입으로 변수를 선언하면 사용자의 의도가 분명해지고, 해당 변수에 대해 정적 타입 검사가 가능하다. (var를 쓰기보단 사용 의도를 확실히 하도록 정적 타입으로 변수를 선언하는 것이 좋을 것 같다.)
  • Strong mode : Strong mode에서는 정적 검사 및 런타임 검사를 실행함으로써 런타임 전에도 코드 오류를 잡을 수 있다고 하는데 Dart2에서는 Strong mode가 선택 불가한 기본 사양이라고.. Dart1을 접하지 않았던 나에게는 그냥 넘어가도 되는 이야기 같다.
  • 함수 내에서 함수를 만들 수 있다.
  • public / private / protected 같은 접근 제한자가 없다. 다만 _(밑줄)로 시작하는 식별자는 비공개라고 한다. (이거 마음에 든다.) 
  • 식별자는 문자 또는 _(밑줄)로 시작한다.
  • 다트 도구는 경고 및 오류의 두 가지 종류의 문제를 보고 한다. 경고는 코드가 작동하지 않을 수도 있지만 프로그램 실행을 방해하지는 않는다. 오류는 컴파일 타임 또는 런타임 시로 나누어 볼 수 있는데, 컴파일 타임 오류일 경우는 코드가 전혀 실행되지 않고, 런타임 오류일 경우는 코드가 실행되는 동안 예외가 발생한다.
  • 값이 할당되지 않은 모든 변수의 초기값은 null이다.


좀 더 코드를 뜯어보면.

  • void printNumber(num aNumber)에서의 num은 무엇인가?

Dart의 Built-in Type 중 하나. Dart에는 아래와 같은 Built-in Type이 있다고 한다.

  • Number : 숫자. subtype으로 int, double가 있다. 결국 저 num은 int 또는 double 형태의 변수를 의미한다. int의 범위는 -2^53 ~ 2^53. double은 64비트형. int, double로 명시적으로 써도 되고 num으로 퉁쳐도 되는 것 같다.
  • String : 문자열
  • Boolean : true / false
  • List : [1, 2, 3]
  • Map :   key, value로 구성.

var map = {

  'hello': 'world',

  'name': 'genkino'

};


var code = {

  42: 'Answer to the Ultimate Question of Life, the Universe, and Everything',

  52: 'genkino's nickname'  

};

  • Runes : UTF-32 코드값으로 이루어진 문자열. 다른 언어에서 보지 못한 독특한 자료형이다.

var clapping = '\u{1f44f}';


Runes input = new Runes(

  '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');

 print(new String.fromCharCodes(input));


뭐.. 이런 식으로 사용된다고 한다. 다양한 이모티콘이 출력된다.


  •  Symbol : 안내서를 봤을 때는 명확히 이해가 가지 않는다. Dart에서 선언된 연산자 또는 식별자라고 하는데 꼭 사용할 필요는 없지만 이름으로 식별자를 참조하는 API의 경우에는 식별자 이름이 변경되지만 식별자 심벌은 변경되지 않으므로 쓸만하다(?)라는 설명이 붙어있다. unique id 같은 용도인가..? 이 부분은 Dart를 좀 더 사용하면서 자연스럽게 알게 될 것이라고 기대(;;) 해 본다. 


하나만 더 확인하고 넘어가자면

  • final / const : 둘 다 선언하면 값을 변경할 수 없다는 공통점이 있는데 약간의 차이가 있다. final의 경우는 한번 값을 할당하면 재 할당을 할 수 없다는 의미라면 const의 경우는 상수같이 사용된다는 의미..?(컴파일 타임에 상수처럼 사용된다..?) java에서의 final과 c에서의 const가 연상된다.

final과 const의 차이를 눈으로 확인할 수 있는 코드를 만들어 보았다.


// Code

...

final DateTime now = new DateTime.now();

const DateTime coNow = new DateTime.now(); 

now = new DateTime.now();

...


// Run

Warning: Cannot resolve setter.   

now = new DateTime.now();   

^^^ 


main.dart:11:26: Error: Not a compile-time constant.   

const DateTime coNow = new DateTime.now();

                                              ^^^^^^^^^^^^^^^^^^


new DateTime.now()의 값은 실행 시에 결정되는 값인데 final / const는 각각 다르게 반응한다.


final의 경우 컴파일 시 에러가 나지 않지만 한번 값이 할당되면 재 할당을 할 수 없다. (Warning에 setter가 없다고 나온다. getter만 있다는 설명이 더 명확한 듯) 실행 시에 결정되는 값을 할당할 수 있다.


const는 실행 시에 결정되는 값은 할당할 수 없다. 애초에 런타임 전에 정해지는 값만 할당 가능하다. (24라던가 24*2 라던가 'hello world' 라던가...)


하나 더 만들어 봤다.


  • const list = [1, 2]; 는 에러. 
  • const는 const 성격의 값만 할당이 가능하다. 아마도 list는 런타임 시에 값이 정해지는 타입인 것으로 보인다.
  • final의 경우는 앞의 예제에서도 확인했듯이 런타임 시에 값이 정해지는 타입도 할당 가능.
  • const로 할당된 값(Instance)은 각자 다른 변수에 할당하더라도 같은 Instace이기 때문에 비교를 하면 true
  • const가 아니라면 같은 값일지라도 다른 instance이기 때문에 비교 시 false

아직 명확하지는 않고 쓰임을 어떻게 구분할지 아직 확실히 들어오지는 않다만,

  • final은 setter가 없이 getter만 존재하는 형태.
  • const는 상수처럼 취급.

으로 정리해본다.


오늘은 여기까지.






Posted by 52
TAG DART

댓글을 달아 주세요

APK 크기 비교

개발 2018. 3. 21. 07:56

2018.03.16


https://android.jlelse.eu/comparing-apk-sizes-a0eb37bb36f


* 아침에 재미있는 글을 보게 되었다. 안드로이드 환경에서의 개발 언어별 APK 크기 비교 글이었는데 링크된 글을 읽어보면 알겠지만  java(539k) / kotlin(550k)에 비해 react(7M) / flutter(7.5M)는 거의 10배 이상 차이가 났다. 아무래도 좀 크긴 하겠지라고 생각했지만 10배 이상이라니...


react나 flutter의 경우에는 아무래도 하나의 Layer가 더 필요하기 때문에 이런 결과가 나왔다고 보는데 테스트에 사용된 앱은 매우 단순한 앱이기에 일반적인 앱에서의 크기 비교가 궁금하다. 단순히 드는 생각에는 앱이 복잡해지거나 다양한 기능이 제공된다고 해서 react 또는 flutter의 베이스에 해당하는 라이브러리의 크기가 그에 따라 기하급수적으로 커질 것 같지는 않고 어느 정도 크기에 수렴될 것 같아서 어느 정도 이상 크기의 앱이라면 저 정도(10배 이상) 차이는 나지 않을 것이라는 생각이 드는데 관련된 내용을 한번 찾아봐야겠다.


스마트폰의 램이나 저장공간의 기본 사양이 매년 상향됨에 따라 어느 순간부터 개발에 있어 이러한 부분은 크게 신경 쓰지 않았었다. 그런데 글을 읽고 보니 - 이렇게 10배 이상 차이가 날 수도 있다면 - 일반적인 안드로이드 환경도 그렇지만, 특히나 안드로이드 Go처럼 상대적으로 저사양, 저용량이 맞춰진 플랫폼에서는 더더욱 배포본의 크기도 신경 써야겠다는 생각을 하게 되었다.





Posted by 52
TAG Android, apk

댓글을 달아 주세요

事必歸正

Logs/기록 2018. 3. 21. 07:55

2018.03.14


* 여전히 많은 충돌과 수고로움이 있지만 다행스럽게도 많은 일들이 다시금 바른쪽으로 방향을 잡아가고 있다고 생각되는 요즈음이다. 


과정이 순탄할 리 없고 앞으로 또 어떤 불합리하고 어이없는 일들이 발생할지 예측할 수 없겠지만 이 모든 과정과 바로잡기 위한 노력들이 반드시 결실을 맺어서 모든 일은 반드시 바른대로 돌아간다는 의미의 事必歸正의 본보기로서 후대에까지 귀감이 되었으면 좋겠다.


정의로운 나라, 통합의 나라, 원칙과 상식이 통하는 나라를 위한 여정을 위한 출발선 상에 드디어 설 수 있을 것 같다는 희망이 조금씩 커져가니 지금까지 하도 좌절을 맛본지라 불안하면서도 큰 기대가 된다.





Posted by 52

댓글을 달아 주세요

HakerRank

개발 2018. 3. 21. 07:53

2018.03.09

딱 하나의 테스트 케이스에 한해 테스트 실패도 아니고 런타임 에러... 참으로 감질나는 상황이다.



HackerRank를 다시금 틈틈이 해보려고 마음을 먹은 지 한 2주일 정도 된 것 같다.


이전에 한참 이런 식의 것이 유행(?)했을 때 따로 시간을 마련해서 - 뭐 월, 수, 금 몇 시부터 한 시간.. 이런 식으로 - 작정하고 해보자고 마음먹었었지만, 딱 그 시간에 맞춰 도장 깨기 하듯 문제를 차례차례 박살내기가 쉽지 않았다. 무엇보다 업무나 다른 일상에 차이면서 우선순위가 낮다 보니 문제를 풀기는커녕 그 시간을 마련하는 것조차 쉽지 않았다.


그래서 이번엔 그냥 틈틈이 생각나는 대로 한 문제씩만 - 뭐 시간이 되면 2, 3 문제도 좋지만 - 풀어보자고 생각하니 가벼운 마음으로 풀 수 있게 되었다. 게다가 하루 정도 사이트에 들어가지 않으면 이메일로 '너 문제 안푸냐? 이 문제 한번 풀어볼래?'라는 식의 메일을 툭 던져주는데 그때 시간을 한 10-20분 정도 집중하여 할애하면서 푸는 것도 꽤 효과가 있었다. 


그나저나, 테스트 실패는 많이 겪어봤는데 런타임 에러는 처음이라 무지 당황했다. 아마도 무한루프라던지 스택 오버플로우라든지 그러한 상황이 아닐까라는 추측을 하면서 코드를 리뷰해봤지만 도무지 감이 잡히지 않았다.


결국엔 저 10번 샘플의 입력값을 받아보고 나서야 - 받자마자 - 아! 하는 탄식과 함께 코드를 수정했고 겨우 통과를 했다. 입력 값을 알기 전까지는 코드 어느 부분이 오류인지 전혀 예측조차 못했는데 입력 값을 보자마자 코드 상의 오류가 눈에 확 들어오는 게 어이없기도 하고 웃겼다. 아마도 테스트 케이스가 없었다면 난 내가 짠 코드에 오류가 있는지도 몰랐을 것이다. 


HackerRank를 통해 배운 점은 아래와 같다.


* 시간을 정해놓고 하는 것보다 남는 시간 틈틈이 하는 것이 효과가 있는 경우도 많다.

* 코드를 작성할 때 테스트 케이스는 반드시 필요하다.

* 문제를 제대로 해결하는 코드라고 해도 HackerRank의 테스트 케이스 중에서는 시간 제약으로 인해 실패하는 경우도 많다. 이 경우에는 다른 방법의 해결책을 생각해 봐야 하는데 이 경우 문제의 본질을 제대로 파악하는 것, 다른 시각으로 문제를 바라보는 것이 필요하다. 



아직까지는 습관이 되었다고 하기엔 애매한 상황인데 꾸준히 함으로써 습관을 들여놓고 싶다.





Posted by 52

댓글을 달아 주세요

2018.03.07


* 구글에서 개발자를 위한 머신러닝 단기 집중 과정 코스를 열었다. 


https://developers.google.com/machine-learning/crash-course/


강의를 제공한다는 뉴스를 접했을 때, 기사 내용 중 이제 머신러닝에 대해서는 모든 사람이 제대로 아는 것이 중요하다는 생각이 들어서 과정을 만들었다는 이야기를 언뜻 봤었다. 놀랍게도(?) 한글이 지원되며 강의 동영상은 자막이 지원되겠거니 라고 생각했는데 한글 더빙으로 강의가 나온다. 인트로 강의를 다 보고 나서야 알게 된 내용이지만,


이 동영상 강연의 음성 더빙은 머신러닝 기술을 사용하여 생성되었습니다. 위의 의견 보내기를 클릭하고 버그 신고서 및 제안사항을 제출하여 Google에서 음성 더빙 기술을 개선하도록 도와주세요.

이라고 언급이 되어 있었다. 그렇다면 영어 음성을 인식해서(뭐.. 가능한 절차고) 이를 구글 번역으로 번역한 후(이것도 이젠 꽤 자연스럽게 가능하고) 번역한 문장을 읽는다(뭐... 이건 이제 놀랍지도 않지만)는 건데 나눠 놓고 보면 그다지 신기할 것이 없다고 생각해도 이 과정이 매끄럽게 반영되어 있다는 생각을 하니 새삼 놀랍다. (영상에 나오는 화자의 나이대와 분위기를 분석해서 그에 어울리는 목소리로 나와주면 더더욱 놀랐을 텐데 ㅎㅎㅎㅎ)


인트로 영상에서 아래와 같은 내용이 나온다.


이제 머신러닝을 숙지해야 하는 세 가지 실질적인 이유 외에 철학적인 이유도 있습니다. 머신러닝은 문제에 관해 생각하는 방법을 바꿉니다. 소프트웨어 엔지니어는 논리적이고 수학적으로 사고하도록 훈련을 받았습니다.  내 프로그램의 속성이 옳다는 것을 입증하기 위해 주장을 사용하죠. 머신러닝이 있으면 수리과학에서 자연과학으로 초점이 바뀝니다. 불확실한 세계를 관찰하고 실험을 하고 논리가 아닌 통계를 사용하여 실험 결과를 분석합니다. 과학자처럼 사고할 수 있는 능력을 갖추면 시야가 넓어지고 전에는 탐험할 수 없었던 새 영역이 펼쳐집니다. 그럼 그 여정을 즐기며 탐험하시기 바랍니다.


요컨대 관점이 바뀌면서 지금과는 다른 시각으로 문제를 바라볼 수 있게 된다는 이야기인데 부끄럽게도 이러한 시각으로 바라본 적은 없었다. 그저 새로운 기술이라고만 생각했던 나의 관점에도 새로운 변화가 있어야겠다는 자각이 든다.

Posted by 52

댓글을 달아 주세요

Flutter

개발 2018. 3. 21. 07:47

2018.03.02


Flutter라는 구글의 모바일 UI Framework를 보게 되었다. 마치 React Native처럼 하나의 소스로 iOS / Android 앱을 개발할 수 있게 해주는 Framework인데, 구글에서 지원을 한다는 점이 눈길을 확 끈다.


https://flutter.io/ 에서 튜토리얼을 따라 Hello, world급 샘플 코드를 만들어봤다. Flutter를 사용하기 위해 사전 설치 작업이 있긴 했지만 React Native에 비해 간단하다.


언어는 Dart라는, 한 때 구글이 자바스크립트의 대체 언어로 야심 차게 개발했다는.. 크게 주목받지 못하고 잊혀 가고 있던 언어가 사용된다. 난 처음 사용하게 되었는데 생각 외로 익숙하다.




한 10여분 따라 하다 보니 꽤 이쁜 모바일 앱이 완성되었다. 


개발 IDE로 안드로이드 스튜디오와 함께(IntelliJ IDEA도 가능하다고 한다.) VSCode를 지원한다는 점도 개인적으로는 마음에 든다.


PWA에 흥미가 있어, 그걸 본격적으로 파보려고 하던 중이었는데 이것도 흥미가 생긴다. 그나저나 이제 모바일 앱 개발 환경은 이런 식의 원 소스 멀티 타깃 플랫폼이 결국 대세가 되는 걸까? 구글은 안드로이드 개발 환경에 Kotlin을 추가하고, PWA도 적극적으로 미는 듯하더니 이젠 Flutter까지 내놓는 걸 보면 각자의 역할이나 분야가 조금씩 다르다고는 하지만 일단 이것저것 내놓고 나면 뭐 하나는 되겠지라는 생각인 건지, 나 같은 일개 개발자는 새로운 것이 많아져서 신기하면서 신나긴 하지만 그만큼 봐 둬야 할 것이 많아지니 헉 소리가 난다.

Posted by 52
TAG Flutter

댓글을 달아 주세요

노래 두 곡

Logs/기록 2018. 3. 21. 07:46

2018.02.16


* 요새 심금을 울리는 노래 두 곡.


1. 기억해 줘
- 얼마 전 봤던 애니메이션 코코의 주제곡. 애니메이션의 마지막 즈음에 코코가 아버지의 그 노래를 기억하는 장면에서 눈물을 펑펑 쏟은 후로 이 노래는 눈물샘을 자극하는 열쇠가 되어버렸다.  


국내에서 윤종신 씨가 부른 '기억해 줘'는 뭔가 담담하고 쓸쓸한 목소리가 더 감정을 자극하는 것 같다. 애니메이션 상의 그 아버지의 '한'을 생각하자면 나로서는 이입이 될 수밖에 없다.


써 놓고 보니 코코가 주인공이라고 느껴질 수도 있겠지만 게임 '젤다의 전설'의 젤다 같은...


2. 엔딩 크레딧
- 엄정화 씨의 신곡. 곡 분위기도 좋지만 역시나 가사가 좋다. 아무리 멜로디와 가사가 좋다고 한들 엄정화 씨 정도의 위치에 있는 분이 부르지 않고서야 이러한 느낌이 들까 싶다.


언제나 늘 새로운 천재(?)들이 새롭고 신선한 음악들을 들고 나온다지만 이렇게 젊을 때부터 열광했던 가수가 같이 세월을 견디어 가면서 꾸준히 공감할 수 있는 음악을 들고 나와 준다는 것이 얼마나 감사한 일인지.

Posted by 52

댓글을 달아 주세요

음식물 쓰레기

Logs/기록 2018. 3. 21. 07:43

2018.01.11


* 설거지를 하는 데 있어서 개인적으로 제일 번거로운 일이 음식물 쓰레기를 처리하는 일이다. 버려지는 음식물 찌꺼기들이 싱크대 배수구 거름망에 모두 모여지면 그걸 탈탈 털어서 음식물 쓰레기 비닐 같은 것에 모아야 하는데 요령이 없는 건지 늘 깔끔하게 처리하기가 힘들다. 비닐에 탁탁 음식물 찌꺼기들을 털어놓는다고 해도 망 사이에 낀 잔존물들도 최대한 깔끔이 그러모아 버려야 하는데 매번 하는 일이지만 참 짜증 나는 일이다.


예전에 잠시 음식물 분쇄기 같은 걸 써 본 적이 있었지만 야채의 경우는 제대로 갈리지도 않고 작게 갈렸다고 하더라도 그게 하수구 구멍으로 들어가면 문제가 많다는 것을 알고 난 후부턴 사용하지 않았다.


* 가능하면 음식물 쓰레기를 만들지 않으려고 개인적으로 무척 노력하는 편이지만 가족 중 나 혼자 노력한다고 될 일도 아니기에 늘 식사를 마치고, 설거지를 위해 식탁을 치우다 보면 애매하게 남은 음식들이 보인다. 보관하기에도 애매하고 그렇다고 버리기도 애매한 수준의 음식들.


국물이 없는 것들이면 대충 그러모아 음식물 쓰레기를 모아놓는 비닐에 탈탈 털어놓으면 되겠지만 그럴 수 없는 것들이 대부분이라 조금이라도 거름망을 통해 지저분하게 음식물 쓰레기를 그러모아야 하는 일을 줄이고자 그냥 먹는데 문제가 없는 음식이라면 그냥 내 입에 버린다(?)


이래서 소식을 결심해도 내가 소식을 못해.라고 혼자 한탄하기도 하지만 애매하게 남은 멀쩡한 음식을 버리는 것보다는 심적으로 편하긴 하다. 뭐.. 자기 위로 정도의 수준이다.


오늘도 가족이 식사를 마치고, 애매하게 약간 남은 계란찜을 바라보다가 숟가락을 들고 우걱우걱 내 입에 털어 넣었다. 그다음 평소처럼 설거지를 하고 또 배수구 거름망의 음식물 쓰레기들을 비닐에 탈탈 털어 넣는데 순간 아까 약간 남은 계란찜을 내 입에 털어 넣었던 기억과 함께, 내가 음식물 처리기가 된 것 같은 느낌이 들면서 볼록 튀어나온 내 배가 음식물 쓰레기장처럼 느껴졌다. 아...


나는 비교적 무난하게 사람 노릇도 하면서 처리하기 애매한 음식물 처리 기능도 있는 - 게다가 처리 용량도 불룩한 내 배만큼이나 적지 않은 - 꽤 괜찮은 가정용 모델(?)이구나.라고 생각했다.


아. 음식물 쓰레기 처리는 정말 귀찮은 일이다.

Posted by 52

댓글을 달아 주세요