일단 새로운 프로젝트 만들고 premain 추가해주는 것 까진 강의를 그대로 따라하시면 됩니다. manifest plugin 부터 조금 차이가 있어서 거기부터 설명하면, build gradle 에 다음과 같이 추가한다. tasks.named('jar') { manifest { attributes( 'Implementation-Title': project.name, 'Implementation-Version': project.version, 'Premain-Class' : "com.java.magicianAgent.MagicianAgent", 'Can-Redefine-Classes' : true, 'Can-Retransform-Classes' : true) } } 터미널에서 다음 명령어를 통해 build 한다 ./gradlew clean build build.libs file 안에 있는 jar file 을 확인한다. (옵션) 강의에서와 마찬가지로 zip file 로 변경하면 확인가능합니다. 저같은 경우 SNAPSHOT.jar 과 SNAPSHOT -plain.jar 이렇게 2개가 생겼는데 SNAPSHOT.jar 은 제가 spring boot 로 실행서 그런지 관련 설정들이 보이고 SNAPSHOT -plain.jar 이 맞는거 같더라구요. jar file 의 절대 경로를 복사해 VM option 에 추가한다. 여기서부터는 다시 강의와 같습니다. VM option 이 안보이시면 오른쪽에 Modify options 클릭하면 add vm options 라고 보이실 겁니다. 이상한거나 궁금한거 있으시면 말씀해주세요. gradle 을 쓰시는 모든 분들도 마술을 성공시킵시다 하하
2일째 고민을 해보았는데.. 2%까지만 맞고 틀리다고 합니당..ㅠㅠ 포기하고 싶지 않은 마음에 도움을 요청합니다!! 제가 짠 코드는 이렇습니다! import java.io.*; import java.util.*; // 불이 하나가 아닌 여러개일 수 있다. public class Main { public static int R; public static int C; public static String[][] map; public static int[][] visitedFire; public static int[][] visitedHuman; public static int[] dx; public static int[] dy; public static Node fireLocation; public static Node humanLocation; public static Queue<Node> fireQueue; public static void main(String[] args) throws IOException { // 초기화 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st = new StringTokenizer(br.readLine()); R = Integer.parseInt(st.nextToken()); C = Integer.parseInt(st.nextToken()); map = new String[R][C]; // 0으로 초기화 visitedFire = new int[R][C]; visitedHuman = new int[R][C]; dx = new int[]{0,1,0,-1}; dy = new int[]{-1,0,1,0}; fireQueue = new LinkedList<>(); // 맵 입력 for (int i = 0; i < R; i++) { String S = br.readLine(); for (int j = 0; j < C; j++) { // 불 좌표, 지훈이 좌표 찾기 map[i][j] = String.valueOf(S.charAt(j)); if(map[i][j].equals("J")){ humanLocation = new Node(j,i); map[i][j] = "."; // .으로 변경 }else if(map[i][j].equals("F")){ // 불이 여러개, 불이 아무것도 없을 수 있다. -> 반레 fireLocation = new Node(j,i); fireQueue.add(fireLocation); visitedFire[i][j] = 1; } } } // (1) 불이 이동할 수 있는 최단경로 fireBfs(); // (2) 사람이 이동할 수 있는 최단경로 + 길 비교해야함 humanBfs(humanLocation.y, humanLocation.x); // 가능한 길 찾아서 int result = Integer.MAX_VALUE; // (3) 가장 짧은 최단거리 찾기 (가장자리 찾기) for (int i = 0; i < visitedHuman.length; i++) { for (int j = 0; j < visitedHuman[i].length; j++) { if((0<i && i<R-1) && 0 < j && j < C-1)continue; // 가장자리가 아닌 경우 pass if(visitedHuman[i][j] > 0) { result = Math.min(result, visitedHuman[i][j]); } } } if(result == Integer.MAX_VALUE){ System.out.println("IMPOSSIBLE"); }else{ System.out.println(result); } } public static void humanBfs(int y, int x){ // tkfk visitedHuman[y][x] = 1; Node node = new Node(x,y); Queue<Node> queue = new LinkedList<>(); queue.add(node); while(queue.size()>0){ Node cur = queue.poll(); for (int i = 0; i < 4; i++) { int nx = cur.x + dx[i]; int ny = cur.y + dy[i]; if(nx < 0 || nx >= C || ny < 0 || ny >= R) continue; if(visitedHuman[ny][nx] == 0 && (map[ny][nx].equals("."))){ if(visitedHuman[ny][nx] < visitedFire[ny][nx] || visitedFire[ny][nx] == 0){ visitedHuman[ny][nx] = visitedHuman[cur.y][cur.x] + 1; Node next = new Node(nx,ny); queue.add(next); } } } } } public static void fireBfs(){ while(fireQueue.size()>0){ Node cur = fireQueue.poll(); for (int i = 0; i < 4; i++) { // 4방향 탐지 int nx = cur.x + dx[i]; int ny = cur.y + dy[i]; if(nx < 0 || nx >= C || ny < 0 || ny >= R) continue; if(visitedFire[ny][nx] == 0 && (map[ny][nx].equals("."))){ visitedFire[ny][nx] = visitedFire[cur.y][cur.x] + 1; // 이동함을 표현 Node next = new Node(nx,ny); fireQueue.add(next); } } } } public static class Node { int x; int y; Node(int x, int y){ this.x = x; this.y = y; } } }
[Bloc 응용] 실전 앱 만들기 (책 리뷰 앱) : SNS 로그인, Firebase 적용, Bloc 상태 관리, GoRouter
review_write_page에서 ReviewBox 부분에 리뷰를 작성후 textfield에서 focus out이 되었을때 작성한 리뷰 text가 안보이는 현상이 있습니다. text가 사라지고 저장을 하게 되면 DB에는 데이터가 제대로 들어갑니다. 혹시 이부분은 어디를 수정해야 될까요?
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
동일하게 restaurant_repository에서 @Headers 를 통해 'accessToken' : 'true' 라는 map을 헤더에 넣어주었음에도 dio.dart에서는 해당 onRequest에서 header가 빈 map으로 나오는 현상이 발생합니다. url과 GET 요청이라는 정보는 제대로 들어갑니다. 혹시 무슨 문제인지 알고 계신가요?
void main() { int total = 0; for (int i = 0; i < 10; i++) { total += 1; if (total == 5) { break; } } print(total); } ->5 여기서 0이였던 i 값이 1(i++)이되고 total 은 1이 되며(total+=1) 또 반복으로 i 값이 2가되고 total 은 2가 되고 쭉 반복되어 total 이 5가되었을때 나와서 출력된거맞나요?
안녕하세요 강의 잘 듣고있습니다. 컬렉션 List<data type> 변수 = ['지수', '제니']; Map <key:value> 변수 = { 'key' : 'value'}; Set<data type> 변수 ' { ........}; enum Status {..} List 만 [] 대괄호 나머지는 {}중괄호를 쓰는 이유가 뭔가요 그냥 공식일까요? 그리고 enum Status { approved, pending, rejected } void main() { Status status = Status.approved; print(status); } 이 예제에서 Status는 키워드 인가요?
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요? 강좌 섹션5 > 레스토랑상세페이지 구현단계에서 build 의 FutureBuilder 의 builder 에서 아래와 같이 구현 되어있는데 builder: (context, AsyncSnapshot<Map<String, dynamic>> snapshot) { 아래와 같이 AsyncSnapshot<Map<String, dynamic>> 를 제거후 syntax error 따라다니면서 반환타입을 바꾸니 문제 없던데요.. builder: (context, snapshot) { flutter 가 업그레이드 되면서 type safe 된거 같기도 한데 AsyncSnapshot<Map<String, dynamic>> 부분이 이해가 잘 안가는데요 부연 설명 가능할까요?
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요 강사님. 다름이 아니라 아래 코드가 적용되지 않아서 글 남깁니다. Image.asset( 'asset/img/misc/logo.png', width: MediaQuery.of(context).size.width * (2 / 3), ), width에 그 어떠한 값을 넣어봐도 로고 크기가 변하지 않았습니다. 이에 아래 코드와 같이 width가 아닌 height 값을 지정해 보니 드디어 로고 크기가 변하기 시작하더군요. Image.asset( 'asset/img/misc/logo.png', height: 100, ), 왜 width에 값을 넣었을 때는 로고 크기가 변하지 않았고, height에 값을 넣었을 때만 로고 크기가 변했는지 그 이유가 궁금합니다.
안녕하세요 강의를 듣다가 궁금증이 생겨서 질문을 드립니다. void init() { // given List<Product> products = List.of( createProduct("001", 1000), createProduct("002", 2000) ); // when Order order = Order.create(products, LocalDateTime.now()); // then assertThat(order.getOrderStatus()).isEqualByComparingTo(OrderStatus.INIT); } 강의에서 OrderTest 클래스 테스트 과정에서 enum을 비교할때 isEqualByComparingTo를 사용하셨습니다. assertThat(order.getOrderStatus()).isEqualTo(OrderStatus.INIT); 위와 같이 isEqualTo를 사용해도 enum을 비교할 수 있는데, 혹시 isEqualTo 대신 isEqualByComparingTo를 사용한 이유를 알 수 있을까요? isEqualByComparing가 정의된 AbstractComparableAssert.java를 확인해보면 BigDecimal을 예시로 들어서 사용법을 설명하고 있습니다. BigDecimal의 예시로 Enum을 써야 하는 방법을 생각해보았는데, 유추(?)가 잘 되지 않아서 질문을 남깁니다. 항상 좋은 강의 제공해주셔서 감사합니다!!😀😀
질문은 아니고 해결 방법 공유 드립니다. build_script_generate/bootstrap.dart:76:40: Error: Method not found: 'NullThrownError'. final error = e[0] as Object? ?? NullThrownError(); 위 에러가 발생하는 경우 https://pub.dev/ 에서 사용하는 라이브러리들을 검색해서 버전들을 최신으로 맞춰주시면 됩니다. 발생 원인은 NullThrownError 가 Dart 2.14 이후에 제거되었는데 예전 버전들에서 저 메서드를 사용하려고 하니 발생하는 것이 아닐까 싶습니다.
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
[ ...TABS, ...TSBS, ...TSBS].map(~) 여기에서 ...TABS의 의미가 무엇인지 궁금합니다! 그냥 TABS로 적으면 e가 List type의 TABS를 불러와서 e.icon에 오류가 발생하는데, ...TABS로 적으면 map이 실제로 TABS안에 있는 리스트 요소를 e로 가져오는거같은데 ...의 의미가 궁금합니다!
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
npm i 명령어 실행 시 이런 오류가 발생하는데 혹시 해결방법이 있을까요? 그리고 android studio에서 node 명령어 수행 시 제대로 실행되지 않는 문제가 있는데 powershell을 통해 동일한 경로에서 실행하면 제대로 실행됩니다. 추가적으로 android studio에서 해주어야 하는 설정이 있을까요?