사수가 없어서 혼자 한다는 신입분들 글이나 진로문제 글들을 읽다보니 

 

저 신입때 만났던 사수분이 생각나네요. 그때는 진짜 힘들었지만 신입분들이 스스로 공부할 때 

 

참고하면 좋겠다 싶어서 써봅니다. 입사 첫주에 다짜고짜 스트럿츠로 로그인되는 게시판 만들어 학원에서 배운거라 여차저차 만들었더니 

 

둘째 주에 스프링 대충 교육시켜주고 디비테이블 긁어서 리스트로 뿌려주는 스프링소스 던져주고 스프링 으로 바꿔

 

바꾸고 나니 셋째 주에는 AJAX이용해서 DB에서 가져와서 동적으로 변하는 셀렉트박스 대분류,중분류,소분류 만들어.

 

넷째주에는 제이쿼리로 바꾸고 데이터 형식도 JSON으로 바꿔. 5주차되니까 마이플랫폼 가져와서 교육자료 던저주고는 

 

리스트 2개뿌리고 각 리스트 데이터끼리 교환가능하해.

 

사실 마이플랫폼은 그때 이후로는 쓸일이 없었다는 슬픈전설이..

 

마이플랫폼은 왜했냐니까. 그런것도 써봐야 어떤 UI를 만나도  쫄지 않는다고.. 그렇게 6주차째 되니까 너는 이제 어떤 서버프레임워크와 어떤 UI를 만나도 데이터를 자유롭게 주고받을 수 있다며 DB를 하자고 함. 


6주차에 조인 아우터 조인 서브쿼리 열데이터 행으로 출력 행데이터 열로 출력 기본 함수들 트리형으로 보여주기 아무튼 DB데이터가 화면에 어떤식으로 나타날수 있는지는 이때 다해본거같음. 


사수가 이렇게 보이게 해봐 하면 나는 쿼리 만들 어서 컨펌받는 식으로 했음. 이때가 정말 야근도 많이하고 제일 힘들 었음 


7주차부터는 저장 프로시져함 이 부분은 프로그래밍 기초를 배우는 느낌이라 별로 어렵지 않았음.


8주차에는 실행계획 보기 옵티마이져.인덱스설정 이런 튜닝쪽 비슷하게 배움. 힌트나 인덱스에 따라 빨라지고 느려지는거 보여주면서 그렇게 두달하니까. 


이제야 넌 실무를 할 수 있다고 하길래 끝난줄 알았더니 그냥 개발을 할줄 아는것과 이해하는 것은 다르다고..

 

주는 책을 읽어서 ppt로 정리하라고 함(이후 회사 교육자료가 됨.) 진짜 고역이었음. 책도 디자인패턴, 대용량데이터베이스 솔루션같은

 

그 당시 나로서는 진짜 머리깨지게 어려운 책들. 디자인패턴은 자바 를 좀 더 이해할 수 있었다는거 말고 딱히 쓸일없었지만 대용량데이터 베이스솔루션(이화식 저.)은 지금도 도움이 많이됨. 

 

신입들에게 추천함. DB가 물리적으로 어떻게 돌아가는지 이해할 수 있는게 아주 좋음. 


결합인덱스나 테이블 데이터들을 혹은 코드를 어떻게 전략적으로 가져가야 될지 이해하게 되었음.

 

사실 저는 아직도 책의 50%도 이해한거 같지는 않지만. 그정도로도 도움됨.

 

그 밖에도 별 이상한 책들도 많이 정리함. 자바랑 상관없는거. 컴구조쪽에서 괜찮았 던건 인사이드머신? 


맞나 기억이 가물해서 다른 컴구조 책에 비해서 쉽게 설명해주는게 좋았음. 

 

그리고 네트워크 쪽은 후니의 쉽게 쓴 시스코 네트워킹. 네트워크 지식이 별 필요없는 것 같지만 실무에서 은근히 도움될 때 많음. 

 

특히 IP같은 프로토콜에 대한 이해가..

 

자료구조 알고리즘 쪽에서는 '뇌를 자극하는 알고리즘' 이것도 알고리즘 책치고 이해도 잘되고 아주 쉽게 읽힘. 


이걸로 맛보고 알고리즘 전공서적을 보면 좋을 듯. 

 

"IT 이것도 모르면 하지 마라"라는 책도 읽어보면 좋아요.

 

