Log

개발 블로그
[Kotlin] 코드 실행 시간 측정

[Kotlin] 코드 실행 시간 측정

수행 시간 측정 val startTime = getCurrentTime() // do something val endTime = getCurrentTime() println("elapsedTime : ${endTime - startTime}") 일반적으로 성능을 측정할때는 어떤 기능을 수행하는데 걸리는 시간을 측정합니다. 위 코드는 어떤 기능을 수행하는데 소요된 시간을 보여줍니다. Java Java에서는 시스템의 시간을 가져오는데 기본적으로 System.currentTimeMillis(), System.nanoTime()을 제공합니다. System.currentTimeMillis() System.currentTimeMillis()은 1970/1/1 00:00:00 UTC을 기준으로 현재 시간을 리턴합니다. 시스템의 TimeZone에 관계없이 항상 UTC 시간을 리턴하기 때문에 보통 “Unix time”, “epoch time"이라고 부릅니다. System.nanoTime() System.nanoTime()은 로컬 시스템에서 가장 정확한 현재 timestamp를 나노초 단위로 리턴합니다. (리눅스의 CLOCK_MONOTONIC과 같습니다) 정확한 현재 시간을 나타내는건 아니므로, 시간을 측정할때만 사용되어야 하며, 같은 프로세스, 같은 디바이스 간의 timestamp와 비교하여야 합니다. 현재 시간을 알고 싶으면 System.currentTimeMillis()을 사용해야 합니다. ...

September 16, 2019 · Juyeong Lee
AAPT2 error: check logs for details

AAPT2 error: check logs for details

안드로이드 스튜디오 버전 업데이트 이후 다음과 같은 버그를 만났다. Error:com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details Gradle 3.0에서 aapt대신 aapt2를 기본적으로 사용하면서 나타나는 버그이며 가장 많이 말하는 해결책은 gradle.properties에서 android.enableAapt2=false를 추가해 aapt2를 사용하지 않는것이다. 하지만 이는 임시방편일뿐 결국엔 aapt는 deprecate되고 aapt2를 사용해야한다. Gradle용 Android 플러그인 3.0 마이그레이션 가이드라인 마이그레이션 문서가 별로 길지 않으니, 꼭 마이그레이션을 진행하는게 좋다. 9-patch 이미지 파일 빌드중 에러메시지에 .9.png 이 포함되어 있다면, 앱 내 9 patch 이미지 파일중 잘못 만들어진 파일이 있다는 의미이다. .9 를 빼고 빌드해 본 뒤 빌드에 성공하면 해당 이미지 파일을 다시 만들어준다. (2번이 문제일 확률이 높다)

April 6, 2018 · Juyeong Lee

[Gradle] Could not determine java version from 문제 해결

Could not determine java version from '9.0.4' JDK9을 설치한 이후로 ./gradlew를 실행하면 해당 에러가 발생한다. ./gradle/wrapper/gradle-wrapper.properties파일을 열어보니 gradle 4.1버전을 사용중 4.3.1버전 이상으로 업데이트하면 문제가 해결된다. #Sat Feb 24 17:55:43 KST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-4.3.1-all.zip 출처 gradle 홈페이지 => 4.3버전 이상으로 업데이트 한 이후 해당 에러가 사라졌다고 한다.

March 15, 2018 · Juyeong Lee
[안드로이드] Resources Naming Rule

[안드로이드] Resources Naming Rule

같은 프로젝트를 오랫동안 개발하다 보면 drawable이나 layout 같은 리소스명이 규칙 없이 생성되게 된다. 여러 사람이 개발하거나, 내 마음이 바뀌거나… 리소스 작명 규칙을 정해놓고 그 규칙을 따르다 보면 가독성이 높아진다. Basic Principle [what]_[where]_[description]_[size] what activity, fragment … where main, user, settings … description title, content, profile … size 24dp, small … (optional) Layout [what]_[where].xml activity, fragment, view , item, layout 예시 activity_main.xml, layout_article.xml Strings [where]_[description] 공통적인 문자열은 [where]에 all 또는 common을 사용 예시 article_title, common_purchase Drawables [where]_[description]_[size] 공통 이미지는 all, common을 사용 예시 noti_icon_24dp Ids [what]_[where]_[description] 예시 tablayout_main, imageview_menu_profile Dimensions [what]_[where]_[description]_[size] waht은 width, height, size, margin, padding같은 것들이 들어갈 수 있다. 예시 height_toolbar, size_profile 한계점 모든 화면이 다른 이름을 가져야함 (MainActivity, MainFragment는 같은 main을 사용하기 때문에 충돌이 일어날수 있음) 리펙토링이 자동으로 되지는 않음 출처: http://jeroenmols.com/blog/2016/03/07/resourcenaming/

April 5, 2017 · Juyeong Lee
[안드로이드 Lint] Incompatible Gradle Versions

[안드로이드 Lint] Incompatible Gradle Versions

안드로이드 스튜디오 버전을 2.3으로 업데이트한 후 support package를 추가하면 다음과 같은 린트 에러가 발생합니다. compile "com.android.support:support-v4:25.2.0" All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes) 문제는 내가 명시하지 않은 support package를, 외부 라이브러리에서 사용하는 것입니다. . Facebook SDK 예를 들어 Facebook SDK를 사용중이라면, Facebook SDK내부에서 support package를 참조하고 있습니다. +- com.facebook.android:facebook-android-sdk:4.20.0 | +- com.android.support:support-v4:25.0.0 -> 25.2.0 (*) | +- com.android.support:appcompat-v7:25.0.0 -> 25.2.0 (*) | +- com.android.support:cardview-v7:25.0.0 | | \- com.android.support:support-annotations:25.0.0 -> 25.2.0 | +- com.android.support:customtabs:25.0.0 -> 25.2.0 (*) Facebook SDK에서는 support package 25.0.0을 사용중입니다. support-v4, appcompat-v7, customtabs는 최신버전인 25.2.0로 대체되었지만, cardview-v7은 25.0.0을 사용중입니다. ...

