[Info]Tags categorized posts and contents patterns..

[AJAX] Ajax Code E xamples.. [Book] About the book.. [CSS] CSS Code E xamples.. [DB] Sql Code E xamples.. [DEV] All development stor...

2016년 8월 25일 목요일

[JAVA] Baekjoon 세 정수 A, B, C중에 두 번째로 큰 정수 찾아보기..

이제는 if 조건이 3가지로 늘어났다.. 머 그렇다고 상황이 크게 바뀌는 것은 없다.. 만약 문제가 for 를 기초로 한다면 이런말을 못했을 나지만.. ㅋㅋㅋ.. if 라 조금 배짱을 부려본다.. ㅎㅎ

문제
세 정수 A, B, C가 주어진다. 이 때, 두 번째로 큰 정수를 출력하는 프로그램을 작성하시오. 

입력
첫째 줄에 세 정수 A, B, C가 공백으로 구분되어 주어진다. (1 ≤ A, B, C ≤ 100)

출력
두 번째로 큰 정수를 출력한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package step4;

import java.util.Scanner;

public class PrintIfInteger {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
  
        Scanner scan = new Scanner(System.in);
        
        //int intValA = 20;
        //int intValB = 10;
        //int intValC = 10;

        int intValA = scan.nextInt();
        int intValB = scan.nextInt();
        int intValC = scan.nextInt();
        
        //명확히 구분 될 때
        if(((intValA > intValB && intValA < intValC) || (intValA > intValC && intValA < intValB)) && (intValB != intValC)) {
            System.out.println(intValA);
         
        } else if(((intValB > intValA && intValB < intValC) || (intValB > intValC && intValB < intValA)) && (intValA != intValC)) {
            System.out.println(intValB);
         
        } else if(((intValC > intValA && intValC < intValB) || (intValC > intValB && intValC < intValA)) && (intValA != intValB) ) {
            System.out.println(intValC);
         
        //두 수가 같을 때
        } else if((intValA == intValB) || (intValA == intValC)) {
            System.out.println(intValA);
         
        } else if((intValB == intValC)) {
            System.out.println(intValB);
         
        //세 수가 같을 때
        } else if((intValA == intValB) && (intValA == intValC) && (intValB == intValC)) {
            System.out.println(intValA);
        }
    }

}//



문제에 대한 답은 상당히 다양할 것이다.. 우선 나는 각 3개의 입력값을 설정한 상태에서 if 를 충실히 사용했다.. 각각에 대한 경우에 대한 비교를 한 패턴이기 때문에 소스가 어찌보면 지저분하다.. ㅎㅎ

하지만 모든 분들이 알듯이 소스에 대한 코딩에 대한 답은 없으므로 자신의 입맛에 맞게 혹은 자신이 실험하고픈 방향대로 해보면 좋을 듯 하다.. 세상에 모든 소스는 내가 발전하기 위한 참고용이지.. 정답은 아니니 말이다..

[Talk] JSCON:16 컨퍼런스가 열릴 예정이네요..

