최신 글
안드로이드
플러터
알고리즘
인기글
-
플러터 플러터의 위젯 (1) - Container, Child, Children 플러터의 모든 것은, 그 앱 자체를 포함해서, 위젯이다. 이러한 모양의 위젯은, 이러한 트리로 구성된다. Container의 하위로 위젯을 넣으려면 child이나 children에 넣어주면 된다. 이름에서 알수 있듯이, 하나만 넣으려면 child, 여러개면 children이다. A child property if they take a single child – for example, Center or Container A children property if they take a list of widgets – for example, Row, Column, ListView, or Stack. (https://flutter.dev/docs/development/ui/layout 에서 발췌) 여기서 알 수 ..
-
안드로이드 헤더가 찰싹 달라 붙는 스크롤 뷰 (Sticky Scroll View) Fixed view in scroll view 네이버 앱을 보면 이렇게, 검색창이 위로 올라가다가 맨 위에 도달하면 더이상 올라가지 않고 고정이 된다. 실제로 네이버 앱 내부적으로는 CollapsingToolbarLayout을 이용하고 있을 수도 있다. 하지만, 만약 단순히 뷰를 고정시키기만 하고싶거나, 툴바는 다른 이유로 따로 쓰고 싶을 경우에는 CollapsingToolbarLayout를 사용하지 못한다. 그래서 이번에는 스크롤 뷰 내부의 임의의 뷰를 천장에 찰싹 달라 붙게 하는 커스텀 뷰를 만들어 보기로 하자. 전체 코드는 https://github.com/5seunghoon/Sticky_Scroll_View_Example 에 있고, 이번에는 https://github.com/amarjain07/S..
-
플러터 Flutter - 현재 위젯 캡쳐(캡처) 현재 위젯을 캡쳐하는 방법을 알아보자. 안드로이드였다면 onDraw를 썼을테지만.. 플러터엔 그런거 없다..! 다만, renderObject를 활용하면 된다. 전체 소스 코드는 https://github.com/5seunghoon/Flutter_Capture_Example 여기에 있다. 1. 먼저 import부터. import 'dart:io'; import 'dart:async'; import 'dart:ui' as ui; import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'pac..
-
안드로이드 안드로이드 Picture In Picture (PIP) 깃 헙 주소 : https://github.com/5seunghoon/PipExample PIP기능은 아래와 같다 이렇게 재생되던 동영상을, 홈키같은걸 눌리게 되면 이렇게 작은화면으로 전환되고, 다른 앱 위에서 동영상이 계속 재생될 수 있는 기능이다. 유튜브나 네이버TV등에서 자주 볼 수 있는 기능이다. 이를 간단하게 구현해보자. 먼저 깃헙 주소는 게시글의 최상단에 미리 적어놓았다. 1. 매니패스트의 액티비티 부분을 다음과 같이 수정하자 보면, android:resizeableActivity과 supportPictureInPicture이 설정되어 있는 것을 알 수 있다. 2. 액티비티 xml 수정 먼저 VideoView를 리니어 레이아웃의 최상단에 두고, 스크롤뷰를 그 밑에 둔 다음 그 스크롤뷰에 이것저..
-
잡다한 코딩 Webstorm 이용한 Spring boot + Vue.js 연동 정말 간단하다 spring boot 프로젝트에 src나 target과 같은 경로에 frontend폴더를 만들고 거기에 vue.js프로젝트가 들어가게 한다 그러니까, 그냥 프로젝트 만들때부터 이렇게 만들면 된다 (Users/venditz/Document/IdeaProject/springpractice04 가 스프링 프로젝트 폴더) 그러면 아래와 같은 프로젝트 구성이 된다 그 후에 frontend/config/index.js에서 빌드 부분을 이렇게 바꿔준다 그리고 터미널이든 cmd이든 frontend 폴더로 이동한 뒤 npm run build 해주면 이런게 뜬다 그럼 이제 아무것도 없던 src/main/resouces 폴더에 이러한 index 파일이 생성될거다 그럼 끝! 이제 스프링부트를 실행하고 127.0..
-
안드로이드 androidx view.doOnLayout androidx의 view.doOnLayout에 대해 짧게 글을 써본다 공식 문서에는 이렇게 되어있다 레이아웃이 놓여졌을 때 주어진 액션을 수행. 뷰의 포지션을 구하고 싶을 때 (Kotlin)my_image_view.run{ doOnLayout { getLocationOnScreen(startPos) Logger.d("start dot rect : ${startPos[1]}") } }와 같이 하면 된다 onWindowFocusChanged() 를 사용하면 안드로이드 멀티뷰를 쓸 때 좀 이상해진다. 호출이 약간 늦거나 이르거나.. 저걸 쓰면 잘됨
- 알고리즘 백준 11062 카드게임 백준 11062 카드게임 solve(i,j)는 i에서 j까지의 카드(i와j는 인덱스)만 남았을 때,""지금 상황에서"" = end) { if ((N - (start + end)) % 2) return ret = card[start]; else return ret = 0; } if ((N - (start + end)) % 2){ ret = max((solve(start + 1, end) + card[start]), (solve(start, end - 1) + card[end])); } else { ret = min((solve(start + 1, end)), (solve(start, end - 1))); } return ret; } int main() { scanf("%d", &testcase); whil..
-
잡다한 코딩 [openGL][python3] 미니멀 당구 파이썬과 openGL을 이용하여 조그마한 당구장을 만들었다 물론 학교 과제다 결과물은 위와 같다. 기본적으로 카메라가 회전을 하고(회전 여부를 키보드로 설정 가능) h를 눌리면 공이 랜덤한 방향으로 움직인다 그러다 당구장 벽면에 부딪치면 튕긴다. 벽면에 부딪치는건 간단하게 방향벡터를 x축 대칭이나 y축 대칭을 하는것으로 해결했다. 또한 마찰에 의해서 속도가 조금씩 느려진다. 이것은 간단하게 속도를 프레임마다 조금씩 늦추는 것으로 구현했다. 아래를 클릭하면 다운 가능하고, floor.jpg와 wall2.jpg는 간단한 텍스쳐이다. 저작권 문제가 있을 수 있기 때문에 업로드를 하지 않으니, 혹시 실행해보고 싶으신 분들은 구글링으로 아무거나 검색해서 다운받으시면 된다. from OpenGL.GL import ..
-
플러터 간단한 플러터 앱 - 2초마다 한번씩 랜덤한 이름 만들기 플러터를 처음 공부하게 되면 하게 되는 튜토리얼의 앱인 "랜덤 이름 제네레이터" 구글 코드 랩에 나와있는 이 앱을 간단하게 개선해보면서 Stream의 사용법을 익혀봅시다. https://codelabs.developers.google.com/codelabs/first-flutter-app-pt2/#8 이 링크를 통해 "랜덤 이름 제네레이터"를 만들어 보았다는 가정 하에 글을 써보겠습니다. 자 그럼, 우리는 이 앱을 기반으로 기능 하나를 추가해 보도록 합시다. 추가해볼 기능은 바로, 제목에도 나와있듯이, 랜덤한 이름을 2초마다 한번씩 제네레이팅하는 기능입니다. 일단, Dart의 Stream에 대해 알아보기 전에, https://software-creator.tistory.com/13?category=681..
- 안드로이드 RxJava와 Room DB 자기 전, 갑자기 생각나서 정리를 해야할 것 같아서 쓰는 ROOM DB와 RxJava의 조합 에 관한 글. Room DB는 Andriod Jetpack에 포함된 SQLite를 대체하는 데이터베이스이다. 특징으로는, 간단한 insert, update, delete 등등의 기본적인 함수를 SQL문을 이용하여 적지 않아도 된다는게 큰 특징이다. 사용해보면 알겠지만 SQLite와 DBHelper를 쓰는 등의 기존 방식보다 훨씬 편리하고 마음이 놓인다는 장점이 있다. 마음이 놓인다는 이유는.. 제가 DB지식이 적어서 SQL문이 오류날까봐 항상 전전긍긍하는데 SQL문을 덜 적어도 되기 때문.. 이다... ㅋㅋㅋ 또한 특징이 하나 더 있는데, RxJava를 연동해서 쓸 수 있다는 점이다. 예를들어, DB에서 getU..
-
안드로이드 Android Kotlin MVVM패턴으로 간단한 검색 앱 만들기 - 3. RxJava + Retrofit를 통한 네트워킹 및 옵저빙 이번 글에서는 Retrofit으로 네트워크 통신을 하고 그 결과값을 RxJava로 받아오는 과정을 수행해보겠습니다. 일단 Retrofit에 대해 간단히 알아보도록 하죠. Retrofit 저도 최근에 알았는데, 레트로핏 한글 문서가 있더라구요. http://devflow.github.io/retrofit-kr/ 길지 않으니 한번 정독하셔도 됩니다. 간단하게 레트로핏을 요약하자면 public interface GitHubService { @GET("/users/{user}/repos") Call listRepos(@Path("user") String user);} 이렇게 인터페이스 형태의 서비스를 먼저 만듭니다. 자바 어노테이션으로 @Get이나 @Post 등을 적어주고, 파라미터로 라우팅 정보를 적어줍니다...
-
안드로이드 Android Kotlin MVVM패턴으로 간단한 검색 앱 만들기 - 1. BaseView, BaseViewModel을 작성하여 MVVM의 토대 만들기 MVVM 패턴과 Kotlin으로 간단한 앱을 만드는 것에 대해 글을 써보려고 합니다. 저도 정리를 좀 하고, 다른 분들도 도움이 좀 되셨으면 하는 의미에서.. 일단 어떤 앱을 만들고자 하냐면, 간단하게 카카오 Api로 이미지 검색을 해서 그 내용을 화면에 리사이클러뷰로 그리드하게 쭉 뿌려주는 앱을 샘플로 만들어 볼 예정입니다. 이렇게요! 그 과정에서 MVVM패턴을 위한 Livedata, 통신을 위한 Retrofit + RxJava, 이미지를 뿌려주기 위한 Picasso 의존성주입을 위한 Koin, 그리고 com.android.support를 대채하는 AndroidX 를 활용해 볼 예정입니다. AndroidX에 관해서는 https://thdev.tech/google%20io/2018/05/12/Androi..
- 안드로이드 Android studio code coverage시 Robolectric 사용할 때 ComplexColor 부분 에러 해결 안드로이드 스튜디오에서 Code Coverage측정할 때 Robolectric이랑 함께 쓰면 아래와 같은 오류가 뜰 수 있다 ---- IntelliJ IDEA coverage runner ---- sampling ...include patterns:exclude patterns:java.lang.VerifyError: Bad return typeException Details: Location: android/content/res/ResourcesImpl.$$robo$$loadComplexColorForCookie(Landroid/content/res/Resources;Landroid/util/TypedValue;ILandroid/content/res/Resources$Theme;)Landroid/con..
- 안드로이드 jacoco 사용을 위한 환경 세팅 jacoco code coverage를 측정할 때 씀 1. build.gradle의 제일 하단에 (dependencies 밑에) 아래와 같이 추가 apply plugin: 'jacoco' jacoco { reportsDir = file("${buildDir}/reports") toolVersion = '0.8.2' } task coverageReport(type: JacocoReport, dependsOn: 'testDebugUnitTest') { group = "Reporting" description = "Generate Jacoco coverage reports" def coverageSourceDirs = ['src/main/java'] classDirectories = fileTree( dir:..
- 알고리즘 백준 1315 RPG 백준 1315 RPG C++17의 auto && [a, b, c] = tuple t; 구문을 적극 활용 solve(i,j)는 str가 i, int가 j일 때, 이 이후로 내가 깰 수 있는 최대갯수의 퀘스트 이다. solve(i,j)에서 현재 스텟에서 깰 수 있는 퀘스트 갯수를 새고그 퀘스트를 깻다고 표시한 뒤깰 수 있는 퀘스트들의 포인트들의 합으로 스탯을 배분하여solve()를 재귀로 호출한다. 이때, 재귀로 들어오기 전에 깻던 퀘스트들은 또다시 깨면 안되기 때문에 깨지 않은 퀘스트만 깨고, 다시 위에서 설명한 것처럼 퀘스트 포인트 합으로 스탯 배분 후 다시 재귀 호출을 한다 그리고 재귀호출이 모두 끝나서 리턴하여 본래 함수로 되돌아 오면스탯을 배분한 수많은 상황중에서 가장 많이 깰 수 있는 퀘스트의 갯..
- 안드로이드 Uri에서 썸네일 가져오기 첫번째 함수: Uri에서 rowID를 추출 두번째 함수 : rowID를 통해 썸네일 추출 처음 if문은 무언가 잘못되어서 항목이 없을 때, 두번째 else if 문은 썸네일이 정상적으로 있어서 정상적으로 리턴할 때, 마지막 else문은 "썸네일이 존재하지 않을 때" 진입 함. public Uri thumbnailURIFromOriginalURI(Uri selectedImageUri) { long rowId = Long.valueOf(selectedImageUri.getLastPathSegment()); return uriToThumbnail(""+ rowId); } public Uri uriToThumbnail(String imageId) { String[] projection = { MediaStore..