그리고 이 책은 개발하는 데는 그닥 도움되지는 않지만 

 

제가 사수에게 입사 선물로 받은 책이고 내리갚음으로..또 신입들어오면 제가 선물로 주는 책인데요. 

 

신입분들은 읽어보면 좋아요. 

--------------------------------------

감명깊게 읽은 글이라 스크랩해두었습니다.


Scenario:학부시절 학생관리 프로그램을 만드는데 입력받는데 중간중간에 입력을 안받고 넘기는 경우가 생김


Solution:(아래)


간혹 


Scanner scan = new Scanner(System.in);

int i = scan.nextInt();        //1번코드

String s = scan.nextLine();  // 2 코드


이런 코드를 짤 때 첫번째 int 만 입력을 받고 그다음 nextLine() 부분을 Skip 하는 경우가 발생한다.


이는 nextInt() 에서 Enter 를 칠 때 발생하는 '개행문자'를 처리하지 않고 버퍼에 남기기 때문이다.


따라서 scanner 에 있는 개행문자 \r\n 을 비워주어야 하지만,


자바에는 Scanner 에는 flush 함수가 없다고 한다.


그렇다고 방법이 없는 것은 아닌데, 별로 맘에 들지 않는 임시방편으로 몇 가지가 있다.



1. 1번과 2번 코드 사이에 scan.nextLine() 을 집어넣어서 개행문자를 처리.


2. 1번과 2번 코드 사이에 scan.skip("[\\r\\n]+");  집어넣으면 개행문자 스킵


3. Scanner 객체를 입력받을때마다 만든다.. 

 

    Scanner scan1 = new Scanner(System.in);  

    Scanner scan2 = new Scanner(System.in);

    (자원의 낭비가 커서 비추)   

const란 const로 정의된 변수를 상수화하여, 그 값을 변경하지 못하게 하는 것이다.

변경하지 않아야 하는 변수를 수정하여, 난 에러는 찾기가 매우 힘들다. 이러한 변수사용시 그값이 변경되지 않아야 하는 곳에 사용하여, 그러한 에러를 컴파일시 확인이 가능하게 하게 한다.

 

#변수의 상수화

const [변수 타입] [변수명] =  초기화 값 ;  //선언시 초기화 값을 넣어야 된다. 초기화 값을 넣은 후 변경을 할 수 없다.

ex>

const int A = 12345;  //A를 상수화하여 12345값으로 상수화(고정)된다.

const float B = 123.45;  //B를 상수화하여 123.45값으로 상수화(고정)된다.

 

const [변수 타입] * [변수명];  //변수명이 가리키는 주소의 값을 변경할 수 없다.

ex>

const int * pA;

int a = 3;

pA = &a;   //pA에 a의 주소값을 넣는다.

*pA = 10;  //컴파일 에러 : pA가 가리키는 주소의 값이 상수화 되어 변경할 수 없다.

 

[변수 타입] * const [변수명] = 초기화 값;  //변수명이 가리키는 주소를 변경할 수 없다.

ex>

int a;

int * const pA = &a;

pA = &a;   //컴파일 에러 : pA가 가리키는 주소가 상수화되어 변경할 수 없다.

*pA = 10;  //pA가 가리키는 주소의 값을 변경한다.

 

const [변수 타입] * const [변수명] = 초기화 값;  //변수명이 가리키는 주소와 그주소의 값도 변경할 수 없다.

ex>

int a;

const int * const pA = &a;

pA = &a;   //컴파일 에러 : pA가 가리키는 주소가 상수화되어 변경할 수 없다.

*pA = 10;  //컴파일 에러 : pA가 가리키는 주소의 값이 상수화 되어 변경할 수 없다.

a = 3;  //이렇게 직접 값을 변경하는 수 밖에 없다.

 

#멤버함수의 상수화

[리턴타입] [함수명] (매개변수) const {함수내용...};  //해당 함수안에서는 클래스의 모든 멤버 변수는 상수화되어 값을 변경할 수 없고, 포인터 반환이 되지 않는다. 또한 멤버함수의 경우 같이 상수화된 함수만을 사용할 수 있다.

ex>

int a;  //멤버 변수

void FunctionA(Test * pTest) const;  //상수화된 멤버 함수

void FunctionB(int b) { b = 1; };  //일반 맴버 함수