어제 친구 B 군을 통해서 알게 되었는데 JSCON:16 컨퍼런스가 열린다고 한다.. 그런데 등록 기간[8월 28일까지..]이 이제 얼마 남지 않은 시점이라 부랴 부랴 올린다.. 참고로 행사일은 9월 1일[목] 이다.. [평일이다보니 전 불참러가 ㅠㅜ.. 자바스크립트를 좋아하는건 아니지만 오랫만에 세미나인데.. 흙;; 우연하게 타고온 분들은 참석가능하시길 빌어용 ~_~//]

해당 컨퍼런스가 무엇을 위한 것인지는 처음에는 몰랐고 사이트를 좀 보다보니 핵심은 자바스크립트이다.. 그에 따른 자바스크립트 개발자들이 각각의 회사에서 사용한 경험담 그리고 기술들에 대해서 공유하는 공간이라고 보면 될 듯 하다..

몰랐는데 안내를 살펴보니 이번이 벌써 3회차라고 한다.. ㅎㅎㅎ 아마도 JSCON 뒤에 16은 16년도를 지칭하는 것은 아닐런지.. ㅋㅋ 과거 행사 관심이 있는 분이 있을 수도 있어서 과거 링크도 올려본다..

2014년도 컨퍼런스 링크..
2015년도 컨퍼런스 링크..

그리고 아래는 홈페이지 방문에 앞서서 간략한 정보 제공을 위해서 홈페이지 내에서 캡쳐한 이미지를 첨부한다..





2016년 8월 24일 수요일

[Talk] 조회수 20,000 돌파..

20,000 !!!

두둥.. 분명히 1만 조회 글을 올린 것이 6월인데 말이지.. 약 두달만에 조회건이 1만건이 추가로 누적이 됬다는게 신기방기다.. 아마도 내 취미글이나 이슈가 될 만한 키워드가 태그에 들어가서 그런것은 아닐까 생각해본다.. 이러다가 한달도 안되서 3만건 되는건 아닌가 몰라.. 괜한 김칫국이려나.. ㅎㅎ














그 사이 블로그 글씨색을 좀 바꿨다.. 원래는 배경도 바꿔볼까 했지만, 왠지 이게 젤 문안한듯하다.. 다른 색이 있는 글씨를 써도 그렇고 제일 잘 어울린다는 느낌이랄까.. ㅎㅎ

벌써 2만하고도 3백 조회수가 더 카운팅 되었는데.. 역시나 믿음이 살짝 안감.. ㅋㅋㅋ.. 어제 카운팅을 보고서 오늘쯤에 2만 조회수 글을 쓰게 되려나..?? 했는데 3백 초과라는 것은 놀라울 따름이다..

실수이건 관심이건 내 블로그에 저렇게 많은 분이 와서 봐주셨다는 것 자체가 참으로 감사하다.. 앞으로도 꾸준히 잘 올라가서 내가 쓸것이 계속 생겼으면 좋겠다..

모든 분들 진심으로 감사드립니다.. (__)

[Talk] Five hundredth article..

올해 5월경에 400번째 글을 썼다.. 이제 500번째 글을 쓰고 있으니 약 3개월정도 걸린 듯 하다.. 과거에 비하면 더 빈도수는 줄어든 듯 하기도 하고 아닌 것 같기도 하고 결론부터 말하면 아마도 갈수록 줄어들긴 할 것이다.. ㅎㅎㅎ.. 머 그게 중요한 것은 아니니까..

지금까지 보면 많은 부분에서 변화가 있었던 것 같다.. 내 인생에서부터 내 주변까지 모든 부분에 있어서 말이지..

인생..
내 인생의 변화라고 한다면, 내년 초에 주니어가 탄생한다.. 머 아직 성별도 모르긴 하는데.. 원래는 이번달에 알았을 테지만 요녀석이 아침 일찍이라 자고 있어서 그런지 성별을 알 수가 없었다.. 그래도 내년에 만난다고 하니 건강하게 잘 있다가 나와줬으면 한다..

개발자..
이전까지는 막연하게 따라가면서 공부라기보단 관심을 갖으려고 노력을 해왔다.. 그 사이 사이 면접도 봤었고, 그러면서 좌절감도 맛보고 울화통 터지는 일도 있었다.. 물론 그런 일들 덕분에 블로그도 할 수 있었고, 세미나도 갈 수 있었고, 최근에는 코딩 테스트를 하면서 로직에 있어서 조금 더 고민해보는 시간도 갖고 있다.. 그로 인해서 GitHub 에 소스도 올리고 신이난다고 할 순 없지만 신기하고 재미스럽긴 하다.. ㅎㅎㅎ..

취미생활..
취미는 한정적이지만 꾸준함이 나를 지켜주는게 아닌가 싶다.. 올해 초 재미를 붙였던 피온3[피파온라인 3] 도 꾸준히 하고 있고, 꾸준히 하다보니 처음 할 때 보다는 정보도 많이 알고 나 스스로의 기준이라고 해야될까.. 그런것도 많이 생겨서 이제는 좀 수월하단 생각이 든다.. 게임 자체에 대한 스킬은 그다지 늘지 않았지만 말이다..

그리고 무엇보다 가장 중요한 운동.. 건강 관리를 위해서 하는 것인데 정말 오래했고, 이제는 그냥 생활의 일부가 된 듯하다.. 요새는 날도 너무 덥고 여름 휴가 시즌이다 머다 그리고 곧 있을 추석 때문에도 많이 못 가고 있지만 꾸준히는 하고 있다.. 손을 놔버리면 평생 놔버릴듯해서리.. ㅎㅎㅎ

아주 오랜 시간이 지나지 않은 듯 한데.. 나 스스로의 지식만을 올리는 블로그가 아니다보니 시간이 지나도 뿌듯함이란 없을 줄 알았는데 지난 글의 리스트를 주욱 봤는데 감회가 참 새롭기도 하고 언제 이렇게 멀 많이 올렸지 싶다..

더 앞으로 나아가고, 조금씩이라도 변화하기 위해서 이제 앞으로 또 발전해가야겠다.. 그런데 말이지.. 역시나 개발자의 길은 어려워.. ㅠㅜ

[JAVA] Baekjoon 시험 점수를 입력받고 성적 출력해보기..

이제부터는 if else 에 대한 문제들이다.. 근데 생각보다 if 파트에는 많인 문제가 할당되진 않았었다.. 그래도 앞선 for 보다는 조금 더 적응이 된다고 해야되나.. 그런 문법이어서 자신감을 갖고 시작해보련다.. 막상 들어가면 어떻게 될지는 모르겠지만 말이지.. ㅋㅋ..

문제
시험 점수를 입력받아 90 ~ 100점은 A, 80 ~ 89점은 B, 70 ~ 79점은 C, 60 ~ 69점은 D, 나머지 점수는 F를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 시험 점수가 주어진다. 시험 점수는 0보다 크거나 같고, 100보다 작거나 같은 자연수이다.

출력
시험 성적을 출력한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package step4;

import java.util.Scanner;

public class PrintIfScore {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
  
        Scanner scan = new Scanner(System.in);
        
        //int scoreVal = 100;
        int scoreVal = scan.nextInt();
  
        //90 ~ 100점은 A, 80 ~ 89점은 B, 70 ~ 79점은 C, 60 ~ 69점은 D, 나머지 점수는 F
        String scoreRank = "F";
        if(90 <= scoreVal && scoreVal <= 100) {
            scoreRank = "A";
         
        } else if(80 <= scoreVal && scoreVal < 90) {
            scoreRank = "B";
         
        } else if(70 <= scoreVal && scoreVal < 80){
            scoreRank = "C";
         
        } else if(60 <= scoreVal && scoreVal < 70) {
            scoreRank = "D";
        }
        System.out.println(scoreRank);
    }

}//






음.. 문제 자체가 어렵다고 보진 않는다.. 다만 해당 문제는 로직을 이해하고 문제를 풀어가는 스킬보다 국어에 대한 부분이 더 중요하다고 본다.. 왜냐면 우리나라 말은 몇 점 미만, 이하, 이상 등등 어떻게 생각하느냐에 따라서 기준이 되는 점수가 포함 되기도 하고 안되기도 하기 때문이다..

그런 관점에서 해당 문제에서는 점수의 등급 구간에 대한 부분을 잘 생각하면서 풀면 손쉽게 풀수 있으리라 생각한다..

[Book] 에릭 마이어의 CSS 노하우..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

에릭 마이어의 CSS 노하우 - 6점
에릭 마이어 지음
한선용 옮김
인사이트

에릭마이어는 CSS쪽에서는 너무 유명한 사람이라 오랫동안 크게 신경못쓰고 있던 CSS를 다시 좀 보려고 고른 책이다. 에릭마이어의 이름값에 너무 기대하지만 않는다면 괜찮은 책이라고 본다. CSS 설명은 좀 지루할 가능성이 있는데 설명이 상당히 잘 되어 있고 CSS의 각 기능을 일일이 설명하는 대신에 기본이 되는 내용과 원리를 잘 설명하고 있어서 개념을 잡는데 참 좋다고 생각한다. 특히 우선순위를 나타내는 CSS 명시도에 대한 설명은 다른 데서는 명확하게 나와있지 않은 알찬 내용이라고 생각한다.

책 제목대로 CSS를 일일이 설명하기 보다는 기본적인 내용과 함께 CSS 작업을 할때 만나기 쉬운 이슈들을 어떻게 해결 할 수 있는지 사례별로 잘 설명하고 있어서 CSS 작업을 할때 참고용으로 쓰거나 이 책으로 공부할 때 레이아웃 작성하는 방법등을 포함해서 잘 익혀두면 도움이 될듯 하다. HTML5와 CSS3 등장이후에 CSS에도 많은 변화와 새로운 기능 추가가 이뤄지고 있는데 책의 출시 시기 상으로도 그렇고 CSS3같은 신기술에 대한 내용보다는 CSS의 기본을 다지는데 도움이 된다. 마지막 장에 CSS3에 대한 얘기들이 좀 있기는 한데 간단한 정도로만 나와있고 최신의 스펙까지 다루는 것은 아니라서 CSS3를 익히기 위해서라면 다른 자료를 더 보아야 한다.
나는 CSS가 주력이 아니다 보니 항상 좀 어렵고 그래서 오랫동안 CSS는 깊게 보지 않았기 때문에 간단한 부분외에는 잘 다루지 못한다. 논리적인 흐름을 다루는 프로그래밍과 CSS는 접근방법이 좀 다른게 아닐까 싶은 생각이 들정도로 좀 어렵다. 물론 다른 부분에 비해서 시간을 많이 들이지 못하기 때문이 가장 크겠지만 앞으로는 CSS를 많이 다루어야 할듯해서 선택한 책으로는 괜찮았다. 책보다는 개인적인 일로 책을 집중해서 보지 못하고 상당히 오랜기간동안 띄엄띄엄 보게된게 아쉽다면 아쉽다랄까....

