프로그래밍 354

Python 배열 슬라이싱 공략 (Numpy)

python의 놀라운 점 중 하나는 배열을 간단한 문법으로 완전히 마음대로 가지고 놀 수 있다는 거다. 다른 언어들이 내가 과일을 깎는 정도의 효율성이라면...(매우 서툴러서 거의 네모가됨) python의 배열 슬라이스 능력은 마치 라떼 유행했던 Fruit Ninja라는 게임을 연상케한다! 그리고 numpy 같은 라이브러리를 활용하면 더욱 다양한 작업을 할 수 있다. NLP를 아주 겉만 살짝 맛보면서 matrix[:, 2] 막 이렇게 생긴걸 봤는데 배열 자르기를 내가 정말 모르는구나...생각이들어서 이렇게 정리를 해보려한다. 배열 선언하기 1차원 배열을 선언하는 방법은 다음과 같다. # python array = [0] * 8 # [0, 0, 0, 0, 0, 0, 0, 0] array = [2 * i f..

[Python] 마방진 그리기 / 검산하기 with numpy

극한탈출 999 오늘 트위치에서 라는 방탈출게임 게임방송을 보다 저런 퍼즐을 발견했다. 1~9까지 핀이 주어지고 가로, 세로, 대각선의 합이 15가되도록 만드는건데 찾아보니 이것을 마방진이라고 부른다! 마방진...영어이름도 Magic Square...11차마법진을 그릴수있다면 정말 멋질거야.... 마방진 그리는 방법 마방진을 그리는 방법은 아래 사진과 같다. 인터넷에 원리라고 떠돌아다니는 건데....원리는 잘 모르겠다 ㅋㅋㅋ 암튼 파이썬으로 마방진 생성기를 만들어 보자. 11차 마방진이든 111차 마방진이든 그릴수 있도록 말이다. 파이썬으로 마방진 그리기 numpy 라이브러리를 사용할 것 이므로 코드 최상단에 import numpy as np 를 까먹지말자. 난 까먹었지만. def get_next(m, ..

[안드로이드] RecyclerView를 잘 사용하기 위한 팁들.

ListView가 널리 쓰일때부터 RecyclerView, 그리고 지금은 DiffUtil을 이용한 ListAdapter를 사용하기 까지! 수 년간 안드로이드를 개발해왔는데, RecyclerView에 대해서 계속 당하기만 한 기억뿐이다. 잘몰라서 그렇다. 그래서 이번에 RecyclerView에대해서 공부 할 거리를 찾아보다 발견한 짧은 글을 간단히 번역해 보기로 했다. 원문: proandroiddev.com/recyclerview-pro-tips-part-1-8a291594bafc 1. 런타임에 RecyclerView 내의 아이템 크기가 변하지 않는다면 setHasFixedSize(true)를 사용해라. RecyclerView 내의 아이템의 높이가 모두 균일하다면 RecyclerView.setHasFixe..

[Nginx] Static 파일을 캐싱해서 웹 페이지 로딩 속도를 높이자

내가 운영하고 있는 동물의 숲 어플인 너굴리스트다. 그냥 컴퓨터에서 이용할때는 견딜만 하지만, 아이폰의 경우 웹뷰로 띄워서 보여주는데 로딩속도가 무지막지하게 느리다. 사진에서 봐도 Finish까지 15.90s. 이럴때 Nginx에서 css/js/image 파일 등을 캐싱 해 두면 좋다는 조언을 얻었다. 방법은 간단하다. nginx 설정 파일에서 자신이 사용하고 있는 location 전에 다음과 같이 또 하나의 location을 선언 해주면 된다. location ~* \.(?:ico|css|js|gif|jpe?g|png)$ { expires 30d; add_header Vary Accept-Encoding; access_log off; } 그리고나서 nginx 설정에 문법이 틀린 것이 없는지 검사 후 재..

[안드로이드] 예제로 알아보는 바인드된 서비스 (Bound Service)

바인드된 서비스(Bound Service)는 서비스와 다른 안드로이드 컴포넌트들 (Activity, Fragment, Service)간에 서버와 클라이언트같은 관계를 구현할 수 있어 IPC(프로세스간 통신)를 가능하게 한다. 이번에 이를 이용해서 구현할 예제는 앱의 설치상황을 관찰하는 서비스이다. 게임 다운로드 버튼을 누르면, 구글 플레이가 실행되고 구글플레이 설치 진행 상황에 따라 버튼 상태가 바뀐다. Bind Service의 작동원리와 개념은 코드와 함께 보자! 서비스 만들기 설치 상태를 관찰 할 서비스는 InstallStateService이다. 먼저 Binder를 하나 만들어 주어야하는데, binder를 통해서 다른 앱 컴포넌트에서 이 서비스에 접근 할 수 있게 된다. class InstallSta..

[안드로이드] 패키지명(Package name)으로 앱 실행하기

패키지명을 받아서 앱을 띄워주어야 할 때가 있습니다. 사용자의 휴대폰에 해당 앱이 깔려있다면 실행하고, 깔려있지 않고 Google Play는 이용할 수 있다면 구글 플레이의 앱 상세 페이지로, 만약에 그렇지도 않다면 구글 플레이 웹에서 앱 상세 페이지로 이동 시키는 함수입니다. /** * 패키지 네임을 가진 앱을 실행합니다. 없으면 구글 플레이로 이동합니다. * @param packageName 대상 앱의 패키지 네임 */ fun launch(context: Context, packageName: String?) { val launchIntent = context.packageManager.getLaunchIntentForPackage(packageName ?: "") if (launchIntent !=..

[안드로이드] Firebase Crashlytics 연동방법

구글 Firebase Document에 나와있지만 한국어로 설정하면 보이지 않는 문제가 있어서 블로그에 포스팅한다. Firebase Crashlytics 통합을 위한 절차는 다음과 같다. 미리 해야 할 일 Firebase에서 프로젝트를 생성하고, google-services.json 파일을 안드로이드 프로젝트에 넣는 작업이 완료된 후 Firebase를 사용 할 준비가 되어있어야 한다. 여기까지의 단계는 (https://firebase.google.com/docs/android/setup[https://firebase.google.com/docs/android/setup]) 에서 따라 할 수 있다. app/build.gradle plugins { ... id 'com.google.gms.google-ser..

[안드로이드] 프로젝트에 Sentry 연동방법, Proguard 적용까지

Firebase Crashlytics는 Crash만 기록할 수 있지만, Sentry를 이용하면 Crash는 물론, 개발자가 직접 기록한 이벤트 로그를 확인 할 수 있고 오류가 난 디바이스의 정보와 회원 정보까지 쉽게 파악이 가능하다. 그래서 이번 프로젝트에서는 Sentry를 한 번 이용 해 보기로 했다. 기본 세팅 먼저 Sentry에 가입하고, Sentry에서 안드로이드 프로젝트를 만든 후 다음과 같이 대시보드에 진입 할 수 있는 상태가 되어야한다. 이 절차는 간단하므로 빠르게 스-킵! 먼저 공식 문서(docs.sentry.io/platforms/android/)가 말하는 대로, 안드로이드 프로젝트에서 세팅을 해 주어야 한다. // Make sure jcenter or mavenCentral is the..

[Kotlin/Java] 생년월일 기준으로 현재 만 나이 계산하기

입력한 생년월일을 기준으로 만 나이를 계산하는 코드다. calculateAge(date) >= 14 일경우, 만 14세 이상 조건을 만족하게 된다. /** * 생년월일을 기준으로 현재 나이 계산 * @param unix unixtimestamp */ fun calculateAge(date: Date?): Int { val birthCalendar = Calendar.getInstance() birthCalendar.time = date ?: Date() val current = Calendar.getInstance() val currentYear = current[Calendar.YEAR] val currentMonth = current[Calendar.MONTH] val currentDay = curr..