void FunctionC(int c) const { c = 1; };  //상수화된 멤버 함수

 

void Test::FunctionA(Test * pTest) const

{

  int b = 1;  //내부에 선언한 변수의 값을 변경 할 수 있다.

  a = 1;  //컴파일 에러 : 멤버변수 값을 변경 할 수 없다.

  pTest->a = 1;  //클래스 포인터를 사용하여 멤버 변수의 값을 변경 할 수 있다. 그러나 이것은 바람직하지 않은 사용이다. 이렇게 사용할 바에는 그냥 일반함수로 만들어 사용하는 게 낮다.

  FunctionB(2);  //컴파일 에러 : 상수화가 안된 맴버함수를 사용할 수 없다.

  FunctionC(2);  //상수화된 멤버함수로 컴파일된다.

}

 

#const와 함수 오버로딩

const 사용에 따라 동일한 함수명과 동일한 매개변수를 가지고 있다하여도 함수오버로딩이 가능하다.

ex>

void FunctionA(void);  //일반 함수

void FunctionA(void) const;  //const를 사용한 함수오버로딩된 상수 함수

 

void FunctionB(void)

{

  FunctionA();  //일반 함수가 실행된다. 상수함수도 실행할 수 있지만 우선순위가 일반함수가 더 높다.

}

void FunctionC(void) const

{

  FunctionA();  //상수 함수가 실행된다. 오직 상수함수만을 실행 할 수 있다.

}



#include <iostream>

#include <list>

using namespace std;


bool Predicate(int n){

    return n >= 30;

}


int main(){


    list<int> lt;


    lt.push_back(10);

    lt.push_back(20);

    lt.push_back(30);

    lt.push_back(40);

    lt.push_back(50);


    list<int>::iterator iter;

    for (iter = lt.begin(); iter != lt.end(); ++iter){

        cout << *iter << ' ';

    }

    cout << endl;


    iter = lt.begin();

    iter++;

    iter++;


    // erase 삭제

    list<int>::iterator iter2 = lt.erase(iter);

    for (iter = lt.begin(); iter != lt.end(); ++iter){

        cout << *iter << ' ';

    }

    cout << endl;

    cout << "iter2 : " << *iter2 << endl;


    lt.push_back(10);

    lt.push_back(10);


    for (iter = lt.begin(); iter != lt.end(); ++iter){

        cout << *iter << ' ';

    }

    cout << endl;


    // 리스트에서 원소 10 제거

    lt.remove(10);


    for (iter = lt.begin(); iter != lt.end(); ++iter){

        cout << *iter << ' ';

    }

    cout << endl;



    // Predicate 함수에 해당하는 원소 제거 (30보다 크다)

    lt.remove_if(Predicate);


    for (iter = lt.begin(); iter != lt.end(); ++iter){

        cout << *iter << ' ';

    }

    cout << endl;


    return 0;

}

Scenario:신입시절 자꾸 엔터랑 esc누르면 프로그램이 꺼져서 암이 걸릴뻔함. 간단하게 오버라이딩으로 해결 할 수 있었음.


해당 클래스 클릭한뒤

PreTranslateMessage 함수 생성.



BOOL LensSpec::PreTranslateMessage(MSG* pMsg)

{

// 아래의 내용을 추가

 if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) return TRUE;


 return CDialog::PreTranslateMessage(pMsg);

}


'To be Developer > C,C++' 카테고리의 다른 글

[C++]상수화 constant  (0) 2017.01.18
[C++]List iter 사용법  (0) 2017.01.18
[MFC] MFC에서 디버깅시 콘솔창 띄우기  (0) 2017.01.18


scenario: 회사에서 mfc 프로그램을 만들던중 몇가지 기능을 확인하고자 system에 print 하고싶었다. 그래서 콘솔창을 띄우고싶엇다


solution:


//stdafx.h


#ifdef _DEBUG

#pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console")

#endif


'To be Developer > C,C++' 카테고리의 다른 글

[C++]상수화 constant  (0) 2017.01.18
[C++]List iter 사용법  (0) 2017.01.18
[MFC]엔터 또는 ESC입력시 프로그램 꺼짐 방지하는법  (0) 2017.01.18

scenario: 이제 본격적으로 웹으로 프로젝트를 시작하려니 참고할 소스도 많아지고, 기능별로 브랜치를 만들어야 될것 같았다.