My Comment..
이러한 좋은 책도 있구나 하면서 글을 갖고 왔다.. 나도 CSS 는 퍼블리가 포함된 디자인팀에서만 받으면 된다는 생각을 많이 한편이다.. 정말 내가 손을 댄다고 해봐야 아주 작은 부분들..?? 수치정도..??

하지만, 전문 지식까진 아니어도 이런 서적이나 혹은 더 좋은 웹 자료가 있다면, 그런 자료들을 통해서 공부를 해두면 좋을것이라고 생각한다.. 문제는 나에게 있지만 말이지.. ㅎㅎ..

항상 좋은 책이라고 생각하고 나와 관련되 있거나 이런 것도 있구나 하는 호기심에서 포스팅을 가져오고 나도 읽어봐야지.. 생각은 하지만 그러지 못하는 부분때문에 좀 아쉽긴 하다.. ㅠㅜ


2016년 8월 22일 월요일

[DEV] GitHub 에 처음으로 소스를 올려보다..

얼마전부터 코딩 테스트를 하고 있다.. 그런데 하다보니 단순히 이클립스를 통해서 코딩만 해두고 사이트에서 정답유무만 확인 한 후에는 혹여라도 나중에 소스가 필요하거나 보려고 할 때 어떻게 하지라는 생각을 했다.. 막말로 이직이라도 하면 혹은 포맷이라도 하면..

물론 해당 코딩 테스트 사이트를 가서 확인 해볼 수도 있지만, 그 사이트가 사라진다면..?? 그래서 GitHub 를 사용해보기로 했다.. 가입을 해둔지는 좀 됬지만 이번 기회에 작은거라도 한 번 올려보면서 사용해보자는 생각이었는데.. 이거 어째 일이 점점 커지는건 아닌가 모르겠다..

들어가서 이런저런 기능들을 봤는데 다는 모르겠지만 우선 자신만의 저장소[repository] 를 만들어야 했다.. 그래서 나는 redpigstudy 라는 이름으로 만들었다..

그 후에는..?? 이제 어떻게 소스를 올릴것인가.. 이게 제일 문제여서 검색을 또 해봤는데 다른 블로그 포스팅 보다 내가 아주 손쉽게 접근이 가능하고 설명도 잘 해주신 분이 있었는데.. 그곳이 바로 이곳이다.. 해당 포스팅을 보고서 따라해보니 아주 손쉽게 GitHub 에 소스를 올릴 수 있었다..










지금은 단순하게 좀 올리고 있는데 혹시 아는가.. 나중에 좀 더 거창하게 올릴 수 있을런지.. ㅋㅋㅋ.. 당장은 급하게 올리느라고 step3 code test.. 이런식으로 올렸는데 문제를 commit message 에 올리도록 해야겠다.. 그래야 나중에 내가 보더라도 직관적으로 이해가 될듯하다..

무엇인가를 계속 새롭게 하는 것이 좋은것인지는 모르겠지만 나 스스로 필요에 의해서 먼가를 해보는 것은 좋은거싱라고 생각을 하면서 그냥 해보려고 한다.. ㅎㅎ..

하아;; 근데 이제는 코딩 테스트 하나 하면, 블로그 포스팅하고, GitHub 에 올리고 먼가 일이 엄청 많아지고 있다.. ㅠㅜ 꾸준히 해야되는데.. 잘 될런지 모르겠고만.. 냥흠..;;;

[EP] "오픈소스 제대로 활동하기" 세미나 후기..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

몇 주전 페이스북 "OSS 개발자포럼" 그룹의 주최로 이희승님오픈소스 제대로 활동하기를 주제로 발표하신다는 걸 알고는 냅다 신청해서 지난 토요일(25일)에 갔다가 왔다. 이희승님은 Mina, Infinispan, Netty 프로젝트를 만드신 분으로 현재는 트위터에서 일하고 계시고 국내에서 오픈소스쪽 활동으로는 가장 활발하다고 할 수 있다. 이희승님은 이름 정도만 알고 있다가 지난번 Deview에서 Netty 발표를 발표도 참 잘하신다는 것을 알게 되어서 이번에는 망설일 이유가 없었다. 오픈소스에 최근 관심도 더 커지기도 했고...

오픈소스 활용 vs. 활동
처음에는 가볍게 오픈소스의 활용과 활동에 대해서 얘기하셨다. 가장 간단한 것은 오픈소스를 단순히 이용하는 것이고 내부적으로 수정해야 할 부분이 있어서 수정해서 사용(internal fork)하기도 하는데 이런 경우 점점 원 프로젝트와 달라지는 부분이 커지기 마련이라 관리가 쉽지 않다. 수정한 내용을 단순히 공개하기도 하는데(external fork) 다른 사람이 사용할 수 있으므로 좀 더 나은 방법이기는 하지만 원 프로젝트에 적용된다는 보장이 없으므로 해당 프로젝트에서 직접 활동하는 것이 더 낫다.

블로그나 강연을 통해서 오픈소스에 대한 경험을 공유할 수 있다. 상용 소프트웨어의 경우 동작하는 부분은 그대로 놔두는 경향이 있지만 오픈소스에서는 디자인등을 적극적으로 변경해 나가므로 문서에 제때 반영되지 못하는 경우가 많은데 실 사례를 많이 공유함으로써 사람들이 더 쉽게 사용할 수 있게 된다. 이는 오픈소스 프로젝트와 느슨하게 연결되어 있지만 중요한 부분이고 그 외에 버그리포팅이나 기능추가 요청, 토론참여 등이 있다.

오픈소스 활동의 목적
그럼 오픈소스 활동을 왜 해야하는것인가? 활동하기 전에 목적을 확실히 할 필요가 있다. 가장 많이 사용하는 웹서버를 만드는 것을 가정했을 때 (물론 재미난 과정이겠지만) 스펙 준수나 호환성 테스트를 다 하는 것은 무척 시간이 많이 들기 때문에 이러한 부분 오픈소스를 사용하고 핵심 역량에 집중해서 개발할 수 있다. 그리고 오픈소스에 직접 참여하면 사용하는 오픈소스에 변경해야 할 부분이 생겼을 때 직접 참여해서 적극적으로 변경할 수 있다. 그렇지 않으면 기다리거나 내부적으로만 수정하게 되서 관리가 어려워진다. 적극적으로 참여해서 오픈소스 로드맵에 직접 참여할 수 있고 설사 의견이 반영되지 않는다고 하더라도 그 토론에서 얻을 수 있는 것이 많다.