March 13, 2017 · Juyeong Lee
[Android] TextView에서 textIsSelectable 이 동작하지 않는 현상

[Android] TextView에서 textIsSelectable 이 동작하지 않는 현상

1. TextView 내의 글자 선택하기 xml내에서 textIsSelectable을 true로 설정해준다. <TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="wrap_content" android:textIsSelectable="true" android:text="Hello World!" /> java코드에서 setTextIsSelectable을 true로 설정 해준다. mTextView.setTextIsSelectable(true); 위 두가지 중 한가지만 적용해주면 TextView의 글자를 선택해 복사 할 수 있다. 2. ListView(RecyclerView) 에서의 이슈 QA를 하던 중 TextView의 글자를 선택할 수 없다는 말을 들었다. 처음에는 롱클릭이 잘 되지만, 스크롤을 내리면 텍스트를 선택할 수 없다는 것이었다. 3. 해결방법 TextView를 상속받아서 View가 attach되는 시점에 disable -> enable을 시켜주면 해결 된다. (http://stackoverflow.com/a/38626276) ...

December 28, 2016 · Juyeong Lee

[Ruby] Lazy Enumerator 사용하기

1. lazy enumerator란? Lazy Enumerator는 루비 2.0 에서 처음 등장한 기능으로, method chain을 사용할 때 chain을 효율적으로 수행할 수 있도록 도와준다. 이 기능을 알고 난 후에 코드의 양은 줄어들었고 가독성은 오히려 늘어나게 되었다. 매우 좋다. . 2. 사용법 사용법은 어렵지 않다. 기존 enumerator를 사용하는 것처럼 take(n).to_a를 하면 앞에서부터 10개의 아이템을 array로 만들어준다 arr = [1, 3, 5, 2, 4, 6] arr.lazy.select { |i| i <= 3 }.take(2).to_a # => [1, 2] arr.lazy.select { |i| i <= 3 }.first(2) # => [1, 2] .. 3. 비교 lazy를 사용하지 않을 때와 비교 1부터 무한대까지의 숫자 중, 3의 배수를 2개 ...

June 12, 2016 · Juyeong Lee

레일즈 암호화 (Rails Encrypt, Decrypt)

레일즈에서는 암호화를 위해 ActiveRecord에서 기본으로 제공하는 라이브러리를 사용할 수 있다.. 암호화 secret = Rails.configuration.secret_key_base encryptor = ActiveSupport::MessageEncryptor.new(secret) encrypted = encryptor.encrypt_and_sign('value') # => bXRidS92aVpUUG1YVEMwd3V4VkUrUT09LS1hbkUzQzUyTjNlSzBiL2xlaTI1WDNnPT0=--61257eaa178fe8c363e83c8cb966a39c4820fa47 복호화 secret = Rails.configuration.secret_key_base encryptor = ActiveSupport::MessageEncryptor.new(secret) encryptor.decrypt_and_verify(encrypted) # => 'value' MessageEncryptor 위의 예제에서 사용된 MessageEncryptor는 ActiveRecord에서 제공되며, 암호화를 위한 secret key는 레일즈 설정의 secret_key를 사용했다. (다른 key를 만들어서 사용해도 된다) secret = SecureRandom.hex(64) signature_key = SecureRandom.hex(64) serializer = JSONSerializer.new # 다른 serializer를 사용해도 된다. 기본은 Marshal ActiveSupport::MessageEncryptor.new(secret, signature_key, serializer: serializer) Rails3 Rails3에서 secret은 Rails.configuration.secret_token를 사용하면 된다. 참고자료 http://api.rubyonrails.org/classes/ActiveSupport/MessageEncryptor.html

March 14, 2016 · Juyeong Lee

[Java] ExecutorService

Executor 제출된 Runnable task를 실행하는 객체. ExecutorService 하나 이상의 비동기 task의 진행상태를 추적하기위한 Future를 생성하는 메소드 를 제공하는 Executor. ExecutorService 예제1 간단한 ExectorService 사용법. ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.execute(new Runnable() { public void run() { System.out.println("Asynchronous task"); } }); executorService.shutdown(); Executors.newFixedThreadPool() 라는 팩토리 메소드를 통해 10개의 스레드 풀을 사용하는 executorService를 만들고 "Asynchronous task"라는 내용을 출력한 뒤 종료. ExecutorService를 모두 사용한 뒤에는 자원 반납을 위해 반드시 종료해야하며 종료를 위해 두 개의 메소드shutdown(), shutdownNow() 가 제공된다. ...

February 21, 2016 · Juyeong Lee
[Android] Avoid passing null as the view root

[Android] Avoid passing null as the view root

LayoutManager로 직접 View를 생성할때 가끔 이런 경고를 볼 수 있다. LayoutInflater는 View를 생성할때 자신의 레이아웃을 잡기위해 부모 View가 필요하다. 이때 부모 View를 알려주지 않으면 (null을 넘기면), 부모를 알 수 없기 때문에 layout xml에 정의한 android:layout_xxxxx 값들은 모두 무시된다. <GridView android:id="@+id/grid" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp" android:padding="5dp" android:visibility="invisible" android:numColumns="2" /> 지금 보는 GridView에서는 layout_width, layout_height, layout_margin이 무시되고 padding, visibility, numColumns는 적용 됨. ...

February 21, 2016 · Juyeong Lee