그래서 브랜치를 써본적이 없지만 하나하나 브랜치를 추가하고 변경하고자 준비를 시작함.


solution: 아래



Bash 0.60 KB
  1. //리모트 저장소 보기
  2. git remote show
  3. origin
  4.  
  5. //리모트 저장소 이름바꾸기
  6. git remote rename origin remote/projects
  7.  
  8. //전체 브랜치 목록보기
  9. git branch -a
  10. * dev-UsingMyBatis
  11.   master
  12.   remotes/origin/dev-UsingMyBatis
  13.   remotes/origin/master
  14.  
  15. //현재 브랜치는 (dev-UsingMyBatis) 이런식으로 써져있다.
  16. //그리고 전체목록을 보면 별표로 되있는게 현재 브랜치이다.
  17. //다른 브랜치로 전환
  18. git checkout [branch name]                              
  19.  
  20.  
  21. //리모트 저장소에 브랜치 추가
  22. git push origin dev-UsingMyBatis


Scenario: Git hub는 오픈기반이라서 내가 의도하지 않아도 Repo를 공개해야하고 검색이 되는 것이다. 그래서 나는 BitBuckets으로 옮기고 난뒤 remote repo의 내용을 삭제하고 싶엇는데, repo를 단순히 삭제하면 Github위키에서는 검색이 된다는 이야기가 있어서, 저장소의 내용들을 깨끗히 삭제하고싶었다.


Solution:(아래)




git 기본 로컬 폴더 등록부터 


gitHub,bitbucket  같은 리모트 서버의 Repository와 연동까지

 

한 2시간 삽질하면서 해본것같다.


  1. /************* Github 내에 소스코드 삭제방법*********************/
  2. /*문제점: 깃허브에 저장된 폴더나 소스를 삭제할 방법을 몰라**/
  3. /*폴더를삭제하고 commit 했더니 remote와 mach가 안되서 오류가남******/
  4. /*새롭게 로컬에 똑같은 이름폴더를만들고 Merge를 하니까 해결됨****/
  5. /****************************************************************/
  6.  
  7.  
  8. /**************** github 다운받고 초기설정 방법******************/
  9.  
  10. Administrator**** MINGW64 ~/gittemp (master)
  11. git config --global user.name "*******"
  12.  
  13. Administrator**** MINGW64 ~/gittemp (master)
  14. git config --global user.email "******"
  15.  
  16. //글로벌네임 리네임 방법
  17. Administrator**** MINGW64 ~/gittemp (master)
  18. git config --global user.name *******
  19.  
  20. Administrator**** MINGW64 ~/gittemp (master)
  21. git config --list
  22. core.symlinks=false
  23. core.autocrlf=true
  24. core.fscache=true
  25. color.diff=auto
  26. color.status=auto
  27. color.branch=auto
  28. color.interactive=true
  29. help.format=html
  30. http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
  31. diff.astextplain.textconv=astextplain
  32. rebase.autosquash=true
  33. user.name=*****
  34. user.email=*********
  35.  
  36. Administrator**** MINGW64 ~
  37. mkdir gittemp
  38.  
  39. Administrator**** MINGW64 ~
  40. cd gittemp
  41.  
  42. Administrator**** MINGW64 ~/gittemp
  43. git init
  44. Initialized empty Git repository in C:/Users/Administrator/gittemp/.git/
  45.  
  46. Administrator**** MINGW64 ~/gittemp (master)
  47. touch Readme.txt
  48.  
  49. Administrator**** MINGW64 ~/gittemp (master)
  50. git status
  51. On branch master
  52.  
  53. Initial commit
  54.  
  55. Untracked files:
  56.   (use "git add <file>..." to include in what will be committed)
  57.  
  58.         Readme.txt
  59.  
  60. nothing added to commit but untracked files present (use "git add" to track)
  61.  
  62. Administrator**** MINGW64 ~/gittemp (master)
  63. git add Readme.txt
  64.  
  65. Administrator**** MINGW64 ~/gittemp (master)
  66. git commit -m "Add readme.txt"
  67.  
  68. Administrator**** MINGW64 ~/gittemp (master)
  69. git remote add origin https://github.com/****/projects.git
  70.  
  71. Administrator**** MINGW64 ~/gittemp (master)
  72. git remote -v
  73. origin  https://github.com/****/projects.git (fetch)
  74. origin  https://github.com/****/projects.git (push)
  75.  
  76. Administrator**** MINGW64 ~/gittemp (master)
  77. git remote show
  78. origin
  79.  
  80.  
  81.  
  82.  
  83. /**************************여기서부터 GitHub내 파일 삭제 완료******************************/
  84.  
  85.  
  86.  
  87. Administrator**** MINGW64 ~/gittemp (master)
  88. git push -u origin master
  89. Username for 'https://github.com': ****@gmail.com
  90. To https://github.com/****/projects.git
  91.  ! [rejected]        master -> master (non-fast-forward)
  92. error: failed to push some refs to 'https://github.com/****/projects.git'
  93. hint: Updates were rejected because the tip of your current branch is behind
  94. hint: its remote counterpart. Integrate the remote changes (e.g.
  95. hint: 'git pull ...') before pushing again.
  96. hint: See the 'Note about fast-forwards' in 'git push --help' for details.
  97.  
  98.  
  99. Administrator**** MINGW64 ~/gittemp (master)
  100. git push origin +some_branch
  101. error: src refspec some_branch does not match any.
  102. error: failed to push some refs to 'https://github.com/****/projects.git'
  103.  
  104. Administrator**** MINGW64 ~/gittemp (master)
  105. git push origin +master
  106. Username for 'https://github.com': ****@gmail.com
  107. Counting objects: 5, done.
  108. Delta compression using up to 4 threads.
  109. Compressing objects: 100% (3/3), done.
  110. Writing objects: 100% (5/5)479 bytes | 0 bytes/s, done.
  111. Total 5 (delta 1), reused 0 (delta 0)
  112. remote: Resolving deltas: 100% (1/1), done.
  113. To https://github.com/****/projects.git
  114.  + 4ebba1a...b180f2e master -> master (forced update)
  115.  