그리고 활동 자체에도 큰 의미를 둘 수 있다. 보통 오픈소스 프로젝트는 다양한 나라에서 다양한 사람들이 참여를 하게 되므로 사람의 성품이나 치적에 대한 편견없이 코드에만 집중해서 커뮤니케이션할 수 있는 능력을 기를 수 있다. 많은 사람이 온라인으로 협업하는 법을 배우게 되므로 얼굴보고 협업하는 것도 한결 쉬워진다. 사람에 대한 비난 보다는 코드가 중요하다는 것을 많이 배울 수 있다. 최근에 많아지고 있는데 오픈소스 활동을 채용절차의 일부로 활용하기도 한다. 물론 이는 좋은 코드를 작성했을 때의 이야기이지만 오픈소스 활동 자체가 좋은 코드로 발전하는 하나의 과정이라고 할 수 있다.

오픈소스 제대로 활동하기
주의할 점
자주 있는 경우는 아니지만 초기에 소위 찍히면 그 뒤에는 여러가지로 열심히 해도 잘 안되는 경우가 있으므로 처음부터 잘 해야 한다. 버그리포팅을 하는 입장에서는 하나의 이슈이지만 커미터들 입장에서는 수십, 수백개의 이슈가 올라오므로 단순 리포팅 자체는 큰 의미가 없다. 이해하기 어려운 영어나 불충분한 설명으로 버그리포팅을 하게 되면 우선순위가 낮아져서 처리되지 않으므로 최대한 자세하고 명확하게 리포팅해야 하고 서로의 시간을 소중하게 생각할 수 있어야 한다. 특히 "언제 해결되냐는 식"의 재촉은 찍히는 지름길이고 공식 채널이 아닌 비공식 채널(메일링, IRC, 이슈트래커가 아닌 개인 메일이나 전화)로 연락하면 무조건 공식채널로 연락하라고 하기 마련이다. IRC도 공식 채널이기는 하지만 기록으로 남고 누군가 다시 검색해 볼 수 있는 메일링이나 Stackoverflow를 이용하는 것도 좋은 방법이다.

버그 리포트
버그리포팅은 jira나 github 이슈등의 공식 이슈 트랙커를 사용한다. 버그 리포트를 올리기 전에 유사한 이슈가 있는지 필히 확인해야 하고 이미 존재한다면 기존 이슈에 보충할 내용만 추가하고 vote나 watch 등으로 관심을 표현하는 것이 좋다. 그리고 리포팅을 할 때는 사용 버전, OS나 VM등의 환경, 재현방법등을 자세하면서 깔끔하게 적는 것이 좋고 좀더 나아간다면 왜 이런 문제가 발생했다고 생각하는지를 찾아서 같이 올리거나 의심가는 부분의 소스코드를 알려준다면 처리되는 우선순위를 높힐 수 있다.
기능 제안
기능제안도 버그리포팅과 유사하게 이슈트래커를 사용한다. 마찬가지로 중복 등록이 되지 않도록 기존 이슈들을 검색해봐야 하고 기능을 요청하게 된 배경이나 어떤 효과가 있는지, 잠재적으로 예상되는 위험성, 구체적인 구현방법등을 함께 제안하면 좋다.

패치 보내기
이슈에 패치를 첨부하면 커미터들이 리뷰를 하게 된다. 코드가 너무 맘에 들어서 한번에 적용되는 경우는 흔치 않다. 보통은 관례를 맞춰달라거나 자세한 내용을 물어보거나 일부를 바꿔 달라고 하는 경우가 많다.(물론 때로는 칭찬도 듣는다.) 이러한 리뷰에 따라 패치를 다시 첨부하면 되고 해당 프로젝트에 개발자 가이드가 존재한다면 미리 숙지해 두는 것이 빨리 적용되는데 도움이 된다. 이렇게 리뷰하는 과정에서 포기하면 참여할 수 있는 좋은 기회를 놓치는 것이므로 끈기있게 해야 하고 커미터의 의견이라고 너무 끌려다니지만 말고 자신의 의견을 개진하는 것이 좋다.

Pull Request
Github가 사실상 오픈소스 코드 저장소의 표준이 되었기 때문에 요즘은 패치를 보내는 일은 많지 않고 대부분 Github의 Pull Request를 이용한다. DVCS의 장점을 이용해서 각 저장소의 변경사항을 자동으로 보여주고 개발자가 리뷰하면 원 저장소에 적용되는 방식으로 모두에게 편리해 졌다.

일원이 되기
프로젝트의 일원이 되는 경우는 패치를 하는 과정에서 커미터가 얘기가 잘 통한다고 느끼거나 좋은 코드를 항상 작성해서 굳이 매번 리뷰를 하지 않아도 되겠다고 느껴서 믿을 만한 수준이 되면 일원이 될 수 있다.

새로운 오픈소스 프로젝트 시작하기
새로운 오픈소스 프로젝트를 시작하기 전에 "기업과 개인의 이익을 넘어설 수 있는지" 고민해 볼 필요가 있다. 자신이 다른 사람에게 "믿을만한 개발자"라고 말할 수 있는 자격이 있는지 먼저 봐야 하고 내가 하고 싶어서 또는 회사가 원해서가 아니라 실제로 추구하는 가치가 무엇인지를 고민해 볼 필요가 있고 이는 생색내기가 아닌 진짜 오픈소스를 하고 싶다면 고민해 볼만한 일이다. 그리고 이러한 가치가 있다면 장기간 유지해야하고 회사외부로 오픈할 때도 편협하게 외부사람이라고 권한은 안주는 등의 결정에 영향을 줄 수 있고 진정으로 열린 프로젝트인지도 고민해 봐야 한다.

사례 소개 : open source @ twitter
많이 알려졌다 시피 오픈소스에 적극적인 트위터를 사례로 소개해 주셨다. 트위터는 현재 내부에서 개발한 프로젝트를 오픈소스로 공개해서 지속적으로 유지하고 대표적으로는 Bootstrap, finagle, ostrich, zipkin, twemproxy, mysql fork 등이 있다. 그리고 블로그를 통해서 기술을 공유하고 있고 내부에서 많이 사용하는 스칼라의 전파를 위해 Scala School이나 Effective Scala등의 문서도 공개하고 있다. 그 외에도 netty, apache hedwig, mesos, pig등의 오픈소스에 적극적으로 참여하고 개발자를 직접 고용해서 오픈소스개발을 하게 하고 있으며 Apache Software Foundation, Linux Foundation, Travis-CI등에 재정적인 지원을 하고 있다.

Epilogue
아주 긴 시간은 아니었지만 여러 오픈소스를 진행하면서 쌓인 실 경험에 바탕해서 얘기해 주셨기 때문에 알고 있던 내용이라고 하더라도 그 무게가 달랐고 시스템 적인것 외에 실제적인 부분은 잘 몰랐기에 느끼는 부분도 많고 오픈소스에 대한 꿈을 더 크게 품을 수 있었다.(올해 어느정도 발이라도 걸쳐보려는게 목표이긴 한데 ㅠ) Github 덕분에 오픈소스에 참여할 수 있는 기회는 무한하게 열린 상황이지만 가끔 간단한 거라도 리포팅이나 패치를 보내다가 무시당하거나 하면 맘이 상하는 경우가 많았는데 커미터의 입장에서의 이야기를 들어보면서 그런거에 일일이 맘상하면 안되겠다는 생각이 들었다.(뭐 대단한거 보낸것도 아니고...) 질문시간에도 여러 질문이 오갔는데 굳이 여기에 정리하진 않겠다. (궁금한 사람은 Insane님이 정리한 오픈소스 제대로 활동하기 멘토링 후기 참고)

마지막으로 원래도 그런 생각을 좀 하고 있어서 인지는 몰라도 이번 세미나를 들으면서도 사람들이 뭔가 과정을 뛰어넘어서 결과만 바라는 것 같은 느낌이 들었다. 직접적으로 말하면 오픈소스를 개발하고 사람들과 의견을 나누고 실력을 쌓는 과정을 생략하고 유명프로젝트의 커미터를 좀 더 쉽게 될 수 있는 방법이 없나? 하는 생각을 하고 있는 듯하게 느껴졌다.(편견일지도...) 내가 생각하기에 오픈소스에서 가장 중요한 것은 결국 실력이고 사실 실력만 있으면 그외에것은 다 무시할만한 수준이라고 생각한다. 이희승님이 나누어 주신 얘기도 실력은 제외하고 초기에 모를 수 있는 팁을 알려 주신 것이지 저런걸 다 지킨다고 커미터가 되는게 아니라 일단 해당 프로젝트를 직접 개발하고 멋진 코드를 작성할 수 있는 능력이 되야 하는데 그런 과정은 쉽게 넘어가고 싶은게 아닐까 하는 느낌이 들었다.(물론 나도 그런 능력이 아직 안되는데 잘하시는 분들을 얘기한건 아니다.)

이희승님이 얘기하셨듯이 오픈소스에 참여하는 과정은 아주 다양하다. 내가 아직 코드를 막 짤 수준이 아니라면 버그 리포팅을 할 수도 있고 질문에 답변을 열심히 달아줄 수도 있고 가이드 같은걸 만들어서 제공할 수도 있다. 몰론 패치를 보낼 수 있다면 더욱 좋겠지만... netty에 올라오는 이슈나 패치에 한국사람이 거의 없다는 이희승님의 얘기에 약간의 안타까움을 느끼면서 어떻게 커미터가 되느냐 마느냐 보다는 그냥 자신이 할 수 있는 부분에서 오픈소스 활동을 다양하게 하는 사람들이 많아졌으면 좋겠다. 그런 가운데서 커미터들도 더 나오고 그러겠지. 내 생각에는 오픈소스는 그게 더 좋은 방법이고 즐거운 방법이기에 그렇게 개발하면서 명예가 따라오는 것이지 명예를 얻기 위해서 오픈소스를 하는건 아니라고 생각한다. 국내 회사들의 오픈소스들을 개발자들이 거의 신경도 안쓰는 이유도 질답중에 이희승님이 비슷한 얘기하셨듯이 오픈만 했다고 다 오픈소스가 아니기 때문이 아닐지...



[JAVA] Baekjoon 1부터 N까지 합을 구합니다..

대망의 for 마지막 문제다.. 어느덧 마지막 문제라니 다음 단계의 주제인 if 들어가기전에 랭킹이나 올려볼까 싶기도 하고 ㅎㅎㅎ.. 랭킹이라고 하기에도 웃기지만 말이지.. 등수가 천단위라서 ㅋㅋㅋ..

문제
n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.

입력
첫째 줄에 n (1 ≤ n ≤ 10,000)이 주어진다.

출력
1부터 n까지 합을 출력한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package Code_201608;

import java.util.Scanner;

public class PrintForSum {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
  
        Scanner scan = new Scanner(System.in);
        
        //int sumNum = 3;
        int sumVal = 0;
        
        int sumNum = scan.nextInt();
  
        for(int i = 1; i <= sumNum; i++) {
            sumVal += i;
        }
        System.out.println(sumVal);
    }

}//




이번 문제는 그동안 고민하면서 풀던 문제들에 비하면 상당히 쉽다.. 증감에 대한 개념만 갖고 있다면 금세 풀리니 말이다..


어차피 기본 for 는 누구나 한다고 쳤을 때 18 라인 증감[+=]에 대한 부분이 가장 핵심이다..

[JAVA] Baekjoon 2007년 x월 y일이 무슨 요일인지 알아내보기..

for 코딩 테스트도 이제 막바지에 이르고 있다.. 고민하는걸 싫어하는편이긴 하지만 그래도 어쩌겠는가.. 개발자로 살고자한다면.. 그에 합당한 노력을 해야지.. 머 그렇다고 엄청나게 하는것도 아니긴 하지만.. ㅎㅎㅎ..

문제
오늘은 2007년 1월 1일 월요일이다. 그렇다면 2007년 x월 y일은 무슨 요일일까? 이를 알아내는 프로그램을 작성하시오.

입력
첫째 줄에 빈 칸을 사이에 두고 x(1≤x≤12)와 y(1≤y≤31)이 주어진다. 참고로 2007년에는 1, 3, 5, 7, 8, 10, 12월은 31일까지, 4, 6, 9, 11월은 30일까지, 2월은 28일까지 있다.

출력
첫째 줄에 x월 y일이 무슨 요일인지에 따라 SUN, MON, TUE, WED, THU, FRI, SAT중 하나를 출력한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package Code_201608;

import java.util.Scanner;

public class PrintFor2007 {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
  
        Scanner scan = new Scanner(System.in);
        String[] monthVal = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
        
        //int monVal = 1;
        //int dayVal = 1;
        
        int monVal = scan.nextInt();
        int dayVal = scan.nextInt();
  
        //월은 눈에보이는 월이 아닌 그 이전까지 계산 후 + 일을 한다
        for(int i = 1; i < monVal; i++) {
            if(i == 4 || i == 6 || i == 9 || i == 11) {
                dayVal = dayVal + 30;
          
            } else if(2 == i) {
                dayVal = dayVal + 28;
          
            } else {
                dayVal = dayVal + 31;
            }
        }
        //System.out.println(dayVal % 7);
        System.out.println(monthVal[dayVal % 7]);
    }

}//




문제를 보면 거창해 보이지만, 실제 코딩된 소스는 그렇게 길지는 않다.. 코딩 테스트 문제가 너무 길어도 문제긴 하겠지만 말이지.. ㅎㅎㅎ..

해당 문제에서 가장 핵심은 달[Month]에 대한 개념을 어떻게 잡느냐이다.. 19라인 주석에도 설명을 하긴 했지만 난 처음에 눈에 보이는 그대로 1월부터 3월 혹은 1월부터 6월 해서 3번, 6번을 for 가 돌아야된다고 생각을 했다..