소스코드 공유시 틀 사이트는 : http://pastebin.com/index.php

여기 좋은것 같음



Scenario: Git remote server를 사용하다가 문득 이런 의문이 들었다.


"소스관리시 하나의 Repository 내에 여러프로젝트를 저장하는 것일까? 아니면 여러개의 Repo를 만들까?"


초보적인 질문 일수있으나, 형상관리에 익숙하지 않아 궁금하였다.



Solutions:

okk* 사이트에서 이런 답변을 받을 수 있었다.



dgkim  991
19시간 전

github 사이트에서 repository를 제거할 수 있습니다.

하나의 제품의 여러 모듈로 구성되어 있고, 하나의 레포지토리여야만 유리한 점이 있는 것에 아니라면,

프로젝트 모듈별로 repository를 만드는 것으로 사용해 보십시오.

(일반 웹이라면, web project 하나가 repo하나, 서버+앱이라면, 각각 repo)
-------------------------------------------------------------------------------------------


이렇게 관리하는 거였군, 감사합니다 okk* dgkim



Scenario:Html css를 공부하던중 Eclipse 에서 Open with broswer를 하나하나 클릭하는게 너무 귀찮았다.


Solution:단축키 설정을 통해 해결하였다.






1.Window->preferences->General->Web Browser로 간다.

2. 원하는 브라우저를 선택하시고 Edit를 누르시면 Location에 브라우저가 설치된 주소가 뜬다. 주소를 Ctrl+c로 복사해 놓자.





3. 좌측 그림의 아이콘을 클릭하고 목록 중 Exteranl~~ 을 누른다


4. 다음과 같은 창이 뜨면 처음에는 Program 목록에 아무것도 있지 않으나 더블클릭하시면 새로운 요소가 생성된다.

5.생성된 요소에 원하는 Name을 넣고 Location에 앞서 2번 설명에서 복사해 놓으신 주소를 가져다 붙인다.

6. Arguments 내에 ${selected_resource_loc} 을 다음과 같이 입력하고 Apply를 누르면 준비 완료





7. 이제 단축키를 만들어주자. window->preferences->General->Keys로 들어가시면 단축키를 재설정 할수 있다.

8. 단축키 Command 중 Runs the last launched external Tool을 찾고 Binding에 원하는 단축키를 입력하면 끝이다.
(*주의 할점:단축키가 안겹치게 창조적으로 만들자)

(*패키지 폴더경로가 한글이면 제대로 실행이 안되니 주의할것)

+ Recent posts