그런데 그렇게하면 절대 답이 안나오지.. 우리가 5월 1일에 해당하는 요일을 구한다고 치면, 5번의 for 가 아닌 4번의 for 가 돌아야된다.. 왜냐면 1월부터 4월까지 총 4번 그리고서 그 이후에 1일을 더하는 개념이 되는 것이기 때문이다.. 아흐 난 첨에 이걸 그렇게 생각을 못해서 계속 삽질을 하면서 왜 답이 안나오지..?? 이 생각만 했다.. ㅋㅋ

난 처음에 for(int i = 1; i < 6; i++) 이런식으로 되야 한다고 생각을 했다.. 5번이 for 가 수행하도록 하지만 그것이 아닌 for(int i = 1; i < 5; i++) 가 되고 4번 수행하도록 코딩을 해야된다.. 그래야지만 위에 잠시 언급한 개념과 맞는 코딩이 되는 것이다..

그 이후에는 머 좀 심플하다.. 각각의 월에 대한 날짜 기준이 있으니 그것대로 if 문을 구성해주면 되겠다.. 출력은 최종적으로 나온 값을 나눈 후에 그 값에 대한 것을 배열로 따져서 요일을 보여주면 된다.. 즉, monthVal[dayVal % 7]

[UFC] UFC 202 맥그리거 판정승.. 하지만 3차전은 글쎄..

어제 UFC 202 이벤트가 있었다.. 화려한 대진들이었고, 경기 또한 전체적으로 박진감 넘치게 진행됬다.. [임현규 선수가 TKO 패한 것에 대해서는 유감이다..] 하지만 우선 내 관심사가 가장 큰 경기는 단연 메인 이벤트였기에 그 경기를 포스팅 하려고 한다.. 그 외 경기결과는 이곳에서 확인을 하면 좋을 듯 하다..

코너 맥그리거 vs 네이트 디아즈 2차전..
결과는 맥그리거의 5R 판정승이다.. 점수는 2:0 이며, 한 명의 저지는 무승부를 줬다.. 그정도로 박빙이었단 얘기지.. ㅎㅎ..











이번 경기에서는 맥그리거가 승리를 하기 위해서 작정을 하고 나온듯 했다.. 1차전에서는 막무가내로 압박을 했다고 할까.. 필요이상으로 밀어붙이는 경향이 있었지만 이번에는 달랐다.. 외각으로 돌면서 로우킥으로 디아즈의 약점중 하나인 하체를 공략했는데 그게 잘 먹혀들어갔다..

다만, 그 부분이 1R 에서는 상당히 유효했는데 그 이후 라운드가 문제였다고 본다.. 2R 에서도 로우킥을 섞어가며 경기를 하긴 했지만 1R 에서 보여준 스타일과는 약간 틀렸다.. 왜냐면 디아즈가 누구인가.. 맷집하면 그가 떠오르게 만드는 선수다.. 이번에도 역시나 좀비복싱으로 계속 밀고 들어가다보니 맥그리거의 전략이 100% 먹히진 않았다.. 아니, 1R 와 비교했을 때 전략이 잘 먹히지 않았다고 보는 것이 맞는듯하다..

3R 에서는 맥그리거가 조금 애처로울 정도로 많이 맞았다.. 하지만 맥그리거도 대단한 것이 그 상태에서도 집중력을 잃지 않았고, 왠간한 주먹은 머리 컨트롤을 통해서 흘려버렸다.. 그래서 많이 맞았다고 생각함에도 불구하고 얼굴에 상처가 크게 나지 않은 이유이기도 한 것이다.. 오히려 디아즈만 피투성이였을 뿐이다..

4R, 5R 에 들어서도 둘의 스타일은 비슷했다.. 디아즈는 좀비복싱으로 밀고 들어갔으며, 맥그리거는 분명 힘이 빠지고 체력이 고갈되긴 했지만, 애초에 장기전을 염두해둔 패턴대로 계속 주변을 돌면서 난타전보다는 경기를 이기는것에 초점을 맞춘 경기를 했다.. 특히나 디아즈는 막판 변화 및 점수를 따기 위해서 테이크 다운을 몇차례 시도했지만 맥그리거가 다 수비를 해버렸다.. 디아즈 입장에선 정말 아쉬운 대목일 수 밖에 없다.. 5R 막판에는 테이크다운을 하기는 했으나 이미 경기가 다 끝나기 직전인 시점이라 저지들이게 임팩트를 주기에는 무리가 있었다고 본다..

전반적인 경기는 누가 이겼느냐가 문제가 아닐정도로 재밌는 경기를 했다.. 보는 내내 긴장감을 놓을수 없었으니 말이다.. 그런데 3차전에 대한 부분은.. 개인적으로는 글쎄.. 라는 생각이다..

이번 경기에서 맥그리거가 엄청난 화력 및 맷집을 통해서 디아즈를 어느정도 가지고 놀았다면 3차전이 기대가 될 것이다.. 하지만 본인과 비슷한 리치의 디아즈 그리고 본인보다 더 큰 키와 경이로운 맷집.. 체급의 차이를 또 한 번 느끼게 해준 경기였다고 본다.. 아무리 맥그리거가 이겼을지라도 기본적인 체급차이는 어쩔 수 없는부분이라는 생각을 하게끔 한 경기이기도 하다..

흥행을 위해서야 UFC 측에서 맥그리거의 페더급 타이틀전 이후에 3차전을 준비할 수도 있지만, 안그랬으면 하는 생각이다.. 맥그리거가 3차전을 할정도로 디아즈에게서 피지컬적은 차이점을 잘 극복해냈다고 생각하지 못하기 때문이다.. 이제는 몸을 다시 잘 추스려서 다른 생각보단 페더급부터 정리하길 바란다..

2016년 8월 19일 금요일

[JAVA] Baekjoon 첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 출력해 봅니다. (오른쪽 정렬)..

별출력 끝판왕이다.. 말이 좀 웃긴가.. 무튼 마지막 문제인데 5 to 1 을 해봤으니 당연히?? 자연스럽게 5 to 1 에 대한 오른쪽 정렬을 해봐야겠지.. ㅎㅎ

문제
첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 찍는 문제

하지만, 오른쪽을 기준으로 정렬한 별 (예제 참고)을 출력하시오.

입력
첫째 줄에 N (1<=N<=100)이 주어진다.

출력
첫째 줄부터 N번째 줄 까지 차례대로 별을 출력한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package Code_201608;

import java.util.Scanner;

public class PrintForStarFour {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
  
        Scanner scan = new Scanner(System.in);
  
        //int a = 5;
        int a = scan.nextInt();
  
        for(int i = 1; i <= a; i++) { //세로
   
            for(int j = 1; j <= i - 1; j++) { //가로, 공백을 우선 출력
                System.out.print(" ");
                //System.out.print("@");
            }
            for(int k = a; k >= i; k--) { //가로, 공백 제외한 공간을 * 로 출력
                System.out.print("*");
            }
            System.out.println("");
        }
    }

}//





이 문제 역시 고민을 좀 했는데.. 별 출력 4문제중에 제일 고민을 오래 했다.. ㅎㅎㅎㅎ.. 이놈의 실력이;;;


여기서도 역시나 난 공백을 어떻게 찍어야되지부터 고민의 첫 출발선이었다.. 우선 좌측에 공백을 찍는데 5 to 1 을 우측정렬을 해야되니까 좌측 공백은 0 to 4 가 되어야 한다.. 그러다보니 첫 for 는 1 부터 시작을 해서 세로 i 에 대해서 - 1 이 되어야 했다..

또한, 공백을 생각해서 찍어뒀으니 이제는 나머지 우측이 고민이었다.. 우측은 입력값에 대해서 역으로 줄여가면 되니 우선 첫 시작점은 a 였고, 그 다음은 세로 i 보다 크거나 같을 때까지 줄여나가면 출력이 정상적으로 됬다..

지금이야 물론 위와 같이 설명이 가능하지만 고민을 하면서 코딩을 할 때는 최종 제출하기전까지 많이 틀렸다.. 내가 스타일상 고민을 해서 한방에 짠!!! 하고 코딩하는 스타일이 아니어서 출력을 해보고 수정을 하면서 그 안에서 패턴을 찾고, 정답을 찾아냈다..

한방에 답을 찾으면 좋겠지만, 무엇보다 이정도의 초급 문제는 그래야 되는것이 당연할 수도 있지만 답을 찾아가는 과정이 더 중요하고 나 스스로 고민을 해보는 것이 중요하다고 생각하면서.. 별들이여 안녕.. 



[JAVA] Baekjoon 첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 출력해 봅니다..

이젠 별을 반대로 출력할 순서다.. 1 to 5 였다면, 이제는 5 to 1 이란 소리징..

문제
첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 찍는 문제

입력
첫째 줄에 N (1<=N<=100)이 주어진다.

출력
첫째 줄부터 N번째 줄 까지 차례대로 별을 출력한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package Code_201608;

import java.util.Scanner;

public class PrintForStarThree {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
  
        Scanner scan = new Scanner(System.in);
  
        //int a = 5;
        int a = scan.nextInt();
  
        for(int i = 1; i <= a; i++) { //세로
   
            for(int j = i; j <= a; j++) { //가로, 기준이 i 부터 a 까지 채워질 때 까지
                System.out.print("*");
            }
            System.out.println("");
        }
    }

}//





이번 문제에서도 난 역시나 손쉽게 딱!!! 구하지는 못하고 좀 고민을 했다.. 어떻게 하면 역순으로 하지..??


세로 i 에 대해서 가로 j 와 입력으로 들어올 a 에 대한 범위를 어떻게 정해주느냐가 핵심이었다.. 처음에는 무조건 순차적으로 1부터.. 1부터 이것만 생각하다보니 더 난관에 빠졌는데.. 여기서도 역시나 문제를 풀고보면, 너무 하나의 시점에 빠져서는 문제를 풀기가 쉽지 않다는 교훈을 얻게 된 나다..

[UFC] UFC 202 드디어 눈 앞에 성큼..

아마도 요새 리우 올림픽 시즌이라 그런지 UFC 뉴스를 항상 보는 공간에 대부분 올림픽 소식이다.. 그 와중에 UFC 202 에 대한 뉴스가 올라왔다.. 그래서 간략하게 포스팅 해본다..


위 이미지를 보면 이번 UFC 202 에 대한 대진이다.. 이번 이벤트의 최고 이슈는 맥그리거 vs 디아즈 의 2차전이다.. 물론 다른 경기도 재미난 매치가 존재하고, 무엇보다 우리나라 선수 임현규가 출전을 하기도 한다..

하지만, 누가 머래도 이슈는 메인 이벤트에 관심이 쏠릴 수 밖에 없다.. 나도 이날 일이 좀 있어서 본방사수를 할 수 있을지는 모르겠지만 엄청 기대가 되고 설레이고 있다..

무엇보다 맥그리거는 과거 1차전에서 급격히 체력이 떨어지면서 디아즈에게 서브미션 패배를 하였기에.. 더더욱 이번 경기에 벼루고 있는 중이다.. 특히 이번 경기를 이기면 1승 1패가 되기 때문에 3차전을 통해서 최종 승자를 가리자는 것이 맥그리거의 생각이다.. 물론 UFC 에서 그 제안을 수락할 때 얘기지만.. ㅋㅋ..

맥그리거의 훈련캠프 말대로라면 1차전 때와의 같은 실수를 없애기 위해서 무게를 천천히 올리면서 컨디션 조절에도 힘을 썼다고 하는데.. 과연 어떠한 모습으로 표출이 될런지.. 이번주 일요일[21일 오전 11시부터 SPOTV가 생중계]이 상당히 기대 된다..

[JAVA] Baekjoon 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개 출력해 봅니다. (오른쪽 정렬)..

드디어 올것이 왔구나.. 이번 별출력 문제는 생각을 조금 더 해야된다.. 순차적으로 별을 늘려가면서 출력하는 것 뿐만 아니라 가장 기본이 되는 좌측 정렬이 아닌 우측 정렬을 해야되기 때문이다..

문제
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

하지만, 오른쪽을 기준으로 정렬한 별 (예제 참고)을 출력하시오.

입력
첫째 줄에 N (1<=N<=100)이 주어진다.

출력
첫째 줄부터 N번째 줄 까지 차례대로 별을 출력한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package Code_201608;

import java.util.Scanner;

public class PrintForStarTwo {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
        // TODO Auto-generated method stub
  
        Scanner scan = new Scanner(System.in);
  
        //int a = 5;
        int a = scan.nextInt();
  
        for(int i = 1; i <= a; i++) { //세로
   
            for(int j = 1; j <= a - i; j++) { //가로, 공백을 우선 출력
                System.out.print(" "); //줄바꿈이 아니므로 공백을 출력
                //System.out.print("@");
            }
            for(int k = i; k > 0; k--) { //가로, 공백 제외한 공간을 * 로 출력
                System.out.print("*");
            }
            System.out.println("");
        }
    }

}//





결과를 보면 한 번 틀렸는데 처음 제출할 때 20 라인 주석으로 된 부분을 보면, 테스트를 위해서 @ 표시를 한 상태로 제출을 해서 오답이었다.. ㅎㅎㅎ.. 공백을 표시했어야 되는데 말이지.. ~_~..


우선 이문제는 접근을 어떻게 하느냐가 제일 중요한듯하다.. 좌측이 아닌 우측 정렬을 하려면 좌측에 공백을 줘야된다.. 그러려면 어떻게..?? 핵심적으로는 for 를 두 개를 써야되며, 크게는 세개를 써야된다.. 전체적인 for 하나, 공백 출력 for 하나, 실제 별 출력 for 하나 이렇게 말이다..

무엇보다 공백을 단순히 머리로 생각하지말고, 나처럼 @ 이나 기타 문자를 통해서 화면 좌측부분을 출력한 후 우측을 천천히 고민해보는것이 좋다고 생각한다.. 머리가 좋은 사람은 상관없겠지만, 나 같은 경우에는 눈에 보이지 않는 상태에서 코딩하는게 젤 어렵다.. ㅋㅋㅋ..

단순한 문제임에도 for 이다보니 조건 생각하는 곳에서 시간을 꽤나 잡아먹은 문제다.. 나중에 더 어려운 문제는 어뜨카지.. ㅠㅜ.. 다른 분들은 쉽게 쉽게 잘 해결하시리라 믿으며..

[JAVA] Baekjoon 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개 출력해 봅니다..

계속해서 for 에 대한 문제들이다.. 그래도 별출력 문제가 끝나고나면, 또 다른 것들이 기다리고 있으니 더욱 힘내보자규..

문제
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

입력
첫째 줄에 N (1<=N<=100)이 주어진다.

출력
첫째 줄부터 N번째 줄 까지 차례대로 별을 출력한다.

for 이긴 하지만 이번 문제는 별출력 문제중에도 가장 초급 문제라고 할 수 있다.. for 돌면서 증가만 시키면서 라인에 출력만 하면 되기 때문이다..

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package Code_201608;

import java.util.Scanner;

public class PrintForStarOne {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
        // TODO Auto-generated method stub
  
        Scanner scan = new Scanner(System.in);
  
        //int a = 5;
        int a = scan.nextInt();
  
        for(int i = 1; i <= a; i++) { //세로
   
            for(int j = 1; j <= i; j++) { //가로, i 를 a 로 하면 5개씩 출력
                System.out.print("*");
                //System.out.println("*"); //줄바꿔서 세로로 출력
            }
            System.out.println("");
        }
    }

}//




[JS] Handlebars에서 if문에 헬퍼함수 사용하기..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

handlebars는 템플릿 언어인 Mustache를 확장한 템플릿 라이브러리이다. handlebars를 소개하는 글은 아니지만 처음 보는 사람들을 위해서 간단히 설명하자면 다음과 같이 템플릿을 정의한다.

1
2
3
4
5
6
7
8
9
Html

<script id="example-template" type="text/x-handlebars-template">
  <ul>
    {{#each members}}
      <li>{{name}}
    {{/each}}
  </ul>
</script>

<script> 태그를 사용해서 정의해야 하는 것은 아니고 그냥 템플릿 문자열이면 되기는 하지만 개인적으로는 관리하기도 편하고 작성도 편해서 <script> 태그를 이용하는 방법을 좋아한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
Html

<script type="text/javascript" src="/components/handlebars.js/handlebars.js"></script>
<script type="text/javascript">
  window.addEventListener('load', function(evt) {
    var m = {
      members: [
        {name: 'outsider'},
        {name: 'zziuni'},
        {name: 'danni'},
        {name: 'fallroot'},
        {name: 'boxer'},
        {name: 'aj'},
        {name: 'insane'},
        {name: 'j2p'}
      ]
    }
    var source = document.getElementById('example-template').innerHTML;
    var tmpl = Handlebars.compile(source);
    document.getElementById('wrap').innerHTML = tmpl(m)
  }, false);
</script>

앞에서 정의한 템플릿을 위와 같이 사용한다. <script> 태그로 정의한 템플릿을 가져와서 handlebars로 컴파일해서 템플릿으로 만들고 템플릿에 객체를 전달해서 HTML을 생성한다. 여기서는 wrap라는 <div>에 변환된 <li>를 넣도록 만들었다. 이제 <li>태그를 만들때 name이 모음으로 시작하는 경우에는 다른 스타일을 주기 위해서 if 문을 사용한다고 해보자.

1
2
3
4
5
6
7
8
9
Html

{{#each members}}
  {{#if @index % 2 == 0}}
    <li class="vowel">{{name}}</li>
  {{else}}
    <li class="consonant">{{name}}</li>
  {{/if}}
{{/each}}

템플릿을 위와 같이 작성하기 쉽지만 handlebars는 저런식의 if문을 제공하지 않는다. if자제가 헬퍼메서드로 등록되어 있는데 if 헬퍼함수에 전달한 값을 true/false 여부만 판단할 뿐이고 일반적인 자바스크립트처럼 저런식의 표현식은 제공하지 않는다. {{#if name}}과 같은 정도로만 사용할 수 있고 name을 가지고 true/false 여부만 판단한다.(name은 값이 존재하므로 저렇게 사용하면 여기서는 항상 true이다.)

하지만 당연히 간단한 if문 외에 로직이 필요한 if문이 필요하게 마련인데 이는 직접 헬퍼함수를 등록해서 해결할 수 있다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
JavaScript

Handlebars.registerHelper('isVowel', function(options) {
  var regexp = /^[aeiou]/;
  if (regexp.test(this.name)) {
    return options.fn(this);
  } else {
    return options.inverse(this);
  }
});

헬퍼함수는 Handlebars.registerHelper()를 사용해서 등록할 수 있고 첫 인자가 헬퍼함수의 이름이고 두번째 함수가 헬퍼함수이다. 헬퍼함수는 기본적으로 options라는 객체를 인자로 받는데 이는 자동으로 전달되는 인자이다. 즉 options만 받도록 작성했다는 것은 전달하는 인자가 없다는 것으로 인자가 있다면 자동으로 앞에 붙는다. 즉 인자가 1개 있으면 function(arg1, options) {} 처럼 작성해야 한다. 여기서는 isVowel이라는 헬퍼함수를 if문처럼 사용할 것이므로 원하는 조건(여기서는 이름이 문자로 시작하면)이 true이면 options.fn(this)를 반환해서 if 구문의 내용을 사용하고 false이면 options.inverse(this)를 반환해서 else 구문을 사용하도록 작성했다. handlebars에서는 대부분 그런데 this에 현재 컨텍스트의 값이 들어간다.(여기서는 each문으로 돌아가는 members의 값들..)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Html

<ul>
  {{#each members}}
    {{#isVowel}}
      <li class="vowel">{{name}}</li>
    {{else}}
      <li class="consonant">{{name}}</li>
    {{/isVowel}}
  {{/each}}
</ul>

템플릿은 위와 같이 작성한다. if문대신에 isVowel 헬퍼함수를 사용했다.({{/isVowel}}로 닫아준 것에 주의!!) else문은 그대로 사용하고 이렇게 사용하면 원하는 조건으로 if문을 사용할 수 있다. 물론 헬퍼함수에 파라미터가 필요하다면 전달해주면 된다.